Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 2 additions & 29 deletions app/src/main/java/com/example/templei/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.templei.ui.app.TempleIApp
import com.example.templei.ui.theme.TempleITheme

class MainActivity : ComponentActivity() {
Expand All @@ -19,29 +13,8 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
TempleITheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
}
TempleIApp()
}
}
}
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
TempleITheme {
Greeting("Android")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.templei.feature.camera

/**
* Placeholder for future camera capture pipeline.
*/
object CameraFeature
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.templei.feature.export

/**
* Placeholder for future export pipeline.
*/
object ExportFeature
15 changes: 15 additions & 0 deletions app/src/main/java/com/example/templei/ui/app/TempleIApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.templei.ui.app

import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.example.templei.ui.screens.home.HomeScreen

@Composable
fun TempleIApp() {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
HomeScreen(modifier = Modifier.padding(innerPadding))
}
}
68 changes: 68 additions & 0 deletions app/src/main/java/com/example/templei/ui/components/PulseButton.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.example.templei.ui.components

import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.RepeatMode
import androidx.compose.animation.core.animateFloat
import androidx.compose.animation.core.infiniteRepeatable
import androidx.compose.animation.core.rememberInfiniteTransition
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.templei.ui.theme.TempleITheme

@Composable
fun PulseButton(
isFlashing: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
val transition = rememberInfiniteTransition(label = "pulseTransition")
val pulseScale = transition.animateFloat(
initialValue = 1f,
targetValue = if (isFlashing) 1.08f else 1f,
animationSpec = infiniteRepeatable(
animation = tween(550),
repeatMode = RepeatMode.Reverse
),
label = "pulseScale"
)

val containerColor = animateColorAsState(
targetValue = if (isFlashing) {
MaterialTheme.colorScheme.primary
} else {
MaterialTheme.colorScheme.secondaryContainer
},
label = "pulseColor"
)

Button(
onClick = onClick,
modifier = modifier
.defaultMinSize(minWidth = 180.dp)
.graphicsLayer {
val animatedScale = if (isFlashing) pulseScale.value else 1f
scaleX = animatedScale
scaleY = animatedScale
},
colors = ButtonDefaults.buttonColors(containerColor = containerColor.value)
) {
Text(if (isFlashing) "Stop Flash" else "Start Flash")
}
}

@Preview(showBackground = true)
@Composable
private fun PulseButtonPreview() {
TempleITheme {
PulseButton(isFlashing = true, onClick = {})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.example.templei.ui.components

import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material3.AssistChip
import androidx.compose.material3.AssistChipDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.templei.ui.theme.TempleITheme

@Composable
fun UiPaletteBar(
items: List<String>,
onItemClick: (String) -> Unit,
modifier: Modifier = Modifier
) {
Row(
modifier = modifier
.fillMaxWidth()
.horizontalScroll(rememberScrollState()),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items.forEach { item ->
AssistChip(
onClick = { onItemClick(item) },
label = { Text(text = item) },
colors = AssistChipDefaults.assistChipColors(
labelColor = MaterialTheme.colorScheme.onSurface
)
)
}
}
}

@Preview(showBackground = true)
@Composable
private fun UiPaletteBarPreview() {
TempleITheme {
UiPaletteBar(
items = listOf("Button", "Text", "Card", "Image"),
onItemClick = {},
modifier = Modifier.padding(16.dp)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.templei.ui.navigation

/**
* Placeholder for app navigation wiring once a second destination is introduced.
*/
object NavGraph
5 changes: 5 additions & 0 deletions app/src/main/java/com/example/templei/ui/navigation/Routes.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.templei.ui.navigation

object Routes {
const val HOME = "home"
}
108 changes: 108 additions & 0 deletions app/src/main/java/com/example/templei/ui/screens/home/HomeScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.example.templei.ui.screens.home

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.templei.ui.components.PulseButton
import com.example.templei.ui.components.UiPaletteBar
import com.example.templei.ui.state.HomeEvent
import com.example.templei.ui.state.HomeUiState
import com.example.templei.ui.theme.TempleITheme

private val PaletteItems = listOf("Button", "Text", "Card", "Image", "Row", "Column")

@Composable
fun HomeScreen(modifier: Modifier = Modifier) {
var uiState by remember { mutableStateOf(HomeUiState()) }
var selectedPaletteItem by remember { mutableStateOf("Button") }

HomeScreen(
uiState = uiState,
selectedPaletteItem = selectedPaletteItem,
onPaletteItemSelected = { selectedPaletteItem = it },
onEvent = { event ->
when (event) {
HomeEvent.PulsePressed -> {
val isFlashing = !uiState.isFlashing
uiState = uiState.copy(
isFlashing = isFlashing,
statusText = if (isFlashing) "Flashing" else "Ready"
)
}
}
},
modifier = modifier
)
}

@Composable
fun HomeScreen(
uiState: HomeUiState,
selectedPaletteItem: String,
onPaletteItemSelected: (String) -> Unit,
onEvent: (HomeEvent) -> Unit,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "UI Palette",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.align(Alignment.Start)
)
UiPaletteBar(
items = PaletteItems,
onItemClick = onPaletteItemSelected,
modifier = Modifier.padding(top = 8.dp, bottom = 16.dp)
)
Text(
text = "Selected: $selectedPaletteItem",
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.align(Alignment.Start)
)
Text(
text = "TempleI",
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.padding(top = 24.dp)
)
Text(
text = uiState.statusText,
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.padding(top = 8.dp, bottom = 24.dp)
)
PulseButton(
isFlashing = uiState.isFlashing,
onClick = { onEvent(HomeEvent.PulsePressed) }
)
}
}

@Preview(showBackground = true)
@Composable
private fun HomeScreenPreview() {
TempleITheme {
HomeScreen(
uiState = HomeUiState(isFlashing = true, statusText = "Flashing"),
selectedPaletteItem = "Button",
onPaletteItemSelected = {},
onEvent = {}
)
}
}
5 changes: 5 additions & 0 deletions app/src/main/java/com/example/templei/ui/state/HomeEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.templei.ui.state

sealed interface HomeEvent {
data object PulsePressed : HomeEvent
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/example/templei/ui/state/HomeUiState.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.templei.ui.state

data class HomeUiState(
val isFlashing: Boolean = false,
val statusText: String = "Ready"
)
Empty file modified gradlew
100644 → 100755
Empty file.