From 0f6d636ca0b5b3c47d4a4af83ed8a740d311755e Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Thu, 7 Dec 2023 20:56:57 +0100 Subject: [PATCH] Add plugin badges --- .../launcher2/search/SavableSearchable.kt | 2 ++ .../launcher2/files/providers/PluginFile.kt | 8 +++++++ .../de/mm20/launcher2/badges/BadgeService.kt | 1 + .../badges/providers/PluginBadgeProvider.kt | 21 +++++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 services/badges/src/main/java/de/mm20/launcher2/badges/providers/PluginBadgeProvider.kt diff --git a/core/base/src/main/java/de/mm20/launcher2/search/SavableSearchable.kt b/core/base/src/main/java/de/mm20/launcher2/search/SavableSearchable.kt index 80241e84..c6448c92 100644 --- a/core/base/src/main/java/de/mm20/launcher2/search/SavableSearchable.kt +++ b/core/base/src/main/java/de/mm20/launcher2/search/SavableSearchable.kt @@ -1,6 +1,7 @@ package de.mm20.launcher2.search import android.content.Context +import android.graphics.drawable.Drawable import android.os.Bundle import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.icons.StaticLauncherIcon @@ -31,6 +32,7 @@ interface SavableSearchable : Searchable, Comparable { themed: Boolean ): LauncherIcon? = null + suspend fun getProviderIcon(context: Context): Drawable? = null override fun compareTo(other: SavableSearchable): Int { val label1 = labelOverride ?: label diff --git a/data/files/src/main/java/de/mm20/launcher2/files/providers/PluginFile.kt b/data/files/src/main/java/de/mm20/launcher2/files/providers/PluginFile.kt index 43305fa1..e2d4e33d 100644 --- a/data/files/src/main/java/de/mm20/launcher2/files/providers/PluginFile.kt +++ b/data/files/src/main/java/de/mm20/launcher2/files/providers/PluginFile.kt @@ -19,6 +19,8 @@ import de.mm20.launcher2.search.FileMetaType import de.mm20.launcher2.search.SavableSearchable import de.mm20.launcher2.search.SearchableSerializer import kotlinx.collections.immutable.ImmutableMap +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext data class PluginFile( val id: String, @@ -54,6 +56,12 @@ data class PluginFile( return PluginFileSerializer() } + override suspend fun getProviderIcon(context: Context): Drawable? { + return withContext(Dispatchers.IO) { + context.packageManager.resolveContentProvider(authority, 0)?.loadIcon(context.packageManager) + } + } + override suspend fun loadIcon(context: Context, size: Int, themed: Boolean): LauncherIcon? { if (thumbnailUri != null) { val request = ImageRequest.Builder(context) diff --git a/services/badges/src/main/java/de/mm20/launcher2/badges/BadgeService.kt b/services/badges/src/main/java/de/mm20/launcher2/badges/BadgeService.kt index 44d2aab4..2303e7f4 100644 --- a/services/badges/src/main/java/de/mm20/launcher2/badges/BadgeService.kt +++ b/services/badges/src/main/java/de/mm20/launcher2/badges/BadgeService.kt @@ -37,6 +37,7 @@ internal class BadgeServiceImpl(private val context: Context) : BadgeService, Ko if (it.suspendedApps) { providers += SuspendedAppsBadgeProvider() } + providers += PluginBadgeProvider(context) badgeProviders.value = providers } } diff --git a/services/badges/src/main/java/de/mm20/launcher2/badges/providers/PluginBadgeProvider.kt b/services/badges/src/main/java/de/mm20/launcher2/badges/providers/PluginBadgeProvider.kt new file mode 100644 index 00000000..53962e76 --- /dev/null +++ b/services/badges/src/main/java/de/mm20/launcher2/badges/providers/PluginBadgeProvider.kt @@ -0,0 +1,21 @@ +package de.mm20.launcher2.badges.providers + +import android.content.Context +import de.mm20.launcher2.badges.Badge +import de.mm20.launcher2.search.SavableSearchable +import de.mm20.launcher2.search.Searchable +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf + +class PluginBadgeProvider(private val context: Context): BadgeProvider { + override fun getBadge(searchable: Searchable): Flow { + if (searchable !is SavableSearchable) return flowOf(null) + return flow { + val icon = searchable.getProviderIcon(context) + if (icon != null) { + emit(Badge(icon = icon)) + } + } + } +} \ No newline at end of file