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 48f2753..8961370 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/QWeatherActivity.kt
@@ -3,7 +3,6 @@ package com.henryhiles.qweather.presentation
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
-import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
@@ -22,7 +21,6 @@ class QWeatherActivity : ComponentActivity() {
private val prefs: AppearancePreferenceManager by inject()
private val location: LocationPreferenceManager by inject()
- @OptIn(ExperimentalAnimationApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
@@ -36,9 +34,6 @@ class QWeatherActivity : ComponentActivity() {
Surface(modifier = Modifier.fillMaxSize()) {
Navigator(
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/weather/WeatherCard.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherCard.kt
index b6ead84..bb1a359 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherCard.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherCard.kt
@@ -4,10 +4,10 @@ import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Thermostat
import androidx.compose.material.icons.outlined.WaterDrop
import androidx.compose.material.icons.outlined.WindPower
import androidx.compose.material3.Card
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
@@ -40,7 +40,8 @@ fun WeatherCard(hour: HourlyWeatherData?, modifier: Modifier = Modifier) {
modifier = Modifier.fillMaxWidth()
) {
Text(
- text = "Today $formattedTime",
+ text = formattedTime,
+ style = MaterialTheme.typography.headlineSmall,
)
}
Spacer(modifier = Modifier.height(16.dp))
@@ -53,18 +54,12 @@ fun WeatherCard(hour: HourlyWeatherData?, modifier: Modifier = Modifier) {
Spacer(modifier = Modifier.height(16.dp))
Text(text = "${it.temperature}°C", fontSize = 50.sp)
Spacer(modifier = Modifier.height(16.dp))
- Text(text = it.weatherType.weatherDesc, fontSize = 20.sp)
+ Text(text = "${it.weatherType.weatherDesc} - Feels like ${it.apparentTemperature}°C", fontSize = 20.sp)
Spacer(modifier = Modifier.height(32.dp))
Row(
modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.SpaceAround
+ horizontalArrangement = Arrangement.SpaceEvenly
) {
- WeatherDataDisplay(
- value = it.apparentTemperature,
- unit = "°C",
- icon = Icons.Outlined.Thermostat,
- description = "Feels like",
- )
WeatherDataDisplay(
value = it.precipitationProbability,
unit = "%",
diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherDay.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherDay.kt
index 2a3cd47..33fa23b 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherDay.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherDay.kt
@@ -67,7 +67,7 @@ fun WeatherDay(dailyWeatherData: DailyWeatherData) {
modifier = Modifier
.fillMaxWidth()
.padding(start = 16.dp, end = 16.dp, bottom = 16.dp),
- horizontalArrangement = Arrangement.Center
+ horizontalArrangement = Arrangement.SpaceEvenly
) {
WeatherDataDisplay(
value = dailyWeatherData.precipitationProbabilityMax,
diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherForecast.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherForecast.kt
index 0c7c16f..db693b9 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherForecast.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherForecast.kt
@@ -2,7 +2,7 @@ package com.henryhiles.qweather.presentation.components.weather
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
-import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@@ -16,14 +16,13 @@ fun WeatherForecast(
onChangeSelected: (Int) -> Unit
) {
state.hourlyWeatherInfo?.weatherData?.let {
- val hour = LocalDateTime.now().hour
LazyRow(modifier = modifier) {
- itemsIndexed(it.subList(hour, it.size)) { index, data ->
+ items(it.subList(LocalDateTime.now().hour, it.size)) {
WeatherHour(
- data = data,
+ data = it,
modifier = Modifier
.padding(horizontal = 8.dp)
- ) { onChangeSelected(index) }
+ ) { onChangeSelected(it.time.hour) }
}
}
}
diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherToday.kt b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherToday.kt
index c1f0fcc..f2d8853 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherToday.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/components/weather/WeatherToday.kt
@@ -1,43 +1,62 @@
package com.henryhiles.qweather.presentation.components.weather
import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Card
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.henryhiles.qweather.R
import com.henryhiles.qweather.presentation.components.VerticalDivider
import com.henryhiles.qweather.presentation.screenmodel.HourlyWeatherState
+import com.henryhiles.qweather.presentation.screenmodel.LocationPreferenceManager
+import org.koin.compose.koinInject
@Composable
fun WeatherToday(state: HourlyWeatherState) {
- state.hourlyWeatherInfo?.let {
- Row(
- modifier = Modifier
- .height(24.dp)
- .fillMaxWidth(),
- horizontalArrangement = Arrangement.Center
- ) {
+ val locationPreferenceManager: LocationPreferenceManager = koinInject()
- Text(
- text = stringResource(R.string.weather_high, it.highTemperature),
- )
- VerticalDivider(modifier = Modifier.padding(horizontal = 8.dp))
- Text(
- text = stringResource(id = R.string.weather_low, it.lowTemperature)
- )
- VerticalDivider(modifier = Modifier.padding(horizontal = 8.dp))
- Text(
- text = it.precipitationProbability?.let {
- stringResource(
- id = R.string.weather_precipitation,
- it
- )
- } ?: stringResource(
- id = R.string.unknown
+ state.hourlyWeatherInfo?.let {
+ Card(
+ shape = RoundedCornerShape(8.dp),
+ ) {
+ Column(modifier = Modifier.padding(8.dp), horizontalAlignment = Alignment.CenterHorizontally) {
+ Text(
+ text = stringResource(id = R.string.today_in, with(locationPreferenceManager) {
+ locations.getOrNull(selectedIndex)?.location?.split(",")?.first()
+ ?: stringResource(id = R.string.unknown)
+ }),
+ style = MaterialTheme.typography.headlineSmall
)
- )
+ Spacer(modifier = Modifier.height(8.dp))
+ Row(
+ modifier = Modifier
+ .height(24.dp)
+ .fillMaxWidth(),
+ horizontalArrangement = Arrangement.Center
+ ) {
+ Text(
+ text = stringResource(R.string.weather_high, it.highTemperature),
+ )
+ VerticalDivider(modifier = Modifier.padding(horizontal = 8.dp))
+ Text(
+ text = stringResource(id = R.string.weather_low, it.lowTemperature)
+ )
+ VerticalDivider(modifier = Modifier.padding(horizontal = 8.dp))
+ Text(
+ text = it.precipitationProbability?.let {
+ stringResource(
+ id = R.string.weather_precipitation,
+ it
+ )
+ } ?: stringResource(id = R.string.unknown)
+ )
+ }
+ }
}
}
}
\ No newline at end of file
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 3520696..98876f1 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
@@ -8,7 +8,6 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Info
import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.*
import androidx.compose.runtime.*
@@ -31,30 +30,21 @@ class LocationPickerScreen : Screen {
override fun Content() {
val screenModel: LocationPickerScreenModel = getScreenModel()
var locationSearch by remember { mutableStateOf("") }
- var isAboutOpen by remember { mutableStateOf(false) }
val navigator = LocalNavigator.currentOrThrow
Scaffold(
modifier = Modifier.imePadding(),
- ) {padding ->
+ ) { padding ->
Column(modifier = Modifier.padding(padding)) {
SmallToolbar(
title = { Text(text = stringResource(id = R.string.location_choose)) },
backButton = screenModel.prefs.locations.isNotEmpty(),
- actions = {
- IconButton(
- onClick = { isAboutOpen = true }) {
- Icon(
- imageVector = Icons.Outlined.Info,
- contentDescription = stringResource(id = R.string.help_screen)
- )
- }
- })
+ )
screenModel.state.error?.let {
AlertDialog(
- onDismissRequest = {navigator.pop()},
+ onDismissRequest = { navigator.pop() },
confirmButton = {
- TextButton(onClick = {navigator.pop()}) {
+ TextButton(onClick = { navigator.pop() }) {
Text(text = stringResource(id = R.string.action_confirm))
}
},
@@ -69,19 +59,6 @@ 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))
- }
- }
- )
-
OutlinedTextField(
label = { Text(text = stringResource(id = R.string.location)) },
keyboardOptions = KeyboardOptions(
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 6e5a27e..c12cff8 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
@@ -19,16 +19,13 @@ import com.henryhiles.qweather.domain.util.NavigationTab
import com.henryhiles.qweather.presentation.components.location.LocationsDrawer
import com.henryhiles.qweather.presentation.components.navigation.BottomBar
import com.henryhiles.qweather.presentation.components.navigation.SmallToolbar
-import com.henryhiles.qweather.presentation.screenmodel.LocationPreferenceManager
import com.henryhiles.qweather.presentation.tabs.TodayTab
import kotlinx.coroutines.launch
-import org.koin.compose.koinInject
class MainScreen : Screen {
@OptIn(ExperimentalFoundationApi::class)
@Composable
override fun Content() {
- val locationPreferenceManager: LocationPreferenceManager = koinInject()
val drawerState =
rememberDrawerState(initialValue = DrawerValue.Closed)
val coroutineScope = rememberCoroutineScope()
@@ -42,14 +39,11 @@ class MainScreen : Screen {
topBar = {
SmallToolbar(
title = {
- with(locationPreferenceManager) {
- Text(
- text = locations.getOrNull(selectedIndex)?.location
- ?: stringResource(id = R.string.unknown),
- maxLines = 1,
- modifier = Modifier.basicMarquee()
- )
- }
+ Text(
+ text = it.current.options.title,
+ maxLines = 1,
+ modifier = Modifier.basicMarquee()
+ )
},
actions = {
(it.current as? NavigationTab)?.Actions()
diff --git a/app/src/main/java/com/henryhiles/qweather/presentation/tabs/TodayTab.kt b/app/src/main/java/com/henryhiles/qweather/presentation/tabs/TodayTab.kt
index dacf84b..354fc1c 100644
--- a/app/src/main/java/com/henryhiles/qweather/presentation/tabs/TodayTab.kt
+++ b/app/src/main/java/com/henryhiles/qweather/presentation/tabs/TodayTab.kt
@@ -81,12 +81,12 @@ object TodayTab : NavigationTab {
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
+ WeatherToday(state = weatherViewModel.state)
WeatherCard(
hour = weatherViewModel.state.selected?.let {
weatherViewModel.state.hourlyWeatherInfo?.weatherData?.get(it)
} ?: weatherViewModel.state.hourlyWeatherInfo?.currentWeatherData,
)
- WeatherToday(state = weatherViewModel.state)
WeatherForecast(
state = weatherViewModel.state
) { weatherViewModel.setSelected(it) }
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 967d0f6..877dee5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -15,9 +15,6 @@
Selected
- How do I use this screen?
- Please search a location, then tap a result. Then tap the apply button in the bottom left corner.
-
Theme
Dynamic Theme
Available on Android 12+
@@ -41,6 +38,8 @@
Low: %1$d°C
Precipitation: %1$d﹪
+ Today in %1$s
+
Unknown
An error occurred