diff --git a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt b/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt index 76a9189..a6b1ad3 100644 --- a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt +++ b/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt @@ -16,7 +16,6 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat import androidx.lifecycle.lifecycleScope @@ -36,6 +35,7 @@ import me.zobrist.tichucounter.domain.* import me.zobrist.tichucounter.repository.GameRepository import me.zobrist.tichucounter.ui.AppTheme import me.zobrist.tichucounter.ui.MainViewModel +import me.zobrist.tichucounter.ui.TopBar import me.zobrist.tichucounter.ui.counter.* import me.zobrist.tichucounter.ui.history.HistoryList import me.zobrist.tichucounter.ui.history.HistoryViewModel @@ -120,6 +120,11 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { fabAction: () -> Unit ) { + var topBarTitle by remember { mutableStateOf("") } + var topBarIcon by remember { mutableStateOf(Icons.Filled.Menu) } + var topBarActions by remember { mutableStateOf(emptyList()) } + var topBarNavigationAction by remember { mutableStateOf(NavigationAction {}) } + Scaffold( floatingActionButton = { if (showFab) { @@ -131,10 +136,10 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { }, topBar = { TopBar( - mainViewModel.topBarTitle, - mainViewModel.topBarIcon, - { mainViewModel.onNavigateClicked() }, - mainViewModel.topBarActions + topBarTitle, + topBarIcon, + { topBarNavigationAction.action() }, + topBarActions ) }) { @@ -145,7 +150,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { ) { composable("counter") { Counter(counterViewModel) - mainViewModel.topBarActions = (listOf( + topBarActions = (listOf( TopBarAction( Icons.Outlined.Undo, mainViewModel.isUndoActionActive @@ -156,9 +161,9 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { ) { mainViewModel.redoLastRound() } )) - mainViewModel.topBarIcon = Icons.Outlined.Menu - mainViewModel.topBarTitle = stringResource(R.string.app_name) - mainViewModel.topBarNavigationAction = + topBarIcon = Icons.Outlined.Menu + topBarTitle = stringResource(R.string.app_name) + topBarNavigationAction = NavigationAction { scope.launch { drawerState.open() } } } composable("history") { @@ -171,7 +176,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { } openDialog = false }) { navController.navigate("counter") } - mainViewModel.topBarActions = listOf( + topBarActions = listOf( TopBarAction( Icons.Outlined.DeleteForever, true @@ -179,59 +184,23 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener { openDialog = true } ) - mainViewModel.topBarIcon = Icons.Outlined.Menu - mainViewModel.topBarTitle = stringResource(R.string.menu_history) - mainViewModel.topBarNavigationAction = + topBarIcon = Icons.Outlined.Menu + topBarTitle = stringResource(R.string.menu_history) + topBarNavigationAction = NavigationAction { scope.launch { drawerState.open() } } } composable("settings") { SettingsView(settingsViewModel) - mainViewModel.topBarActions = emptyList() - mainViewModel.topBarIcon = Icons.Outlined.Menu - mainViewModel.topBarTitle = stringResource(R.string.menu_settings) - mainViewModel.topBarNavigationAction = + topBarActions = emptyList() + topBarIcon = Icons.Outlined.Menu + topBarTitle = stringResource(R.string.menu_settings) + topBarNavigationAction = NavigationAction { scope.launch { drawerState.open() } } } } } } - @OptIn(ExperimentalMaterial3Api::class) - @Composable - private fun TopBar( - title: String, - icon: ImageVector, - navigateAction: () -> Unit, - actions: List - ) { - TopAppBar( - title = { - Text( - title, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - }, - navigationIcon = { - IconButton(onClick = { navigateAction() }) { - Icon( - imageVector = icon, - contentDescription = "Localized description" - ) - } - }, - actions = { - actions.forEach { - IconButton(onClick = { it.action() }, enabled = it.isActive) { - Icon( - imageVector = it.imageVector, - contentDescription = null, - ) - } - } - } - ) - } @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt b/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt index 96af3f6..e70a2de 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt @@ -2,7 +2,6 @@ package me.zobrist.tichucounter.data.entity import androidx.room.Entity import androidx.room.PrimaryKey -import me.zobrist.tichucounter.data.entity.IEntity import java.util.* @Entity diff --git a/app/src/main/java/me/zobrist/tichucounter/data/entity/Round.kt b/app/src/main/java/me/zobrist/tichucounter/data/entity/Round.kt index 036306b..2e21660 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/entity/Round.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/entity/Round.kt @@ -2,7 +2,6 @@ package me.zobrist.tichucounter.data.entity import androidx.room.Entity import androidx.room.PrimaryKey -import me.zobrist.tichucounter.data.entity.IEntity @Entity data class Round( diff --git a/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt b/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt index 3e76669..e52893c 100644 --- a/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt +++ b/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt @@ -6,7 +6,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import me.zobrist.tichucounter.data.* +import me.zobrist.tichucounter.data.GameDao +import me.zobrist.tichucounter.data.GameWithScores +import me.zobrist.tichucounter.data.RoundDao import me.zobrist.tichucounter.data.entity.Game import me.zobrist.tichucounter.data.entity.Round import java.util.* diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/MainViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/ui/MainViewModel.kt index 0f88146..14a5001 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/MainViewModel.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/MainViewModel.kt @@ -1,7 +1,5 @@ package me.zobrist.tichucounter.ui -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Menu import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf @@ -11,8 +9,6 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import me.zobrist.tichucounter.data.entity.Round -import me.zobrist.tichucounter.domain.NavigationAction -import me.zobrist.tichucounter.domain.TopBarAction import me.zobrist.tichucounter.repository.GameRepository import javax.inject.Inject @@ -24,11 +20,7 @@ class MainViewModel @Inject constructor( private var redoRounds = mutableStateListOf() private var expectedRoundCount = 0 - var topBarTitle by mutableStateOf("") - var topBarActions by mutableStateOf(emptyList()) - var topBarIcon by mutableStateOf(Icons.Filled.Menu) var isUndoActionActive by mutableStateOf(false) - var topBarNavigationAction by mutableStateOf(NavigationAction {}) val isRedoActionActive: Boolean get() = redoRounds.isNotEmpty() @@ -51,11 +43,6 @@ class MainViewModel @Inject constructor( } } - - fun onNavigateClicked() { - topBarNavigationAction.action() - } - fun undoLastRound() { viewModelScope.launch { val round = gameRepository.getLastRound() diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/TopBar.kt b/app/src/main/java/me/zobrist/tichucounter/ui/TopBar.kt new file mode 100644 index 0000000..2a8a473 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/ui/TopBar.kt @@ -0,0 +1,44 @@ +package me.zobrist.tichucounter.ui + +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.style.TextOverflow +import me.zobrist.tichucounter.domain.TopBarAction + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TopBar( + title: String, + icon: ImageVector, + navigateAction: () -> Unit, + actions: List +) { + TopAppBar( + title = { + Text( + title, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + }, + navigationIcon = { + IconButton(onClick = { navigateAction() }) { + Icon( + imageVector = icon, + contentDescription = "Localized description" + ) + } + }, + actions = { + actions.forEach { + IconButton(onClick = { it.action() }, enabled = it.isActive) { + Icon( + imageVector = it.imageVector, + contentDescription = null, + ) + } + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt index f059554..14dc030 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt @@ -15,8 +15,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import me.zobrist.tichucounter.R -import me.zobrist.tichucounter.data.entity.Game import me.zobrist.tichucounter.data.GameWithScores +import me.zobrist.tichucounter.data.entity.Game import me.zobrist.tichucounter.data.entity.Round import me.zobrist.tichucounter.domain.getTotalPoints import java.text.DateFormat