Add permission banner to calendar widget settings

This commit is contained in:
MM20 2022-01-15 22:56:48 +01:00
parent 8ce84cfe22
commit fe2da9a60e
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 30 additions and 2 deletions

View File

@ -460,4 +460,6 @@
<string name="music_widget_default_title">%1$s spielt Medien</string> <string name="music_widget_default_title">%1$s spielt Medien</string>
<string name="music_widget_no_data">Bisher wurden keine Medien abgespielt</string> <string name="music_widget_no_data">Bisher wurden keine Medien abgespielt</string>
<string name="missing_permission_calendar_widget_settings">Kalenderzugriff wird benötigt um Termine abzurufen</string>
</resources> </resources>

View File

@ -437,7 +437,8 @@
<string name="missing_permission_auto_location">Location access is required to determine the location automatically</string> <string name="missing_permission_auto_location">Location access is required to determine the location automatically</string>
<string name="missing_permission_music_widget">Notification access is required to control media playback</string> <string name="missing_permission_music_widget">Notification access is required to control media playback</string>
<string name="missing_permission_contact_search">Contact permission is required to search contacts</string> <string name="missing_permission_contact_search">Contact permission is required to search contacts</string>
<string name="missing_permission_calendar_search">Calendar permission is required to search contacts</string> <string name="missing_permission_calendar_search">Calendar permission is required to search calendar</string>
<string name="missing_permission_calendar_widget_settings">This widget requires calendar permission</string>
<string name="weather_widget_set_location">Set location</string> <string name="weather_widget_set_location">Set location</string>
<string name="preference_screen_debug">Debug</string> <string name="preference_screen_debug">Debug</string>
@ -469,7 +470,7 @@
<string name="preference_search_contacts">Contacts</string> <string name="preference_search_contacts">Contacts</string>
<string name="preference_search_contacts_summary">Search contacts on this device</string> <string name="preference_search_contacts_summary">Search contacts on this device</string>
<string name="preference_search_calendar">Calendar</string> <string name="preference_search_calendar">Calendar</string>
<string name="preference_search_calendar_summary">Search upcoming calendar events</string> <string name="preference_search_calendar_summary">Search upcoming appointments</string>
<string name="preference_search_calculator">Calculator</string> <string name="preference_search_calculator">Calculator</string>
<string name="preference_search_calculator_summary">Evaluate mathematical terms</string> <string name="preference_search_calculator_summary">Evaluate mathematical terms</string>
<string name="preference_search_unitconverter">Unit converter</string> <string name="preference_search_unitconverter">Unit converter</string>

View File

@ -1,5 +1,7 @@
package de.mm20.launcher2.ui.settings.calendarwidget 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.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.search.data.UserCalendar import de.mm20.launcher2.search.data.UserCalendar
import de.mm20.launcher2.ui.R 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.Preference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
@ -26,10 +30,21 @@ import de.mm20.launcher2.ui.pluralResource
@Composable @Composable
fun CalendarWidgetSettingsScreen() { fun CalendarWidgetSettingsScreen() {
val viewModel: CalendarWidgetSettingsScreenVM = viewModel() val viewModel: CalendarWidgetSettingsScreenVM = viewModel()
val context = LocalContext.current
PreferenceScreen(title = stringResource(R.string.preference_screen_calendarwidget)) { PreferenceScreen(title = stringResource(R.string.preference_screen_calendarwidget)) {
item { item {
val excludeAllDayEvents by viewModel.excludeAllDayEvents.observeAsState() val excludeAllDayEvents by viewModel.excludeAllDayEvents.observeAsState()
PreferenceCategory { 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( SwitchPreference(
title = stringResource(R.string.preference_calendar_hide_allday), title = stringResource(R.string.preference_calendar_hide_allday),
value = excludeAllDayEvents == true, value = excludeAllDayEvents == true,

View File

@ -1,10 +1,13 @@
package de.mm20.launcher2.ui.settings.calendarwidget package de.mm20.launcher2.ui.settings.calendarwidget
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.calendar.CalendarRepository 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 de.mm20.launcher2.preferences.LauncherDataStore
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -14,6 +17,9 @@ import org.koin.core.component.inject
class CalendarWidgetSettingsScreenVM : ViewModel(), KoinComponent { class CalendarWidgetSettingsScreenVM : ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject() private val dataStore: LauncherDataStore by inject()
private val calendarRepository: CalendarRepository 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() val excludeAllDayEvents = dataStore.data.map { it.calendarWidget.hideAlldayEvents }.asLiveData()
fun setExcludeAllDayEvents(excludeAllDayEvents: Boolean) { fun setExcludeAllDayEvents(excludeAllDayEvents: Boolean) {
@ -49,4 +55,8 @@ class CalendarWidgetSettingsScreenVM : ViewModel(), KoinComponent {
} }
} }
} }
fun requestPermission(activity: AppCompatActivity) {
permissionsManager.requestPermission(activity, PermissionGroup.Calendar)
}
} }