Show a banner in badge settings if notification permission is missing
This commit is contained in:
parent
e19fef9b18
commit
0e7be56c94
@ -471,6 +471,7 @@
|
|||||||
<string name="missing_permission_calendar_widget_settings">Kalenderzugriff wird benötigt um Termine abzurufen</string>
|
<string name="missing_permission_calendar_widget_settings">Kalenderzugriff wird benötigt um Termine abzurufen</string>
|
||||||
<string name="missing_permission_file_search">Speicher-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
|
<string name="missing_permission_file_search">Speicher-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
|
||||||
<string name="missing_permission_file_search_android10">Alle Dateien verwalten-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
|
<string name="missing_permission_file_search_android10">Alle Dateien verwalten-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
|
||||||
|
<string name="missing_permission_notification_badges">Benachrichtigungszugriff wird benötigt um Benachrichtigungsplaketten anzuzeigen</string>
|
||||||
|
|
||||||
<string name="websearch_dialog_create_title">Websuche hinzufügen</string>
|
<string name="websearch_dialog_create_title">Websuche hinzufügen</string>
|
||||||
<string name="websearch_dialog_edit_title">Websuche bearbeiten</string>
|
<string name="websearch_dialog_edit_title">Websuche bearbeiten</string>
|
||||||
|
|||||||
@ -437,6 +437,8 @@
|
|||||||
<string name="missing_permission_calendar_widget_settings">This widget requires calendar permission</string>
|
<string name="missing_permission_calendar_widget_settings">This widget requires calendar permission</string>
|
||||||
<string name="missing_permission_file_search_android10">Manage all files permission is required to search local files</string>
|
<string name="missing_permission_file_search_android10">Manage all files permission is required to search local files</string>
|
||||||
<string name="missing_permission_file_search">External storage permission is required to search local files</string>
|
<string name="missing_permission_file_search">External storage permission is required to search local files</string>
|
||||||
|
<string name="missing_permission_notification_badges">Notification access is requried to display notification badges</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>
|
||||||
|
|||||||
@ -1,55 +1,76 @@
|
|||||||
package de.mm20.launcher2.ui.settings.badges
|
package de.mm20.launcher2.ui.settings.badges
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
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.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
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.PreferenceCategory
|
||||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||||
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BadgeSettingsScreen() {
|
fun BadgeSettingsScreen() {
|
||||||
val viewModel: BadgeSettingsScreenVM = viewModel()
|
val viewModel: BadgeSettingsScreenVM = viewModel()
|
||||||
|
val context = LocalContext.current
|
||||||
PreferenceScreen(title = stringResource(R.string.preference_screen_badges)) {
|
PreferenceScreen(title = stringResource(R.string.preference_screen_badges)) {
|
||||||
item {
|
item {
|
||||||
val notifications by viewModel.notifications.observeAsState()
|
PreferenceCategory {
|
||||||
SwitchPreference(
|
val notifications by viewModel.notifications.observeAsState()
|
||||||
title = stringResource(R.string.preference_notification_badges),
|
val hasNotificationsPermission by viewModel.hasNotificationsPermission.observeAsState()
|
||||||
summary = stringResource(R.string.preference_notification_badges_summary),
|
AnimatedVisibility(hasNotificationsPermission == false) {
|
||||||
value = notifications == true,
|
MissingPermissionBanner(
|
||||||
onValueChanged = {
|
text = stringResource(R.string.missing_permission_notification_badges),
|
||||||
viewModel.setNotifications(it)
|
onClick = {
|
||||||
|
viewModel.requestNotificationsPermission(context as AppCompatActivity)
|
||||||
|
},
|
||||||
|
modifier = Modifier.padding(16.dp)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
SwitchPreference(
|
||||||
val cloudFiles by viewModel.cloudFiles.observeAsState()
|
title = stringResource(R.string.preference_notification_badges),
|
||||||
SwitchPreference(
|
summary = stringResource(R.string.preference_notification_badges_summary),
|
||||||
title = stringResource(R.string.preference_cloud_badges),
|
value = notifications == true && hasNotificationsPermission == false,
|
||||||
summary = stringResource(R.string.preference_cloud_badges_summary),
|
onValueChanged = {
|
||||||
value = cloudFiles == true,
|
viewModel.setNotifications(it)
|
||||||
onValueChanged = {
|
}
|
||||||
viewModel.setCloudFiles(it)
|
)
|
||||||
}
|
val cloudFiles by viewModel.cloudFiles.observeAsState()
|
||||||
)
|
SwitchPreference(
|
||||||
val suspendedApps by viewModel.suspendedApps.observeAsState()
|
title = stringResource(R.string.preference_cloud_badges),
|
||||||
SwitchPreference(
|
summary = stringResource(R.string.preference_cloud_badges_summary),
|
||||||
title = stringResource(R.string.preference_suspended_badges),
|
value = cloudFiles == true,
|
||||||
summary = stringResource(R.string.preference_suspended_badges_summary),
|
onValueChanged = {
|
||||||
value = suspendedApps == true,
|
viewModel.setCloudFiles(it)
|
||||||
onValueChanged = {
|
}
|
||||||
viewModel.setSuspendedApps(it)
|
)
|
||||||
}
|
val suspendedApps by viewModel.suspendedApps.observeAsState()
|
||||||
)
|
SwitchPreference(
|
||||||
val shortcuts by viewModel.shortcuts.observeAsState()
|
title = stringResource(R.string.preference_suspended_badges),
|
||||||
SwitchPreference(
|
summary = stringResource(R.string.preference_suspended_badges_summary),
|
||||||
title = stringResource(R.string.preference_shortcut_badges),
|
value = suspendedApps == true,
|
||||||
summary = stringResource(R.string.preference_shortcut_badges_summary),
|
onValueChanged = {
|
||||||
value = shortcuts == true,
|
viewModel.setSuspendedApps(it)
|
||||||
onValueChanged = {
|
}
|
||||||
viewModel.setShortcuts(it)
|
)
|
||||||
}
|
val shortcuts by viewModel.shortcuts.observeAsState()
|
||||||
)
|
SwitchPreference(
|
||||||
|
title = stringResource(R.string.preference_shortcut_badges),
|
||||||
|
summary = stringResource(R.string.preference_shortcut_badges_summary),
|
||||||
|
value = shortcuts == true,
|
||||||
|
onValueChanged = {
|
||||||
|
viewModel.setShortcuts(it)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,8 +1,11 @@
|
|||||||
package de.mm20.launcher2.ui.settings.badges
|
package de.mm20.launcher2.ui.settings.badges
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.asLiveData
|
import androidx.lifecycle.asLiveData
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
|
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
|
||||||
@ -12,6 +15,9 @@ import org.koin.core.component.inject
|
|||||||
class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
|
class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
|
||||||
|
|
||||||
private val dataStore: LauncherDataStore by inject()
|
private val dataStore: LauncherDataStore by inject()
|
||||||
|
private val permissionsManager: PermissionsManager by inject()
|
||||||
|
|
||||||
|
val hasNotificationsPermission = permissionsManager.hasPermission(PermissionGroup.Notifications).asLiveData()
|
||||||
|
|
||||||
val notifications = dataStore.data.map { it.badges.notifications }.asLiveData()
|
val notifications = dataStore.data.map { it.badges.notifications }.asLiveData()
|
||||||
fun setNotifications(notifications: Boolean) {
|
fun setNotifications(notifications: Boolean) {
|
||||||
@ -27,6 +33,10 @@ class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun requestNotificationsPermission(context: AppCompatActivity) {
|
||||||
|
permissionsManager.requestPermission(context, PermissionGroup.Notifications)
|
||||||
|
}
|
||||||
|
|
||||||
val cloudFiles = dataStore.data.map { it.badges.cloudFiles }.asLiveData()
|
val cloudFiles = dataStore.data.map { it.badges.cloudFiles }.asLiveData()
|
||||||
fun setCloudFiles(cloudFiles: Boolean) {
|
fun setCloudFiles(cloudFiles: Boolean) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user