diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt index 34564de3..763998e4 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt @@ -195,4 +195,23 @@ class SearchVM : ViewModel(), KoinComponent { } } + val missingAppShortcutPermission = combine( + permissionsManager.hasPermission(PermissionGroup.AppShortcuts), + dataStore.data.map { it.appShortcutSearch.enabled }.distinctUntilChanged() + ) { perm, enabled -> !perm && enabled } + + fun requestAppShortcutPermission(context: AppCompatActivity) { + permissionsManager.requestPermission(context, PermissionGroup.AppShortcuts) + } + + fun disableAppShortcutSearch() { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setAppShortcutSearch(it.appShortcutSearch.toBuilder().setEnabled(false)) + .build() + } + } + } + } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/appshortcuts/AppShortcutResults.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/appshortcuts/AppShortcutResults.kt index dc9079ed..62ed573c 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/appshortcuts/AppShortcutResults.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/appshortcuts/AppShortcutResults.kt @@ -1,30 +1,63 @@ package de.mm20.launcher2.ui.launcher.search.appshortcuts +import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +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 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.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.LauncherCard +import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.launcher.search.SearchVM import de.mm20.launcher2.ui.launcher.search.common.list.SearchResultList @Composable fun ColumnScope.AppShortcutResults() { val viewModel: SearchVM = viewModel() - val apps by viewModel.appShortcutResults.observeAsState(emptyList()) + val shortcuts by viewModel.appShortcutResults.observeAsState(emptyList()) + val context = LocalContext.current - AnimatedVisibility(apps.isNotEmpty()) { + val isSearchEmpty by viewModel.isSearchEmpty.observeAsState(true) + val missingPermission by viewModel.missingAppShortcutPermission.collectAsState(false) + + AnimatedVisibility(shortcuts.isNotEmpty() || (!isSearchEmpty && missingPermission)) { LauncherCard( modifier = Modifier.padding(bottom = 8.dp) ) { + Column { + AnimatedVisibility(!isSearchEmpty && missingPermission) { + MissingPermissionBanner( + text = stringResource(R.string.missing_permission_appshortcuts_search, stringResource(R.string.app_name)), + onClick = { viewModel.requestAppShortcutPermission(context as AppCompatActivity) }, + modifier = Modifier.padding(16.dp), + secondaryAction = { + TextButton(onClick = { + viewModel.disableAppShortcutSearch() + }) { + Text( + stringResource(R.string.turn_off), + style = MaterialTheme.typography.labelLarge + ) + } + } + ) + } + } SearchResultList( - items = apps, + items = shortcuts, modifier = Modifier .fillMaxWidth() .padding(12.dp)