From fe2da9a60e617866f914d87c1cfeaf83667daddd Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 15 Jan 2022 22:56:48 +0100 Subject: [PATCH] Add permission banner to calendar widget settings --- i18n/src/main/res/values-de/strings.xml | 2 ++ i18n/src/main/res/values/strings.xml | 5 +++-- .../CalendarWidgetSettingsScreen.kt | 15 +++++++++++++++ .../CalendarWidgetSettingsScreenVM.kt | 10 ++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/i18n/src/main/res/values-de/strings.xml b/i18n/src/main/res/values-de/strings.xml index 5b097d03..0e42cc0f 100644 --- a/i18n/src/main/res/values-de/strings.xml +++ b/i18n/src/main/res/values-de/strings.xml @@ -460,4 +460,6 @@ %1$s spielt Medien Bisher wurden keine Medien abgespielt + + Kalenderzugriff wird benötigt um Termine abzurufen \ No newline at end of file diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 8219b674..c7d0ff5d 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -437,7 +437,8 @@ Location access is required to determine the location automatically Notification access is required to control media playback Contact permission is required to search contacts - Calendar permission is required to search contacts + Calendar permission is required to search calendar + This widget requires calendar permission Set location Debug @@ -469,7 +470,7 @@ Contacts Search contacts on this device Calendar - Search upcoming calendar events + Search upcoming appointments Calculator Evaluate mathematical terms Unit converter diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreen.kt index 6b8a4d68..4e383e46 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreen.kt @@ -1,5 +1,7 @@ package de.mm20.launcher2.ui.settings.calendarwidget +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -11,12 +13,14 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.viewmodel.compose.viewModel import de.mm20.launcher2.search.data.UserCalendar import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen @@ -26,10 +30,21 @@ import de.mm20.launcher2.ui.pluralResource @Composable fun CalendarWidgetSettingsScreen() { val viewModel: CalendarWidgetSettingsScreenVM = viewModel() + val context = LocalContext.current PreferenceScreen(title = stringResource(R.string.preference_screen_calendarwidget)) { item { val excludeAllDayEvents by viewModel.excludeAllDayEvents.observeAsState() PreferenceCategory { + val hasPermission by viewModel.hasCalendarPermission.observeAsState() + AnimatedVisibility(hasPermission == false) { + MissingPermissionBanner( + modifier = Modifier.padding(16.dp), + text = stringResource(R.string.missing_permission_calendar_widget_settings), + onClick = { + viewModel.requestPermission(context as AppCompatActivity) + } + ) + } SwitchPreference( title = stringResource(R.string.preference_calendar_hide_allday), value = excludeAllDayEvents == true, diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreenVM.kt index 8c37ef12..9385f21e 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreenVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarwidget/CalendarWidgetSettingsScreenVM.kt @@ -1,10 +1,13 @@ package de.mm20.launcher2.ui.settings.calendarwidget +import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import de.mm20.launcher2.calendar.CalendarRepository +import de.mm20.launcher2.permissions.PermissionGroup +import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -14,6 +17,9 @@ import org.koin.core.component.inject class CalendarWidgetSettingsScreenVM : ViewModel(), KoinComponent { private val dataStore: LauncherDataStore by inject() private val calendarRepository: CalendarRepository by inject() + private val permissionsManager: PermissionsManager by inject() + + val hasCalendarPermission = permissionsManager.hasPermission(PermissionGroup.Calendar).asLiveData() val excludeAllDayEvents = dataStore.data.map { it.calendarWidget.hideAlldayEvents }.asLiveData() fun setExcludeAllDayEvents(excludeAllDayEvents: Boolean) { @@ -49,4 +55,8 @@ class CalendarWidgetSettingsScreenVM : ViewModel(), KoinComponent { } } } + + fun requestPermission(activity: AppCompatActivity) { + permissionsManager.requestPermission(activity, PermissionGroup.Calendar) + } } \ No newline at end of file