From 051fb1e9c57b04a965045946f6d6d9482bde45bb Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:55:07 +0200 Subject: [PATCH] Workaround a bug in Koin This should hopefully fix java.util.NoSuchElementException as in InsertKoinIO/koin#1149 --- .../launcher2/search/data/AppSerialization.kt | 33 ++++--------------- badges/build.gradle.kts | 1 + .../de/mm20/launcher2/badges/BadgeProvider.kt | 22 +++++++++++++ favorites/build.gradle.kts | 1 + .../favorites/FavoritesRepository.kt | 3 +- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/applications/src/main/java/de/mm20/launcher2/search/data/AppSerialization.kt b/applications/src/main/java/de/mm20/launcher2/search/data/AppSerialization.kt index 74015cd8..1b3b8b45 100644 --- a/applications/src/main/java/de/mm20/launcher2/search/data/AppSerialization.kt +++ b/applications/src/main/java/de/mm20/launcher2/search/data/AppSerialization.kt @@ -10,16 +10,10 @@ import android.os.Process import android.os.UserManager import androidx.annotation.RequiresApi import androidx.core.content.getSystemService -import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.badges.BadgeProvider -import de.mm20.launcher2.graphics.BadgeDrawable import de.mm20.launcher2.ktx.jsonObjectOf import de.mm20.launcher2.search.SearchableDeserializer import de.mm20.launcher2.search.SearchableSerializer -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.json.JSONObject import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -72,13 +66,12 @@ class AppShortcutSerializer : SearchableSerializer { } class AppShortcutDeserializer( - val context: Context, + val context: Context ) : SearchableDeserializer, KoinComponent { - private val badgeProvider: BadgeProvider by inject() - @RequiresApi(Build.VERSION_CODES.N_MR1) override fun deserialize(serialized: String): Searchable? { + val badgeProvider: BadgeProvider by inject() val launcherApps = context.getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps if (!launcherApps.hasShortcutHostPermission()) return null else { @@ -110,23 +103,11 @@ class AppShortcutDeserializer( if (shortcuts == null || shortcuts.isEmpty()) { return null } else { - GlobalScope.launch { - val activity = shortcuts[0].activity - withContext(Dispatchers.IO) { - val icon = try { - context.packageManager.getActivityIcon( - activity - ?: return@withContext - ) - } catch (e: PackageManager.NameNotFoundException) { - return@withContext - } - val badge = Badge(icon = BadgeDrawable(context, icon)) - badgeProvider.setBadge( - "shortcut://${activity.flattenToShortString()}", - badge - ) - } + val activity = shortcuts[0].activity + if (activity != null) { + badgeProvider.addAppShortcutBadge( + activity + ) } return AppShortcut( context = context, diff --git a/badges/build.gradle.kts b/badges/build.gradle.kts index 7af5c35d..f087937e 100644 --- a/badges/build.gradle.kts +++ b/badges/build.gradle.kts @@ -46,5 +46,6 @@ dependencies { implementation(project(":ktx")) implementation(project(":preferences")) + implementation(project(":base")) } \ No newline at end of file diff --git a/badges/src/main/java/de/mm20/launcher2/badges/BadgeProvider.kt b/badges/src/main/java/de/mm20/launcher2/badges/BadgeProvider.kt index a59fdee0..1d5ad426 100644 --- a/badges/src/main/java/de/mm20/launcher2/badges/BadgeProvider.kt +++ b/badges/src/main/java/de/mm20/launcher2/badges/BadgeProvider.kt @@ -1,13 +1,16 @@ package de.mm20.launcher2.badges +import android.content.ComponentName import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.LauncherApps +import android.content.pm.PackageManager import android.os.Build import android.os.Process import androidx.annotation.RequiresApi import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import de.mm20.launcher2.graphics.BadgeDrawable import de.mm20.launcher2.ktx.getSerialNumber import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.LauncherPreferences @@ -106,6 +109,25 @@ class BadgeProvider(val context: Context) { } } + fun addAppShortcutBadge(activity: ComponentName){ + scope.launch { + withContext(Dispatchers.IO) { + val icon = try { + context.packageManager.getActivityIcon( + activity + ) + } catch (e: PackageManager.NameNotFoundException) { + return@withContext + } + val badge = Badge(icon = BadgeDrawable(context, icon)) + setBadge( + "shortcut://${activity.flattenToShortString()}", + badge + ) + } + } + } + fun addCloudBadges() { setBadge("gdrive://", Badge(iconRes = R.drawable.ic_badge_gdrive)) setBadge("onedrive://", Badge(iconRes = R.drawable.ic_badge_onedrive)) diff --git a/favorites/build.gradle.kts b/favorites/build.gradle.kts index b354df0c..ca64af48 100644 --- a/favorites/build.gradle.kts +++ b/favorites/build.gradle.kts @@ -52,5 +52,6 @@ dependencies { implementation(project(":files")) implementation(project(":websites")) implementation(project(":wikipedia")) + implementation(project(":badges")) } \ No newline at end of file diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt index a3781c74..1783cd38 100644 --- a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt +++ b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt @@ -14,6 +14,7 @@ import de.mm20.launcher2.search.SearchableDeserializer import de.mm20.launcher2.search.data.CalendarEvent import de.mm20.launcher2.search.data.Searchable import kotlinx.coroutines.* +import org.koin.core.component.get import org.koin.core.component.inject import org.koin.core.parameter.parametersOf import kotlin.math.max @@ -34,7 +35,7 @@ class FavoritesRepository(private val context: Context) : BaseSearchableReposito val pinnedCalendarEvents = MediatorLiveData>() private fun fromDatabaseEntity(entity: FavoritesItemEntity): FavoritesItem { - val deserializer: SearchableDeserializer by inject { parametersOf(entity.serializedSearchable) } + val deserializer: SearchableDeserializer = get { parametersOf(entity.serializedSearchable) } return FavoritesItem( key = entity.key, searchable = deserializer.deserialize(entity.serializedSearchable.substringAfter("#")),