diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidget.kt index ada73f25..a998364c 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidget.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidget.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.text.format.DateUtils +import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.clickable @@ -28,6 +29,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.weather.AnimatedWeatherIcon import de.mm20.launcher2.ui.weather.WeatherIcon import de.mm20.launcher2.weather.DailyForecast @@ -42,11 +44,23 @@ import kotlin.math.roundToInt fun WeatherWidget() { val viewModel: WeatherWidgetWM = viewModel() + val context = LocalContext.current + val selectedForecast by viewModel.currentForecast.observeAsState() val imperialUnits by viewModel.imperialUnits.observeAsState(false) val forecast = selectedForecast ?: run { + val hasPermission by viewModel.hasLocationPermission.observeAsState() + val autoLocation by viewModel.autoLocation.observeAsState() + AnimatedVisibility(hasPermission == false && autoLocation == true) { + MissingPermissionBanner( + modifier = Modifier.padding(horizontal = 16.dp).padding(top = 16.dp), + text = stringResource(id = R.string.missing_permission_auto_location), + onClick = { + viewModel.requestLocationPermission(context as AppCompatActivity) + }) + } NoData() return } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidgetWM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidgetWM.kt index b58baad2..c9b87ece 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidgetWM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/weather/WeatherWidgetWM.kt @@ -1,6 +1,9 @@ package de.mm20.launcher2.ui.launcher.widgets.weather +import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.* +import de.mm20.launcher2.permissions.PermissionGroup +import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.LauncherPreferences import de.mm20.launcher2.weather.DailyForecast @@ -16,12 +19,17 @@ import kotlin.math.min class WeatherWidgetWM : ViewModel(), KoinComponent { private val weatherRepository: WeatherRepository by inject() + private val permissionsManager: PermissionsManager by inject() + private val dataStore: LauncherDataStore by inject() private var selectedDayIndex = 0 set(value) { field = min(value, forecasts.lastIndex) - if (field < 0) return + if (field < 0) { + currentForecast.postValue(null) + return + } selectedForecastIndex = min( selectedForecastIndex, forecasts[value].hourlyForecasts.lastIndex @@ -33,7 +41,10 @@ class WeatherWidgetWM : ViewModel(), KoinComponent { private var selectedForecastIndex = 0 set(value) { - if (selectedDayIndex < 0) return + if (selectedDayIndex < 0) { + currentForecast.postValue(null) + return + } field = min(value, forecasts[selectedDayIndex].hourlyForecasts.lastIndex) currentForecast.postValue(getCurrentlySelectedForecast()) } @@ -61,6 +72,12 @@ class WeatherWidgetWM : ViewModel(), KoinComponent { val currentDayForecasts = MutableLiveData>(emptyList()) val currentDailyForecast = MutableLiveData(null) + val hasLocationPermission = permissionsManager.hasPermission(PermissionGroup.Location).asLiveData() + fun requestLocationPermission(context: AppCompatActivity) { + permissionsManager.requestPermission(context, PermissionGroup.Location) + } + val autoLocation = weatherRepository.autoLocation.asLiveData() + val imperialUnits = dataStore.data.map { it.weather.imperialUnits }.asLiveData() fun selectDay(index: Int) {