From 847fe08acd6eee1415a5dcb02f450923e3ad6868 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:58:55 +0200 Subject: [PATCH] Workaround edit favorites create tag popup not focusable bug --- .../ui/launcher/sheets/EditFavoritesSheet.kt | 88 +++++-------------- .../launcher/sheets/EditFavoritesSheetVM.kt | 15 ++-- .../ui/settings/tags/EditTagSheet.kt | 2 + 3 files changed, 34 insertions(+), 71 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt index 2bbbe0e8..75ef65c5 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt @@ -8,15 +8,12 @@ import androidx.activity.result.IntentSenderRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.calculateEndPadding -import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset @@ -29,13 +26,8 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Add -import androidx.compose.material.icons.rounded.ArrowForward -import androidx.compose.material.icons.rounded.Close -import androidx.compose.material.icons.rounded.Create import androidx.compose.material.icons.rounded.Delete import androidx.compose.material.icons.rounded.Settings import androidx.compose.material.icons.rounded.Tag @@ -45,13 +37,9 @@ import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.FilledTonalIconButton import androidx.compose.material3.FilledTonalIconToggleButton -import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.Icon -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.MenuDefaults import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedCard import androidx.compose.material3.Slider @@ -72,12 +60,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.PathEffect -import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.drawOutline import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -90,6 +76,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.search.SavableSearchable +import de.mm20.launcher2.search.data.Tag import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.common.TagChip import de.mm20.launcher2.ui.component.BottomSheetDialog @@ -102,6 +89,7 @@ import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropGridState import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropListState import de.mm20.launcher2.ui.ktx.toPixels import de.mm20.launcher2.ui.locals.LocalGridSettings +import de.mm20.launcher2.ui.settings.tags.EditTagSheet import kotlin.math.roundToInt @Composable @@ -172,8 +160,8 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding val items by viewModel.gridItems.observeAsState(emptyList()) val columns = LocalGridSettings.current.columnCount - val availableTags by viewModel.availableTags.observeAsState(emptyList()) - val pinnedTags by viewModel.pinnedTags.observeAsState(emptyList()) + val availableTags by viewModel.availableTags + val pinnedTags by viewModel.pinnedTags var contextMenuItemKey by remember { mutableStateOf(null) } @@ -182,6 +170,8 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding var draggedItemKey by remember { mutableStateOf(null) } var hoveredTag by remember { mutableStateOf(null) } + var createTag by remember { mutableStateOf(false) } + val gridState = rememberLazyGridState() val tagsListState = rememberLazyListState() val tagsTitleSize = 48.dp.toPixels() @@ -526,60 +516,19 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding if (availableTags.isNotEmpty()) { Divider() } - var newTag by remember { mutableStateOf("") } DropdownMenuItem( leadingIcon = { - Icon(Icons.Rounded.Create, null) + Icon(Icons.Rounded.Add, null) }, - contentPadding = PaddingValues( - start = MenuDefaults.DropdownMenuItemContentPadding.calculateStartPadding( - LocalLayoutDirection.current - ), - end = MenuDefaults.DropdownMenuItemContentPadding.calculateEndPadding( - LocalLayoutDirection.current - ), - top = if (availableTags.isNotEmpty()) 8.dp else 0.dp, - ), text = { - Box { - if (newTag.isEmpty()) { - Text( - stringResource(R.string.edit_favorites_dialog_new_tag), - color = LocalContentColor.current.copy(alpha = 0.5f) - ) - } - BasicTextField( - value = newTag, - onValueChange = { - newTag = it.replace(",", "") - }, - textStyle = LocalTextStyle.current.copy( - color = LocalContentColor.current - ), - cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), - singleLine = true, - keyboardActions = KeyboardActions( - onDone = { - if (newTag.isBlank()) return@KeyboardActions - viewModel.createNewTag(newTag) - showAddMenu = false - } - ) - ) - } - }, - trailingIcon = { - Icon( - modifier = Modifier.clickable { - if (newTag.isBlank()) return@clickable - viewModel.createNewTag(newTag) - showAddMenu = false - }, - imageVector = Icons.Rounded.ArrowForward, - contentDescription = null + Text( + stringResource(R.string.edit_favorites_dialog_new_tag), ) }, - onClick = { } + onClick = { + createTag = true + showAddMenu = false + } ) } } @@ -636,6 +585,17 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding } } } + if (createTag) { + EditTagSheet( + tag = null, + onTagSaved = { tag -> + viewModel.pinTag(Tag(tag)) + }, + onDismiss = { + createTag = false + } + ) + } } @Composable diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt index d529b78a..bffda3fc 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt @@ -5,6 +5,7 @@ import android.content.Intent import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.lazy.LazyListItemInfo import androidx.compose.foundation.lazy.grid.LazyGridItemInfo +import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData @@ -52,8 +53,8 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent { private var automaticallySorted: MutableList = mutableListOf() private var frequentlyUsed: MutableList = mutableListOf() - val pinnedTags = MutableLiveData>(emptyList()) - val availableTags = MutableLiveData>(emptyList()) + val pinnedTags = mutableStateOf>(emptyList()) + val availableTags = mutableStateOf>(emptyList()) suspend fun reload(showLoadingIndicator: Boolean = true) { loading.value = showLoadingIndicator @@ -275,24 +276,24 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent { } fun pinTag(tag: Tag) { - val pinned = pinnedTags.value?.toMutableList() ?: mutableListOf() + val pinned = pinnedTags.value.toMutableList() pinned.add(tag) - val available = availableTags.value ?: emptyList() + val available = availableTags.value availableTags.value = available.filter { it.tag != tag.tag } pinnedTags.value = pinned.distinctBy { it.tag } save() } fun unpinTag(tag: Tag) { - val pinned = pinnedTags.value?.toMutableList() ?: mutableListOf() - val available = availableTags.value ?: emptyList() + val pinned = pinnedTags.value.toMutableList() + val available = availableTags.value availableTags.value = (available + tag).sorted() pinnedTags.value = pinned.filter { it.tag != tag.tag } save() } fun moveTag(from: LazyListItemInfo, to: LazyListItemInfo) { - val pinned = pinnedTags.value?.toMutableList() ?: return + val pinned = pinnedTags.value.toMutableList() val tag = pinned.removeAt(from.index) pinned.add(to.index, tag) pinnedTags.value = pinned diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt index b51243d8..034d8bba 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/EditTagSheet.kt @@ -55,6 +55,7 @@ import de.mm20.launcher2.ui.locals.LocalGridSettings fun EditTagSheet( tag: String?, onDismiss: () -> Unit, + onTagSaved: (String) -> Unit = {}, ) { val viewModel: EditTagSheetVM = viewModel() @@ -79,6 +80,7 @@ fun EditTagSheet( if (viewModel.page == EditTagSheetPage.CustomizeTag) { OutlinedButton(onClick = { viewModel.save() + onTagSaved(viewModel.tagName) onDismiss() }) { Text(stringResource(R.string.close))