Support themed icons for 3rd party icon packs (#3091)

Co-authored-by: Goooler <wangzongler@gmail.com>
This commit is contained in:
Naveen
2022-11-09 16:59:47 +05:30
committed by GitHub
parent ea594f6da5
commit 3872af21e4
4 changed files with 40 additions and 4 deletions

View File

@@ -32,6 +32,12 @@
<item>org.withouthat.acalendar</item>
<item>ws.xsoh.etar</item>
</string-array>
<string-array name="themed_icon_packs" translatable="false">
<!-- The package will working when lawnicons fully converted as iconpack-->
<item>com.lawnchair.lawnicons</item>
<item>com.donnnno.arcticons</item>
<item>com.whicons.iconpack</item>
</string-array>
<string name="clock_component_name" translatable="false">com.google.android.deskclock/com.android.deskclock.DeskClock</string>
<string name="launcher_activity_logic_class" translatable="false">app.lawnchair.LauncherActivityCachingLogic</string>
<string name="main_process_initializer_class" translatable="false">app.lawnchair.LawnchairProcessInitializer</string>

View File

@@ -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<String, IconPack?>()
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) {

View File

@@ -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),