Revert "fixed third party themed source"

This reverts commit ced2f5accb.
This commit is contained in:
MrSluffy
2024-12-09 08:59:48 +08:00
parent ced2f5accb
commit f96609c40b
4 changed files with 200 additions and 144 deletions
@@ -10,7 +10,6 @@ import android.graphics.drawable.InsetDrawable
import android.os.Build
import android.os.Process
import android.os.UserHandle
import app.lawnchair.util.getThemedIconPacksInstalled
import com.android.launcher3.icons.ClockDrawableWrapper
import com.android.launcher3.icons.ThemedIconDrawable
import com.android.launcher3.util.MainThreadInitializedObject
@@ -48,16 +47,14 @@ class IconPackProvider(private val context: Context) : SafeCloseable {
iconPack.loadBlocking()
val packageManager = context.packageManager
val drawable = iconPack.getIcon(iconEntry, iconDpi) ?: return null
val themedIconPacks = packageManager.getThemedIconPacksInstalled(context)
val isThemedIconsEnabled =
context.isThemedIconsEnabled() && (iconEntry.packPackageName in themedIconPacks)
val shouldTintBackgrounds = context.shouldTintIconPackBackgrounds()
val clockMetadata =
if (user == Process.myUserHandle()) iconPack.getClock(iconEntry) else null
try {
if (clockMetadata != null) {
val clockDrawable: ClockDrawableWrapper =
ClockDrawableWrapper.forMeta(Build.VERSION.SDK_INT, clockMetadata) {
if (isThemedIconsEnabled) {
if (shouldTintBackgrounds) {
wrapThemedData(
packageManager,
iconEntry,
@@ -67,22 +64,20 @@ class IconPackProvider(private val context: Context) : SafeCloseable {
drawable
}
}
if (clockDrawable != null) {
return if (isThemedIconsEnabled && context.shouldTransparentBGIcons()) {
clockDrawable.foreground
} else {
CustomAdaptiveIconDrawable(
clockDrawable.background,
clockDrawable.foreground,
)
}
return if (shouldTintBackgrounds && context.shouldTransparentBGIcons()) {
clockDrawable.foreground
} else {
CustomAdaptiveIconDrawable(
clockDrawable.background,
clockDrawable.foreground,
)
}
}
} catch (_: Throwable) {
} catch (t: Throwable) {
// Ignore
}
if (isThemedIconsEnabled) {
if (shouldTintBackgrounds) {
return wrapThemedData(packageManager, iconEntry, drawable)
}
return drawable
@@ -94,22 +89,27 @@ class IconPackProvider(private val context: Context) : SafeCloseable {
drawable: Drawable,
): Drawable? {
val themedColors: IntArray = ThemedIconDrawable.getThemedColors(context)
val res = packageManager.getResourcesForApplication(iconEntry.packPackageName)
try {
val res = 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)
return if (drawable is AdaptiveIconDrawable) {
if (context.shouldTransparentBGIcons() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && drawable.monochrome != null) {
drawable.monochrome?.apply { setTint(themedColors[1]) }
@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)
return if (drawable is AdaptiveIconDrawable) {
if (context.shouldTransparentBGIcons() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && drawable.monochrome != null) {
drawable.monochrome?.apply { setTint(themedColors[1]) }
} else {
val foregroundDr = drawable.foreground.apply { setTint(themedColors[1]) }
CustomAdaptiveIconDrawable(bg, foregroundDr)
}
} else {
val foregroundDr = drawable.foreground.apply { setTint(themedColors[1]) }
CustomAdaptiveIconDrawable(bg, foregroundDr)
val iconFromPack = InsetDrawable(drawable, .3f).apply { setTint(themedColors[1]) }
td.wrapDrawable(CustomAdaptiveIconDrawable(bg, iconFromPack), 0)
}
} else {
val iconFromPack = InsetDrawable(drawable, .3f).apply { setTint(themedColors[1]) }
td.wrapDrawable(CustomAdaptiveIconDrawable(bg, iconFromPack), 0)
} catch (_: Exception) {
return drawable
}
}
@@ -19,7 +19,6 @@ import android.content.res.Resources
import android.graphics.drawable.AdaptiveIconDrawable
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Handler
import android.os.UserHandle
import android.os.UserManager
@@ -34,6 +33,7 @@ import app.lawnchair.util.getPackageVersionCode
import app.lawnchair.util.isPackageInstalled
import com.android.launcher3.BuildConfig
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.icons.IconProvider
import com.android.launcher3.icons.ThemedIconDrawable
import com.android.launcher3.util.ComponentKey
@@ -49,25 +49,31 @@ class LawnchairIconProvider @JvmOverloads constructor(
private val prefs = PreferenceManager.getInstance(context)
private val iconPackPref = prefs.iconPackPackage
private val themedIconPackPref = prefs.themedIconPackPackage
private val drawerThemedIcons get() = prefs.drawerThemedIcons
private val iconPackProvider = IconPackProvider.INSTANCE.get(context)
private val overrideRepo = IconOverrideRepository.INSTANCE.get(context)
private val iconPack get() = iconPackProvider.getIconPack(iconPackPref.get())?.apply { loadBlocking() }
private val themedIconPack get() = iconPackProvider.getIconPack(themedIconPackPref.get())?.apply { loadBlocking() }
private var isOlderLawnIconsInstalled = context.packageManager.getPackageVersionCode(LAWNICONS_PACKAGE_NAME) in 1..3
private val iconPack
get() = iconPackProvider.getIconPack(iconPackPref.get())?.apply { loadBlocking() }
private val themedIconPack
get() = iconPackProvider.getIconPack(themedIconPackPref.get())?.apply { loadBlocking() }
private var isOlderLawniconsInstalled = context.packageManager.getPackageVersionCode(LAWNICONS_PACKAGE_NAME) in 1..3
private var iconPackVersion = 0L
private var themeMapName: String = ""
private var _themeMap: Map<ComponentName, ThemedIconDrawable.ThemeData>? = null
val themeMap: Map<ComponentName, ThemedIconDrawable.ThemeData>
get() {
if (drawerThemedIcons.get() && !(isOlderLawnIconsInstalled)) {
if (!context.isThemedIconsEnabled()) {
_themeMap = DISABLED_MAP
}
if (_themeMap == null) {
_themeMap = createThemedIconMap()
}
if (isOlderLawnIconsInstalled && themedIconPackPref.get() == LAWNICONS_PACKAGE_NAME) {
if (isOlderLawniconsInstalled) {
themeMapName = themedIconPackPref.get()
_themeMap = createThemedIconMap()
}
@@ -83,9 +89,9 @@ class LawnchairIconProvider @JvmOverloads constructor(
setIconThemeSupported(supportsIconTheme)
}
// override fun setIconThemeSupported(isSupported: Boolean) {
// _themeMap = if (isSupported && isOlderLawnIconsInstalled) null else DISABLED_MAP
// }
override fun setIconThemeSupported(isSupported: Boolean) {
_themeMap = if (isSupported && isOlderLawniconsInstalled) null else DISABLED_MAP
}
private fun resolveIconEntry(componentName: ComponentName, user: UserHandle): IconEntry? {
val componentKey = ComponentKey(componentName, user)
@@ -149,25 +155,43 @@ class LawnchairIconProvider @JvmOverloads constructor(
}
}
val icon = resolvedEntry?.let { iconPackProvider.getDrawable(it, iconDpi, user) }
var td = themeData
val td = themeData
if (icon != null) return if (td != null) td.wrapDrawable(icon, iconType) else icon
// use default icon from system
var defaultIcon =
super.getIconWithOverrides(packageName, component, user, iconDpi, fallback)
if (context.isThemedIconsEnabled() && defaultIcon is AdaptiveIconDrawable &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && defaultIcon.monochrome != null
) {
defaultIcon = defaultIcon.monochrome
return if (td != null) {
td.wrapDrawable(defaultIcon, iconType)
} else {
val themedColors = ThemedIconDrawable.getThemedColors(context)
if (context.shouldTransparentBGIcons()) {
return defaultIcon.apply { setTint(themedColors[1]) }
if ((context.shouldTintIconPackBackgrounds() && defaultIcon is AdaptiveIconDrawable) || (context.isThemedIconsEnabled() && defaultIcon is AdaptiveIconDrawable)) {
if (Utilities.ATLEAST_T && defaultIcon.monochrome != null) {
defaultIcon = defaultIcon.monochrome
return if (td != null) {
td.wrapDrawable(defaultIcon, iconType)
} else {
val themedColors = ThemedIconDrawable.getThemedColors(context)
if (context.shouldTransparentBGIcons()) {
return defaultIcon.apply { setTint(themedColors[1]) }
}
CustomAdaptiveIconDrawable(
ColorDrawable(themedColors[0]),
defaultIcon.apply { setTint(themedColors[1]) },
)
}
} else {
val iconCompat = ThemedIconCompat.getThemedIcon(context, componentName) ?: return defaultIcon
return if (td != null) {
td.wrapDrawable(iconCompat, iconType)
} else {
val themedColors = ThemedIconDrawable.getThemedColors(context)
if (context.shouldTransparentBGIcons()) {
return iconCompat.apply { setTint(themedColors[1]) }
}
CustomAdaptiveIconDrawable(
ColorDrawable(themedColors[0]),
iconCompat.apply { setTint(themedColors[1]) },
)
}
CustomAdaptiveIconDrawable(
ColorDrawable(themedColors[0]),
defaultIcon.apply { setTint(themedColors[1]) },
)
}
}
return defaultIcon
@@ -367,7 +391,6 @@ class LawnchairIconProvider @JvmOverloads constructor(
Log.e(TAG, "Unable to parse icon map.", e)
}
}
updateMapFromResources(
resources = context.resources,
packageName = context.packageName,
@@ -378,7 +401,7 @@ class LawnchairIconProvider @JvmOverloads constructor(
resources = context.packageManager.getResourcesForApplication(themeMapName),
packageName = themeMapName,
)
if (isOlderLawnIconsInstalled) {
if (isOlderLawniconsInstalled) {
updateMapWithDynamicIcons(context, map)
}
}
@@ -19,20 +19,26 @@ package app.lawnchair.ui.preferences.destinations
import android.content.res.Configuration
import android.graphics.drawable.Drawable
import androidx.annotation.StringRes
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@@ -41,9 +47,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -60,8 +68,9 @@ import app.lawnchair.ui.preferences.components.DummyLauncherLayout
import app.lawnchair.ui.preferences.components.WallpaperPreview
import app.lawnchair.ui.preferences.components.controls.ListPreference
import app.lawnchair.ui.preferences.components.controls.ListPreferenceEntry
import app.lawnchair.ui.preferences.components.controls.SwitchPreference
import app.lawnchair.ui.preferences.components.invariantDeviceProfile
import app.lawnchair.ui.preferences.components.layout.ExpandAndShrink
import app.lawnchair.ui.preferences.components.layout.Chip
import app.lawnchair.ui.preferences.components.layout.NestedScrollStretch
import app.lawnchair.ui.preferences.components.layout.PreferenceGroup
import app.lawnchair.ui.preferences.components.layout.PreferenceLayout
@@ -70,6 +79,7 @@ import app.lawnchair.util.getThemedIconPacksInstalled
import app.lawnchair.util.isPackageInstalled
import com.android.launcher3.R
import com.google.accompanist.drawablepainter.rememberDrawablePainter
import kotlinx.coroutines.launch
data class IconPackInfo(
val name: String,
@@ -105,6 +115,8 @@ fun IconPackPreferences(
modifier: Modifier = Modifier,
) {
val prefs = preferenceManager()
val context = LocalContext.current
val iconPackAdapter = prefs.iconPackPackage.getAdapter()
val themedIconPackAdapter = prefs.themedIconPackPackage.getAdapter()
val themedIconsAdapter = prefs.themedIcons.getAdapter()
@@ -112,6 +124,7 @@ fun IconPackPreferences(
val isPortrait = LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT
val scrollState = rememberScrollState()
val drawerThemedIconsEnabled = drawerThemedIconsAdapter.state.value
val tintIconpack = prefs.tintIconPackBackgrounds.getAdapter()
PreferenceLayout(
label = stringResource(id = R.string.icon_style_label),
@@ -133,7 +146,7 @@ fun IconPackPreferences(
.clip(MaterialTheme.shapes.large),
) {
WallpaperPreview(modifier = Modifier.fillMaxSize())
key(iconPackAdapter.state.value, themedIconPackAdapter.state.value, themedIconsAdapter.state.value) {
key(iconPackAdapter.state.value, themedIconPackAdapter.state.value, themedIconsAdapter.state.value, tintIconpack.state.value) {
DummyLauncherLayout(
idp = invariantDeviceProfile(),
modifier = Modifier.fillMaxSize(),
@@ -143,74 +156,98 @@ fun IconPackPreferences(
}
}
Column {
ExpandAndShrink(visible = !drawerThemedIconsEnabled) {
PreferenceGroup(
heading = stringResource(id = R.string.icon_pack),
) {
IconPackGrid(
adapter = iconPackAdapter,
themedIconsAdapter.state.value,
false,
)
}
}
ExpandAndShrink(visible = themedIconsAdapter.state.value && !drawerThemedIconsEnabled) {
PreferenceGroup(
heading = stringResource(id = R.string.themed_icon_pack),
) {
IconPackGrid(
adapter = themedIconPackAdapter,
drawerThemedIconsEnabled,
true,
)
}
}
ExpandAndShrink(visible = drawerThemedIconsEnabled) {
PreferenceGroup(
heading = stringResource(id = R.string.themed_icon_pack),
) {
IconPackGrid(
adapter = iconPackAdapter,
drawerThemedIconsEnabled,
true,
)
}
}
PreferenceGroup {
val themedIconsAvailable = LocalContext.current.packageManager
.getThemedIconPacksInstalled(LocalContext.current)
.any { LocalContext.current.packageManager.isPackageInstalled(it) } ||
LocalContext.current.packageManager
.isPackageInstalled(Constants.LAWNICONS_PACKAGE_NAME)
ListPreference(
enabled = themedIconsAvailable,
label = stringResource(id = R.string.themed_icon_title),
entries = ThemedIconsState.entries.map {
ListPreferenceEntry(
value = it,
label = { stringResource(id = it.labelResourceId) },
)
}.toMutableList(),
value = ThemedIconsState.getForSettings(
themedIcons = themedIconsAdapter.state.value,
drawerThemedIcons = drawerThemedIconsEnabled,
),
onValueChange = {
themedIconsAdapter.onChange(newValue = it.themedIcons)
drawerThemedIconsAdapter.onChange(newValue = it.drawerThemedIcons)
iconPackAdapter.onChange(newValue = iconPackAdapter.state.value)
if (it.themedIcons && !it.drawerThemedIcons) {
themedIconPackAdapter.onChange(newValue = themedIconPackAdapter.state.value)
} else {
themedIconPackAdapter.onChange(newValue = "")
}
},
description = if (themedIconsAvailable.not()) {
stringResource(id = R.string.lawnicons_not_installed_description)
} else {
null
},
val pagerState = rememberPagerState(
initialPage = 0,
pageCount = { 2 },
)
val scope = rememberCoroutineScope()
val scrollToPage =
{ page: Int -> scope.launch { pagerState.animateScrollToPage(page) } }
Row(
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
modifier = Modifier.padding(horizontal = 16.dp),
) {
Chip(
label = stringResource(id = R.string.icon_pack),
onClick = { scrollToPage(0) },
currentOffset = pagerState.currentPage + pagerState.currentPageOffsetFraction,
page = 0,
)
Chip(
label = stringResource(id = R.string.themed_icon_pack),
onClick = { scrollToPage(1) },
currentOffset = pagerState.currentPage + pagerState.currentPageOffsetFraction,
page = 1,
)
}
Spacer(Modifier.height(16.dp))
HorizontalPager(
state = pagerState,
verticalAlignment = Alignment.Top,
modifier = Modifier.animateContentSize(),
) { page ->
when (page) {
0 -> {
PreferenceGroup {
IconPackGrid(
adapter = iconPackAdapter,
false,
)
SwitchPreference(
adapter = prefs.tintIconPackBackgrounds.getAdapter(),
label = stringResource(id = R.string.themed_icon_pack_tint),
)
}
}
1 -> {
val packageManager = context.packageManager
PreferenceGroup {
val themedIconsAvailable = packageManager
.getThemedIconPacksInstalled(LocalContext.current)
.any { packageManager.isPackageInstalled(it) } ||
packageManager
.isPackageInstalled(Constants.LAWNICONS_PACKAGE_NAME)
if (themedIconsAvailable && themedIconsAdapter.state.value) {
IconPackGrid(
adapter = themedIconPackAdapter,
true,
)
}
ListPreference(
enabled = themedIconsAvailable,
label = stringResource(id = R.string.themed_icon_title),
entries = ThemedIconsState.entries.map {
ListPreferenceEntry(
value = it,
label = { stringResource(id = it.labelResourceId) },
)
},
value = ThemedIconsState.getForSettings(
themedIcons = themedIconsAdapter.state.value,
drawerThemedIcons = drawerThemedIconsEnabled,
),
onValueChange = {
themedIconsAdapter.onChange(newValue = it.themedIcons)
drawerThemedIconsAdapter.onChange(newValue = it.drawerThemedIcons)
iconPackAdapter.onChange(newValue = iconPackAdapter.state.value)
themedIconPackAdapter.onChange(newValue = themedIconPackAdapter.state.value)
},
description = if (themedIconsAvailable.not()) {
stringResource(id = R.string.lawnicons_not_installed_description)
} else {
null
},
)
}
}
}
}
}
}
@@ -219,25 +256,21 @@ fun IconPackPreferences(
@Composable
fun IconPackGrid(
adapter: PreferenceAdapter<String>,
drawerThemedIcons: Boolean,
isThemedIconPack: Boolean,
modifier: Modifier = Modifier,
) {
val iconPacks by LocalPreferenceInteractor.current.iconPacks.collectAsStateWithLifecycle()
val themedIconPacks by LocalPreferenceInteractor.current.themedIconPacks.collectAsStateWithLifecycle()
val preferenceInteractor = LocalPreferenceInteractor.current
val iconPacks by preferenceInteractor.iconPacks.collectAsStateWithLifecycle()
val themedIconPacks by preferenceInteractor.themedIconPacks.collectAsStateWithLifecycle()
val lazyListState = rememberLazyListState()
val padding = 12.dp
var iconPacksLocal = iconPacks
val themedIconPacksName = themedIconPacks.map { it.name }
if (isThemedIconPack) {
iconPacksLocal = if (drawerThemedIcons) {
themedIconPacks
} else {
themedIconPacks.filter { it.packageName != "" }
}
} else if (drawerThemedIcons) {
iconPacksLocal = iconPacks.filter { it.packageName == "" || !themedIconPacksName.contains(it.name) }
val iconPacksLocal = if (isThemedIconPack) {
themedIconPacks.filter { it.packageName != "" }
} else {
iconPacks
}
val selectedPack = adapter.state.value
@@ -259,7 +292,9 @@ fun IconPackGrid(
state = lazyListState,
horizontalArrangement = Arrangement.spacedBy(space = padding),
contentPadding = PaddingValues(horizontal = padding),
modifier = Modifier.padding(bottom = 6.dp, top = 6.dp).fillMaxWidth(),
modifier = Modifier
.padding(bottom = 6.dp, top = 6.dp)
.fillMaxWidth(),
) {
itemsIndexed(iconPacksLocal, { _, item -> item.packageName }) { index, item ->
IconPackItem(
@@ -306,7 +341,7 @@ fun IconPackItem(
Surface(
onClick = onClick,
shape = MaterialTheme.shapes.large,
tonalElevation = if (selected) 2.dp else 0.dp,
color = if (selected) MaterialTheme.colorScheme.surfaceContainerHighest else Color.Transparent,
modifier = modifier,
) {
Column(
@@ -314,16 +314,14 @@ public abstract class ItemInfoWithIcon extends ItemInfo {
* Returns a FastBitmapDrawable with the icon.
*/
public FastBitmapDrawable newIcon(Context context) {
return bitmap.newIcon(context);
return newIcon(context, PreferenceManager.getInstance(context).getThemedIcons().get());
}
/**
* Returns a FastBitmapDrawable with the icon and context theme applied
*/
public FastBitmapDrawable newIcon(Context context, boolean applyTheme) {
var prefs = PreferenceManager.getInstance(context);
var isThemed = applyTheme && prefs.getThemedIcons().get();
return newIcon(context, isThemed ? BitmapInfo.FLAG_THEMED : BitmapInfo.FLAG_NO_BADGE);
return newIcon(context, applyTheme ? BitmapInfo.FLAG_THEMED : BitmapInfo.FLAG_NO_BADGE);
}
/**