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