From 3ffe20a8a738b8c9baf29646610a2c22fe2c930d Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 6 Sep 2025 23:23:57 +0200 Subject: [PATCH] fix some permission banners in settings --- .../contacts/ContactsSettingsScreen.kt | 9 --- .../locations/LocationsSettingsScreen.kt | 66 ++++++++----------- 2 files changed, 28 insertions(+), 47 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt index 52252d25a..46b835a36 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt @@ -50,15 +50,6 @@ fun ContactsSettingsScreen() { ) { item { PreferenceCategory { - AnimatedVisibility(hasContactsPermission == false) { - MissingPermissionBanner( - text = stringResource(R.string.missing_permission_contact_search_settings), - onClick = { - viewModel.requestContactsPermission(context as AppCompatActivity) - }, - modifier = Modifier.padding(16.dp) - ) - } GuardedPreference( locked = hasContactsPermission == false, onUnlock = { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt index fd1ded12c..e111a6563 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt @@ -1,16 +1,12 @@ package de.mm20.launcher2.ui.settings.locations import android.app.PendingIntent -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ErrorOutline -import androidx.compose.material.icons.rounded.WarningAmber import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -26,7 +22,7 @@ import de.mm20.launcher2.ktx.sendWithBackgroundPermission import de.mm20.launcher2.plugin.PluginState import de.mm20.launcher2.preferences.search.LocationSearchSettings import de.mm20.launcher2.ui.R -import de.mm20.launcher2.ui.component.Banner +import de.mm20.launcher2.ui.component.preferences.GuardedPreference import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen @@ -74,41 +70,35 @@ fun LocationsSettingsScreen() { navController?.navigate("settings/search/locations/osm") } ) - AnimatedVisibility(plugins.isNotEmpty()) { - Column { - for (plugin in plugins) { - val state = plugin.state - if (state is PluginState.SetupRequired) { - Banner( - modifier = Modifier.padding(16.dp), - text = state.message - ?: stringResource(id = R.string.plugin_state_setup_required), - icon = Icons.Rounded.ErrorOutline, - primaryAction = { - TextButton(onClick = { - try { - state.setupActivity.sendWithBackgroundPermission(context) - } catch (e: PendingIntent.CanceledException) { - CrashReporter.logException(e) - } - }) { - Text(stringResource(id = R.string.plugin_action_setup)) - } - } + for (plugin in plugins) { + val state = plugin.state + GuardedPreference( + locked = state is PluginState.SetupRequired, + onUnlock = { + try { + (state as PluginState.SetupRequired).setupActivity.sendWithBackgroundPermission( + context ) + } catch (e: PendingIntent.CanceledException) { + CrashReporter.logException(e) } - SwitchPreference( - title = plugin.plugin.label, - enabled = enabledPlugins != null && state is PluginState.Ready, - summary = (state as? PluginState.Ready)?.text - ?: (state as? PluginState.SetupRequired)?.message - ?: plugin.plugin.description, - value = enabledPlugins?.contains(plugin.plugin.authority) == true && state is PluginState.Ready, - onValueChanged = { - viewModel.setPluginEnabled(plugin.plugin.authority, it) - }, - ) - } + }, + description = (state as? PluginState.SetupRequired)?.message + ?: stringResource(id = R.string.plugin_state_setup_required), + icon = Icons.Rounded.ErrorOutline, + unlockLabel = stringResource(id = R.string.plugin_action_setup), + ) { + SwitchPreference( + title = plugin.plugin.label, + enabled = enabledPlugins != null && state is PluginState.Ready, + summary = (state as? PluginState.Ready)?.text + ?: (state as? PluginState.SetupRequired)?.message + ?: plugin.plugin.description, + value = enabledPlugins?.contains(plugin.plugin.authority) == true && state is PluginState.Ready, + onValueChanged = { + viewModel.setPluginEnabled(plugin.plugin.authority, it) + }, + ) } } }