From 2c307693f28365189cb8d26b54073ee0734cf624 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 24 Sep 2022 21:46:07 +0200 Subject: [PATCH] Show tags in item detail views --- .../ui/launcher/search/apps/AppItem.kt | 31 +++++++++++++------ .../launcher/search/calendar/CalendarItem.kt | 11 +++++++ .../search/common/SearchableItemVM.kt | 6 ++++ .../launcher/search/contacts/ContactItem.kt | 11 +++++++ .../ui/launcher/search/files/FileItem.kt | 9 ++++++ .../launcher/search/shortcut/ShortcutItem.kt | 12 +++++++ .../ui/launcher/search/website/WebsiteItem.kt | 9 ++++++ .../search/wikipedia/WikipediaItem.kt | 9 ++++++ 8 files changed, 89 insertions(+), 9 deletions(-) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt index ca248b45..5c1ce1b3 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt @@ -4,7 +4,6 @@ import androidx.compose.animation.* import androidx.compose.animation.core.snap import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.* -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.* import androidx.compose.material3.MaterialTheme @@ -35,7 +34,6 @@ import de.mm20.launcher2.ui.locals.LocalGridIconSize import de.mm20.launcher2.ui.locals.LocalSnackbarHostState import de.mm20.launcher2.ui.modifier.scale import kotlinx.coroutines.launch -import kotlin.math.min import kotlin.math.pow import kotlin.math.roundToInt @@ -62,7 +60,22 @@ fun AppItem( .weight(1f) .padding(16.dp) ) { - Text(text = app.labelOverride ?: app.label, style = MaterialTheme.typography.titleMedium) + Text( + text = app.labelOverride ?: app.label, + style = MaterialTheme.typography.titleMedium + ) + + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp, bottom = 4.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } + + app.version?.let { Text( text = stringResource(R.string.app_info_version, it), @@ -75,16 +88,16 @@ fun AppItem( Text( text = app.`package`, style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding(top = 4.dp), + modifier = Modifier.padding(top = 1.dp), maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) FlowRow( modifier = Modifier - .padding(top = 16.dp) + .padding(top = 12.dp) .animateContentSize(), - mainAxisSpacing = 16.dp, + mainAxisSpacing = 12.dp, crossAxisSpacing = 0.dp ) { val notifications by viewModel.notifications.collectAsState(initial = emptyList()) @@ -290,8 +303,8 @@ fun AppItem( message = context.getString(R.string.msg_item_hidden, app.label), actionLabel = context.getString(R.string.action_undo), duration = SnackbarDuration.Short, - ) - if(result == SnackbarResult.ActionPerformed) { + ) + if (result == SnackbarResult.ActionPerformed) { viewModel.unhide() } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt index 947c584d..0995f401 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt @@ -88,6 +88,17 @@ fun CalendarItem( style = MaterialTheme.typography.bodySmall ) } + AnimatedVisibility(showDetails) { + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp, bottom = 4.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } + } } } AnimatedVisibility(showDetails) { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt index e1c49577..4b5f2e35 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/SearchableItemVM.kt @@ -5,6 +5,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.compose.ui.geometry.Rect import androidx.core.app.ActivityOptionsCompat import de.mm20.launcher2.badges.BadgeRepository +import de.mm20.launcher2.customattrs.CustomAttributesRepository import de.mm20.launcher2.favorites.FavoritesRepository import de.mm20.launcher2.icons.IconRepository import de.mm20.launcher2.icons.LauncherIcon @@ -22,6 +23,7 @@ abstract class SearchableItemVM( protected val favoritesRepository: FavoritesRepository by inject() protected val badgeRepository: BadgeRepository by inject() protected val iconRepository: IconRepository by inject() + protected val customAttributesRepository: CustomAttributesRepository by inject() val isPinned = favoritesRepository.isPinned(searchable) fun pin() { @@ -47,6 +49,10 @@ abstract class SearchableItemVM( return iconRepository.getIcon(searchable, size) } + fun getTags(): Flow> { + return customAttributesRepository.getTags(searchable) + } + open fun launch(context: Context, bounds: Rect? = null): Boolean { val view = (context as? AppCompatActivity)?.window?.decorView diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt index dd1340a2..b84e1024 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt @@ -94,6 +94,17 @@ fun ContactItem( overflow = TextOverflow.Ellipsis ) } + AnimatedVisibility(showDetails) { + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } + } } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt index 280abfb3..a6beecc4 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt @@ -88,6 +88,15 @@ fun FileItem( } AnimatedVisibility(showDetails) { Column { + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp, bottom = 4.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } Text( text = stringResource( R.string.file_meta_type, diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt index 399585f5..9d95fe96 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt @@ -69,6 +69,18 @@ fun AppShortcutItem( maxLines = 1, overflow = TextOverflow.Ellipsis ) + + AnimatedVisibility(showDetails) { + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp, bottom = 2.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } + } val textSpace by transition.animateDp(label = "textSpace") { if (it) 4.dp else 2.dp } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt index 78fb5590..a63cb530 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt @@ -60,6 +60,15 @@ fun WebsiteItem( text = website.label, style = MaterialTheme.typography.titleLarge ) + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 2.dp, bottom = 2.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } Text( modifier = Modifier.padding(vertical = 8.dp), text = website.description, diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt index 6935e415..7d21af18 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt @@ -61,6 +61,15 @@ fun WikipediaItem( text = wikipedia.label, style = MaterialTheme.typography.titleLarge ) + val tags by remember(viewModel) { viewModel.getTags() }.collectAsState(emptyList()) + if (tags.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 1.dp, bottom = 4.dp), + text = tags.joinToString(separator = " #", prefix = "#"), + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelSmall + ) + } Text( modifier = Modifier.padding(top = 4.dp), text = stringResource(id = R.string.wikipedia_source),