From dde95a1c6b271117f0f70e6b7f2370e901508028 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 8 May 2023 14:15:05 -0400 Subject: [PATCH] Some bug fixes --- .../qweather/presentation/QWeatherActivity.kt | 7 +-- .../components/location/LocationsDrawer.kt | 3 + .../components/navigation/SmallToolbar.kt | 2 +- .../components/settings/SettingsCategory.kt | 4 +- .../screen/AppearanceSettingsScreen.kt | 1 - .../screen/LocationPickerScreen.kt | 55 +++++++++++++------ .../presentation/screen/MainScreen.kt | 7 ++- 7 files changed, 53 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt b/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt index ccb6db9..48f2753 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt @@ -31,16 +31,15 @@ class QWeatherActivity : ComponentActivity() { Theme.LIGHT -> false Theme.DARK -> true } - val locations = location.locations - val isLocationSet = locations.isNotEmpty() WeatherAppTheme(darkTheme = isDark, monet = prefs.monet) { Surface(modifier = Modifier.fillMaxSize()) { Navigator( - screen = if (isLocationSet) MainScreen() else LocationPickerScreen(), + screen = if (location.locations.isEmpty()) LocationPickerScreen() else MainScreen(), onBackPressed = { it !is MainScreen - }) { + } + ) { SlideTransition(it) } } diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/location/LocationsDrawer.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/location/LocationsDrawer.kt index cc6dc6b..e6cb20c 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/components/location/LocationsDrawer.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/location/LocationsDrawer.kt @@ -52,6 +52,9 @@ fun LocationsDrawer( IconButton(onClick = { locationPreferenceManager.locations -= data if (selected) locationPreferenceManager.selectedIndex = 0 + if (locationPreferenceManager.locations.isEmpty()) navigator?.push( + LocationPickerScreen() + ) }) { Icon( imageVector = Icons.Default.Delete, diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/navigation/SmallToolbar.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/navigation/SmallToolbar.kt index e506496..77d95b4 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/components/navigation/SmallToolbar.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/navigation/SmallToolbar.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable @Composable @OptIn(ExperimentalMaterial3Api::class) fun SmallToolbar( - backButton: Boolean = true, + backButton: Boolean = false, title: @Composable () -> Unit, actions: @Composable RowScope.() -> Unit = {}, navigationIcon: @Composable () -> Unit = { if (backButton) BackButton() }, diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/settings/SettingsCategory.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/settings/SettingsCategory.kt index 15e390d..ef3cf3a 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/components/settings/SettingsCategory.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/settings/SettingsCategory.kt @@ -18,12 +18,12 @@ fun SettingsCategory( destination: (() -> Screen)? = null ) { val screen = destination?.invoke() - val nav = LocalNavigator.current?.parent + val navigator = LocalNavigator.current?.parent Box( modifier = Modifier .clickable { - screen?.let { nav?.push(it) } + screen?.let { navigator?.push(it) } } ) { SettingItem( diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/screen/AppearanceSettingsScreen.kt b/app/src/main/java/com/henryhiles/qweather/presentation/screen/AppearanceSettingsScreen.kt index 84f7e7e..892a2a7 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/screen/AppearanceSettingsScreen.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/screen/AppearanceSettingsScreen.kt @@ -49,7 +49,6 @@ class AppearanceSettingsScreen : Screen { pref = screenModel.prefs.theme, labelFactory = { context.getString(it.label) } ) { screenModel.prefs.theme = it } - } } } diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/screen/LocationPickerScreen.kt b/app/src/main/java/com/henryhiles/qweather/presentation/screen/LocationPickerScreen.kt index 5edd8f7..1e1a6b4 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/screen/LocationPickerScreen.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/screen/LocationPickerScreen.kt @@ -39,13 +39,22 @@ class LocationPickerScreen : Screen { var isAboutOpen by remember { mutableStateOf(false) } val navigator = LocalNavigator.current - Scaffold(modifier = Modifier.imePadding(), + Scaffold( + modifier = Modifier.imePadding(), floatingActionButton = { FloatingActionButton(onClick = { location?.let { - screenModel.prefs.locations += it - screenModel.prefs.selectedIndex = screenModel.prefs.locations.count() - 1 - navigator?.push(MainScreen()) + with(screenModel.prefs) { + if (it !in locations) { + this.locations += it + selectedIndex = + locations.count() - 1 + } + } + + with(navigator) { + if (this != null) if (canPop) pop() else push(MainScreen()) + } } ?: kotlin.run { isAboutOpen = true } }) { Icon( @@ -53,10 +62,12 @@ class LocationPickerScreen : Screen { contentDescription = stringResource(id = R.string.action_apply) ) } - }) { + } + ) { Column { SmallToolbar( title = { Text(text = stringResource(id = R.string.location_choose)) }, + backButton = true, actions = { IconButton( onClick = { isAboutOpen = true }) { @@ -81,16 +92,18 @@ class LocationPickerScreen : Screen { ) } ?: kotlin.run { Column(modifier = Modifier.padding(16.dp)) { - if (isAboutOpen) AlertDialog( - title = { Text(text = stringResource(id = R.string.location_choose)) }, - text = { Text(text = stringResource(id = R.string.help_location_picker)) }, - onDismissRequest = { isAboutOpen = false }, - confirmButton = { - TextButton( - onClick = { isAboutOpen = false }) { - Text(text = stringResource(id = R.string.action_confirm)) + if (isAboutOpen) + AlertDialog( + title = { Text(text = stringResource(id = R.string.location_choose)) }, + text = { Text(text = stringResource(id = R.string.help_location_picker)) }, + onDismissRequest = { isAboutOpen = false }, + confirmButton = { + TextButton( + onClick = { isAboutOpen = false }) { + Text(text = stringResource(id = R.string.action_confirm)) + } } - }) + ) OutlinedTextField( label = { Text(text = stringResource(id = R.string.location)) }, @@ -128,9 +141,19 @@ class LocationPickerScreen : Screen { Alignment.CenterHorizontally ) .padding(16.dp) - ) else screenModel.state.locations?.let { + ) else screenModel.state.locations?.let { results -> + if (results.isEmpty()) Card { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(text = "No locations found") + } + } LazyColumn { - items(it) { + items(results) { val selected = it == location Spacer(modifier = Modifier.height(8.dp)) Card(modifier = Modifier.clickable { location = it }) { diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/screen/MainScreen.kt b/app/src/main/java/com/henryhiles/qweather/presentation/screen/MainScreen.kt index 306cbb0..7b6a6bd 100644 --- a/app/src/main/java/com/henryhiles/qweather/presentation/screen/MainScreen.kt +++ b/app/src/main/java/com/henryhiles/qweather/presentation/screen/MainScreen.kt @@ -32,17 +32,20 @@ class MainScreen : Screen { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val coroutineScope = rememberCoroutineScope() + TabNavigator(tab = TodayTab) { LocationsDrawer( drawerState = drawerState, - onClose = { coroutineScope.launch { drawerState.close() } }) { + onClose = { coroutineScope.launch { drawerState.close() } } + ) { Scaffold( topBar = { SmallToolbar( title = { with(locationPreferenceManager) { Text( - text = locations[selectedIndex].location, + text = locations.getOrNull(selectedIndex)?.location + ?: stringResource(id = R.string.unknown), maxLines = 1, modifier = Modifier.basicMarquee() )