Fixed #13 unified outer padding on all components.

Fixed not setting appTitle when navigating via FAB.
Unified "currentScreen" / "appTitle" behaviour.
This commit is contained in:
sockenklaus
2022-07-23 15:24:20 +02:00
parent 5ea0a4a921
commit ebbee65330
6 changed files with 55 additions and 85 deletions

View File

@@ -3,7 +3,6 @@ package com.sockenklaus.batterytracker.ui
import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -24,10 +23,10 @@ import com.sockenklaus.batterytracker.ui.models.MainViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
object Routes { object Routes {
const val HOME = "home" const val HOME = "Home"
const val ADD_BATTERY = "add_battery" const val ADD_BATTERY = "Add Battery"
const val ADD_CHARGE = "add_charge" const val ADD_CHARGE = "Add Charge"
const val BATTERY_DETAILS = "battery_details" const val BATTERY_DETAILS = "Battery Details"
} }
@Composable @Composable
@@ -44,16 +43,17 @@ fun BatteryTracker() {
Routes.BATTERY_DETAILS -> DetailsTopAppBar( Routes.BATTERY_DETAILS -> DetailsTopAppBar(
navController = state.navController, navController = state.navController,
changeCurrentScreen = { state.currentScreen = it } drawerState = state.scaffoldState.drawerState,
appTitle = state.currentScreen
) )
else -> MainTopAppBar( else -> MainTopAppBar(
drawerState = state.scaffoldState.drawerState, drawerState = state.scaffoldState.drawerState,
appTitle = state.appTitle appTitle = state.currentScreen,
) )
} }
} }
) { innerPadding -> ) { _ ->
ModalDrawer( ModalDrawer(
drawerState = state.scaffoldState.drawerState, drawerState = state.scaffoldState.drawerState,
drawerContent = { drawerContent = {
@@ -82,19 +82,27 @@ fun BatteryTracker() {
NavHost( NavHost(
navController = state.navController, navController = state.navController,
startDestination = Routes.HOME, startDestination = Routes.HOME,
modifier = Modifier.padding(innerPadding)) )
{ {
composable(Routes.HOME) { Home(state.navController, state) } composable(Routes.HOME) {
composable(Routes.ADD_CHARGE) { AddCharge(state.navController) } state.currentScreen = Routes.HOME
composable(Routes.ADD_BATTERY) { AddBattery(state.navController) } Home(state.navController)
}
composable(Routes.ADD_CHARGE) {
state.currentScreen = Routes.ADD_CHARGE
AddCharge(state.navController)
}
composable(Routes.ADD_BATTERY) {
state.currentScreen = Routes.ADD_BATTERY
AddBattery(state.navController)
}
composable( composable(
route = "${Routes.BATTERY_DETAILS}/{batteryId}", route = "${Routes.BATTERY_DETAILS}/{batteryId}",
arguments = listOf(navArgument("batteryId"){ type = NavType.IntType }) arguments = listOf(navArgument("batteryId"){ type = NavType.IntType })
) { navBackStackEntry -> ) { navBackStackEntry ->
state.currentScreen = Routes.BATTERY_DETAILS
BatteryDetails( BatteryDetails(
navController = state.navController,
batteryId = navBackStackEntry.arguments?.getInt("batteryId"), batteryId = navBackStackEntry.arguments?.getInt("batteryId"),
appState = state
) )
} }
} }
@@ -162,9 +170,7 @@ fun NavListItem(
modifier = Modifier modifier = Modifier
.clickable { .clickable {
scope.launch { scope.launch {
state.appTitle = text
state.navController.navigate(route) state.navController.navigate(route)
state.currentScreen = route
state.scaffoldState.drawerState.close() state.scaffoldState.drawerState.close()
} }
} }

View File

@@ -15,6 +15,7 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.sockenklaus.batterytracker.R import com.sockenklaus.batterytracker.R
import com.sockenklaus.batterytracker.ui.Routes
import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix
import com.sockenklaus.batterytracker.ui.models.AddBatteryViewModel import com.sockenklaus.batterytracker.ui.models.AddBatteryViewModel
import com.sockenklaus.batterytracker.util.validateDecimal import com.sockenklaus.batterytracker.util.validateDecimal
@@ -24,7 +25,7 @@ fun AddBattery(navController: NavController){
val model: AddBatteryViewModel = viewModel() val model: AddBatteryViewModel = viewModel()
val batteries by model.batteries.observeAsState(emptyList()) val batteries by model.batteries.observeAsState(emptyList())
val outerPadding = 24.dp val outerPadding = 16.dp
val innerPadding = 16.dp val innerPadding = 16.dp
Column( Column(
@@ -68,7 +69,7 @@ fun AddBattery(navController: NavController){
if(model.batteryName.isBlank()) model.batteryHasError = true if(model.batteryName.isBlank()) model.batteryHasError = true
if(!model.batteryHasError && model.saveBattery(model.batteryName, model.declaredCapacity)){ if(!model.batteryHasError && model.saveBattery(model.batteryName, model.declaredCapacity)){
navController.navigate("home") navController.navigate(Routes.HOME)
} }
}, },
icon = { Icon(Icons.Default.Save, "Icon Save") }, icon = { Icon(Icons.Default.Save, "Icon Save") },

View File

@@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.sockenklaus.batterytracker.R import com.sockenklaus.batterytracker.R
import com.sockenklaus.batterytracker.ui.Routes
import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix
import com.sockenklaus.batterytracker.ui.models.AddChargeViewModel import com.sockenklaus.batterytracker.ui.models.AddChargeViewModel
import com.sockenklaus.batterytracker.ui.theme.Gray500 import com.sockenklaus.batterytracker.ui.theme.Gray500
@@ -34,7 +35,7 @@ import java.util.*
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterialApi::class)
@Composable @Composable
fun AddCharge(navController: NavController){ fun AddCharge(navController: NavController){
val outerPadding = 24.dp val outerPadding = 16.dp
val innerPadding = 16.dp val innerPadding = 16.dp
var bIdExpanded by remember { mutableStateOf(false)} var bIdExpanded by remember { mutableStateOf(false)}
@@ -137,7 +138,7 @@ fun AddCharge(navController: NavController){
} }
if(!model.batteryHasError && !model.chargeHasError && model.saveCharge(batteries, model.batteryId.text, model.charge, model.date)){ if(!model.batteryHasError && !model.chargeHasError && model.saveCharge(batteries, model.batteryId.text, model.charge, model.date)){
navController.navigate("home") navController.navigate(Routes.HOME)
} }
}, },
icon = { Icon(Icons.Default.Save, "Icon Save") }, icon = { Icon(Icons.Default.Save, "Icon Save") },

View File

@@ -1,49 +1,46 @@
package com.sockenklaus.batterytracker.ui.composables package com.sockenklaus.batterytracker.ui.composables
import androidx.activity.OnBackPressedCallback import androidx.compose.foundation.layout.Column
import androidx.activity.OnBackPressedDispatcher import androidx.compose.foundation.layout.padding
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.material.*
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import com.sockenklaus.batterytracker.ui.AppBarTitle
import com.sockenklaus.batterytracker.ui.Routes import com.sockenklaus.batterytracker.ui.Routes
import com.sockenklaus.batterytracker.ui.models.MainViewModel
@Composable @Composable
fun BatteryDetails( fun BatteryDetails(
navController: NavController, batteryId: Int? = null
batteryId: Int? = null,
appState: MainViewModel
){ ){
var onBack = { Column(
val backTarget = navController.previousBackStackEntry?.destination?.route ?: Routes.HOME modifier = Modifier.padding(16.dp)
appState.currentScreen = backTarget ){
navController.navigate(backTarget) Text(batteryId.toString())
} }
BackPressHandler(onBackPressed = onBack)
Text(batteryId.toString())
} }
@OptIn(ExperimentalMaterialApi::class)
@Composable @Composable
fun DetailsTopAppBar( fun DetailsTopAppBar(
navController: NavController, navController: NavController,
changeCurrentScreen: (String) -> Unit appTitle: String,
drawerState: DrawerState
){ ){
TopAppBar( TopAppBar(
title = { Text("Details") }, title = {
AppBarTitle(
drawerTarget = drawerState.targetValue,
appTitle = appTitle
)
},
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = { onClick = {
navController.navigate("home") navController.navigate(Routes.HOME)
changeCurrentScreen(Routes.HOME)
} }
) { ) {
Icon(Icons.Default.ArrowBack, null) Icon(Icons.Default.ArrowBack, null)
@@ -51,27 +48,3 @@ fun DetailsTopAppBar(
} }
) )
} }
@Composable
fun BackPressHandler(
backPressedDispatcher: OnBackPressedDispatcher? = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher,
onBackPressed: () -> Unit
) {
val currentOnBackPressed by rememberUpdatedState(newValue = onBackPressed)
val backCallback = remember {
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
currentOnBackPressed()
}
}
}
DisposableEffect(key1 = backPressedDispatcher) {
backPressedDispatcher?.addCallback(backCallback)
onDispose {
backCallback.remove()
}
}
}

View File

@@ -1,6 +1,5 @@
package com.sockenklaus.batterytracker.ui.composables package com.sockenklaus.batterytracker.ui.composables
import android.telecom.Call
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -9,7 +8,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -20,21 +18,17 @@ import com.sockenklaus.batterytracker.room.entities.Battery
import com.sockenklaus.batterytracker.ui.Routes import com.sockenklaus.batterytracker.ui.Routes
import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix import com.sockenklaus.batterytracker.ui.composables.util.MyOutlinedTextFieldWithSuffix
import com.sockenklaus.batterytracker.ui.models.HomeViewModel import com.sockenklaus.batterytracker.ui.models.HomeViewModel
import com.sockenklaus.batterytracker.ui.models.MainViewModel
import java.lang.reflect.GenericDeclaration
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterialApi::class)
@Composable @Composable
fun Home( fun Home(
navController: NavController, navController: NavController
appState: MainViewModel
) { ) {
val model: HomeViewModel = viewModel() val model: HomeViewModel = viewModel()
val batteries by model.batteries.observeAsState(emptyList<Battery>()) val batteries by model.batteries.observeAsState(emptyList<Battery>())
var filterText by remember { mutableStateOf("")} var filterText by remember { mutableStateOf("")}
val filteredList = batteries.filter { it.name.contains(filterText, ignoreCase = true) } val filteredList = batteries.filter { it.name.contains(filterText, ignoreCase = true) }
val modHorizontalPadding = Modifier.padding(horizontal = 16.dp)
Column { Column {
MyOutlinedTextFieldWithSuffix( MyOutlinedTextFieldWithSuffix(
@@ -42,14 +36,14 @@ fun Home(
onValueChange = { filterText = it }, onValueChange = { filterText = it },
labelId = R.string.hint_filter_batteries, labelId = R.string.hint_filter_batteries,
modifier = Modifier.padding( modifier = Modifier.padding(
top = 16.dp,
start = 16.dp, start = 16.dp,
end = 16.dp, end = 16.dp
top = 16.dp
) )
) )
LazyColumn( LazyColumn(
state = LazyListState() state = LazyListState(),
) { ) {
items(filteredList){ battery -> items(filteredList){ battery ->
ListItem( ListItem(
@@ -65,10 +59,9 @@ fun Home(
}, },
modifier = Modifier.clickable { modifier = Modifier.clickable {
navController.navigate("${Routes.BATTERY_DETAILS}/${battery.id}") navController.navigate("${Routes.BATTERY_DETAILS}/${battery.id}")
appState.currentScreen = Routes.BATTERY_DETAILS
} }
) )
Divider(modHorizontalPadding) Divider(Modifier.padding(horizontal = 16.dp))
} }
} }
} }

View File

@@ -2,17 +2,13 @@ package com.sockenklaus.batterytracker.ui.models
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.graphics.BlendMode.Companion.Screen
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.sockenklaus.batterytracker.ui.AppBarTitle
import com.sockenklaus.batterytracker.ui.Routes import com.sockenklaus.batterytracker.ui.Routes
import com.sockenklaus.batterytracker.ui.ToggleDrawerButton
class MainViewModel : ViewModel() { class MainViewModel : ViewModel() {
var appTitle by mutableStateOf("Home")
var currentScreen by mutableStateOf(Routes.HOME) var currentScreen by mutableStateOf(Routes.HOME)
lateinit var navController: NavHostController lateinit var navController: NavHostController