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:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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") },
|
||||||
|
|||||||
@@ -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") },
|
||||||
|
|||||||
@@ -1,77 +1,50 @@
|
|||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
@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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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,18 +36,18 @@ 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(
|
||||||
text = {
|
text = {
|
||||||
ListPrimaryText(battery)
|
ListPrimaryText(battery)
|
||||||
},
|
},
|
||||||
secondaryText = {
|
secondaryText = {
|
||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user