From 3872af21e44d2fa43b9964f55ef4d35c10939ce0 Mon Sep 17 00:00:00 2001 From: Naveen Date: Wed, 9 Nov 2022 16:59:47 +0530 Subject: [PATCH] Support themed icons for 3rd party icon packs (#3091) Co-authored-by: Goooler --- lawnchair/res/values/config.xml | 6 ++++ .../app/lawnchair/icons/IconPackProvider.kt | 30 +++++++++++++++++++ .../ui/preferences/IconPackPreferences.kt | 6 ++-- platform_frameworks_libs_systemui | 2 +- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/lawnchair/res/values/config.xml b/lawnchair/res/values/config.xml index 69ecb61dca..c6e3288197 100644 --- a/lawnchair/res/values/config.xml +++ b/lawnchair/res/values/config.xml @@ -32,6 +32,12 @@ org.withouthat.acalendar ws.xsoh.etar + + + com.lawnchair.lawnicons + com.donnnno.arcticons + com.whicons.iconpack + com.google.android.deskclock/com.android.deskclock.DeskClock app.lawnchair.LauncherActivityCachingLogic app.lawnchair.LawnchairProcessInitializer diff --git a/lawnchair/src/app/lawnchair/icons/IconPackProvider.kt b/lawnchair/src/app/lawnchair/icons/IconPackProvider.kt index 7c379a3501..1fe75b106d 100644 --- a/lawnchair/src/app/lawnchair/icons/IconPackProvider.kt +++ b/lawnchair/src/app/lawnchair/icons/IconPackProvider.kt @@ -1,5 +1,6 @@ package app.lawnchair.icons +import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import android.graphics.drawable.Drawable @@ -8,11 +9,22 @@ import android.os.Process import android.os.UserHandle import com.android.launcher3.icons.ClockDrawableWrapper import com.android.launcher3.util.MainThreadInitializedObject +import com.android.launcher3.icons.R +import android.graphics.drawable.InsetDrawable +import android.graphics.drawable.AdaptiveIconDrawable +import app.lawnchair.icons.CustomAdaptiveIconDrawable +import com.android.launcher3.icons.ThemedIconDrawable +import android.graphics.drawable.ColorDrawable +import app.lawnchair.icons.* +import app.lawnchair.util.Constants.LAWNICONS_PACKAGE_NAME + + class IconPackProvider(private val context: Context) { private val systemIconPack = SystemIconPack(context) private val iconPacks = mutableMapOf() + private val themedIconPacks = context.resources.getStringArray(R.array.themed_icon_packs) fun getIconPackOrSystem(packageName: String): IconPack? { if (packageName.isEmpty()) return systemIconPack @@ -41,6 +53,24 @@ class IconPackProvider(private val context: Context) { val iconPack = getIconPackOrSystem(iconEntry.packPackageName) ?: return null iconPack.loadBlocking() val drawable = iconPack.getIcon(iconEntry, iconDpi) ?: return null + if ( + context.isThemedIconsEnabled() && iconEntry.packPackageName in themedIconPacks + ) { + val themedColors: IntArray = ThemedIconDrawable.getThemedColors(context) + val res = context.packageManager.getResourcesForApplication(iconEntry.packPackageName) + @SuppressLint("DiscouragedApi") + val resId = res.getIdentifier(iconEntry.name, "drawable", iconEntry.packPackageName) + val bg: Drawable = ColorDrawable(themedColors[0]) + val td = ThemedIconDrawable.ThemeData(res, iconEntry.packPackageName, resId) + val fg = td.wrapDrawable(drawable, 0) + return if (fg is AdaptiveIconDrawable) { + val foregroundDr = fg.foreground.apply { setTint(themedColors[1]) } + CustomAdaptiveIconDrawable(bg, foregroundDr) + } else { + val iconFromPack = InsetDrawable(drawable, .3f).apply { setTint(themedColors[1]) } + td.wrapDrawable(CustomAdaptiveIconDrawable(bg, iconFromPack), 0) + } + } val clockMetadata = if (user == Process.myUserHandle()) iconPack.getClock(iconEntry) else null if (clockMetadata != null) { val clockDrawable = ClockDrawableWrapper.forMeta(Build.VERSION.SDK_INT, clockMetadata) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreferences.kt index d9fef6aea3..8e2a356812 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreferences.kt @@ -56,7 +56,6 @@ import app.lawnchair.preferences.PreferenceAdapter import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences.preferenceManager import app.lawnchair.ui.preferences.components.* -import app.lawnchair.util.Constants import app.lawnchair.util.isPackageInstalled import com.android.launcher3.R import com.google.accompanist.drawablepainter.rememberDrawablePainter @@ -134,8 +133,9 @@ fun IconPackPreferences() { modifier = Modifier.padding(bottom = 8.dp), ) PreferenceGroup { - val themedIconsAvailable = LocalContext.current.packageManager - .isPackageInstalled(Constants.LAWNICONS_PACKAGE_NAME) + val themedIconsAvailable = LocalContext.current.resources + .getStringArray(R.array.themed_icon_packs) + .any { LocalContext.current.packageManager.isPackageInstalled(it) } ListPreference( enabled = themedIconsAvailable, label = stringResource(id = R.string.themed_icon_title), diff --git a/platform_frameworks_libs_systemui b/platform_frameworks_libs_systemui index d33c15f94b..34742ba4c9 160000 --- a/platform_frameworks_libs_systemui +++ b/platform_frameworks_libs_systemui @@ -1 +1 @@ -Subproject commit d33c15f94b7a974827b608584a0525efafab5c1c +Subproject commit 34742ba4c94c9d962668c6732428aaa8c84581cd