Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 26 additions & 18 deletions lawnchair/src/app/lawnchair/icons/LawnchairThemeManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ import android.content.Context
import android.util.Log
import app.lawnchair.icons.shape.IconShape
import app.lawnchair.icons.shape.PathShapeDelegate
import app.lawnchair.preferences.PreferenceChangeListener
import app.lawnchair.preferences.PreferenceManager
import app.lawnchair.preferences2.PreferenceManager2
import com.android.launcher3.EncryptionType
import com.android.launcher3.LauncherPrefChangeListener
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.LauncherPrefs.Companion.backedUpItem
import com.android.launcher3.concurrent.annotations.Ui
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppSingleton
Expand All @@ -17,11 +16,13 @@ import com.android.launcher3.util.DaggerSingletonTracker
import com.android.launcher3.util.LooperExecutor
import com.patrykmichalik.opto.core.firstBlocking
import javax.inject.Inject
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.plus

@LauncherAppSingleton
class LawnchairThemeManager
Expand All @@ -33,6 +34,7 @@ constructor(
private val iconControllerFactory: IconControllerFactory,
private val lifecycle: DaggerSingletonTracker,
private val prefs2: PreferenceManager2,
private val prefs1: PreferenceManager,
) : ThemeManager(
context,
uiExecutor,
Expand All @@ -42,29 +44,30 @@ constructor(
) {
override var iconState = parseIconStateV2(null)

private val prefListener = PreferenceChangeListener {
uiExecutor.execute { verifyIconState() }
}

init {
val scope = MainScope()
val scope = MainScope() + CoroutineName("LawnchairThemeManager")
merge(
prefs2.iconShape.get(),
prefs2.customIconShape.get(),
).onEach { verifyIconState() }
.launchIn(scope)

// Listen for specific Lawnchair SharedPreferences it's easier than trying to make prefs1 work with listener
val drawerThemedIcons = backedUpItem("drawer_themed_icons", false, EncryptionType.DEVICE_PROTECTED)
val forceMonochrome = backedUpItem("pref_forceIconMonochrome", false, EncryptionType.DEVICE_PROTECTED)
val keys = listOf(drawerThemedIcons, forceMonochrome)
val keysArray = keys.toTypedArray()
val prefKeySet = keys.map { it.sharedPrefKey }

val prefListener = LauncherPrefChangeListener { key ->
if (prefKeySet.contains(key)) verifyIconState()
}
prefs.addListener(prefListener, *keysArray)
val statePrefs1 = listOf(
prefs1.wrapAdaptiveIcons,
prefs1.transparentIconBackground,
prefs1.shadowBGIcons,
prefs1.coloredBackgroundLightness,
prefs1.forceIconMonochrome,
)
statePrefs1.forEach { it.addListener(prefListener) }

lifecycle.addCloseable {
prefs.removeListener(prefListener, *keysArray)
scope.cancel()
statePrefs1.forEach { it.removeListener(prefListener) }
}
Comment thread
validcube marked this conversation as resolved.
}

Expand All @@ -76,6 +79,10 @@ constructor(
listeners.forEach { it.onThemeChanged() }
}

private fun prefs1State(): String = "${prefs1.wrapAdaptiveIcons.get()},${prefs1.transparentIconBackground.get()}," +
"${prefs1.shadowBGIcons.get()},${prefs1.coloredBackgroundLightness.get()}," +
"${prefs1.forceIconMonochrome.get()}"

private fun parseIconStateV2(oldState: IconState?): IconState {
val currentAppShape: IconShape = try {
prefs2.iconShape.firstBlocking()
Expand All @@ -91,8 +98,9 @@ constructor(
IconShape.Circle
}

val appShapeKey = currentAppShape.getHashString()
val folderShapeKey = currentFolderShape.getHashString()
val currentPrefs1State = prefs1State()
val appShapeKey = currentAppShape.getHashString() + currentPrefs1State
val folderShapeKey = currentFolderShape.getHashString() + currentPrefs1State

val appShape =
if (oldState != null && oldState.iconMask == appShapeKey) {
Expand Down
3 changes: 3 additions & 0 deletions lawnchair/src/app/lawnchair/icons/ThemeManagerModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package app.lawnchair.icons

import android.content.Context
import app.lawnchair.preferences.PreferenceManager
import app.lawnchair.preferences2.PreferenceManager2
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.concurrent.annotations.Ui
Expand All @@ -24,6 +25,7 @@ class ThemeManagerModule {
lifecycle: DaggerSingletonTracker,
iconControllerFactory: ThemeManager.IconControllerFactory,
prefs2: PreferenceManager2,
prefs1: PreferenceManager,
): ThemeManager {
return LawnchairThemeManager(
context = context,
Expand All @@ -32,6 +34,7 @@ class ThemeManagerModule {
lifecycle = lifecycle,
iconControllerFactory = iconControllerFactory,
prefs2 = prefs2,
prefs1 = prefs1,
)
}
}
29 changes: 18 additions & 11 deletions lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@ import app.lawnchair.util.isGestureNavContractCompatible
import app.lawnchair.util.isOnePlusStock
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.InvariantDeviceProfile.INDEX_DEFAULT
import com.android.launcher3.LauncherAppState
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.graphics.ThemeManager
import com.android.launcher3.model.DeviceGridState
import com.android.launcher3.util.ComponentKey
import com.android.launcher3.util.DaggerSingletonObject
import com.android.launcher3.util.Executors
import com.android.launcher3.util.SafeCloseable
import com.android.quickstep.RecentsModel
import javax.inject.Inject
Expand All @@ -44,8 +46,13 @@ class PreferenceManager @Inject constructor(
SafeCloseable {
private val idp get() = InvariantDeviceProfile.INSTANCE.get(context)
private val mRecentsModel get() = RecentsModel.INSTANCE.get(context)
private val themeManager = ThemeManager.INSTANCE.get(context)
private val reloadIcons: () -> Unit = { mRecentsModel.onThemeChanged() }
private val reloadIcons: () -> Unit = {
mRecentsModel.onThemeChanged()
Executors.MODEL_EXECUTOR.execute {
LauncherAppState.INSTANCE.get(context).iconCache.clearMemoryCache()
LauncherAppState.INSTANCE.get(context).model.reloadIfActive()
}
}
private val reloadGrid: () -> Unit = { idp.onPreferencesChanged(context) }

private val recreate = {
Expand All @@ -54,11 +61,11 @@ class PreferenceManager @Inject constructor(
}

val iconPackPackage = StringPref("pref_iconPackPackage", "", reloadIcons)
val themedIconPackPackage = StringPref("pref_themedIconPackPackage", "", recreate)
val themedIconPackPackage = StringPref("pref_themedIconPackPackage", "", reloadIcons)
val allowRotation = BoolPref("pref_allowRotation", false)
val wrapAdaptiveIcons = BoolPref("prefs_wrapAdaptive", true, recreate)
val transparentIconBackground = BoolPref("prefs_transparentIconBackground", false, recreate)
val shadowBGIcons = BoolPref("pref_shadowBGIcons", true, recreate)
val wrapAdaptiveIcons = BoolPref("prefs_wrapAdaptive", true, reloadIcons)
val transparentIconBackground = BoolPref("prefs_transparentIconBackground", false, reloadIcons)
val shadowBGIcons = BoolPref("pref_shadowBGIcons", true, reloadIcons)
val addIconToHome = BoolPref("pref_add_icon_to_home", true)
val hotseatColumns = IntPref("pref_hotseatColumns", 4, reloadGrid)
val workspaceColumns = IntPref("pref_workspaceColumns", 4)
Expand All @@ -67,7 +74,7 @@ class PreferenceManager @Inject constructor(
val folderRows = IdpIntPref("pref_folderRows", { numFolderRows[INDEX_DEFAULT] }, reloadGrid)

val drawerOpacity = FloatPref("pref_drawerOpacity", .4f, recreate)
val coloredBackgroundLightness = FloatPref("pref_coloredBackgroundLightness", 1F, recreate)
val coloredBackgroundLightness = FloatPref("pref_coloredBackgroundLightness", 1F, reloadIcons)
val feedProvider = StringPref("pref_feedProvider", "")
val ignoreFeedWhitelist = BoolPref("pref_ignoreFeedWhitelist", false)
val launcherTheme = StringPref("pref_launcherTheme", "system")
Expand Down Expand Up @@ -110,9 +117,9 @@ class PreferenceManager @Inject constructor(
val searchResultSettingsEntry = BoolPref("pref_searchResultSettingsEntry", false, recreate)
val searchResulRecentSuggestion = BoolPref("pref_searchResultRecentSuggestion", false, recreate)

val themedIcons = BoolPref("themed_icons", false, recreate)
val drawerThemedIcons = BoolPref("drawer_themed_icons", false, recreate)
val tintIconPackBackgrounds = BoolPref("tint_icon_pack_backgrounds", false, recreate)
val themedIcons = BoolPref("themed_icons", false, reloadIcons)
val drawerThemedIcons = BoolPref("drawer_themed_icons", false, reloadIcons)
val tintIconPackBackgrounds = BoolPref("tint_icon_pack_backgrounds", false, reloadIcons)

val hotseatQsbCornerRadius = FloatPref("pref_hotseatQsbCornerRadius", 1F, recreate)
val hotseatQsbAlpha = IntPref("pref_searchHotseatTranparency", 100, recreate)
Expand Down Expand Up @@ -151,7 +158,7 @@ class PreferenceManager @Inject constructor(
context.getApkVersionComparison().first[0],
)

val forceIconMonochrome = BoolPref("pref_forceIconMonochrome", false, recreate)
val forceIconMonochrome = BoolPref("pref_forceIconMonochrome", false, reloadIcons)

override fun close() {
TODO("Not yet implemented")
Expand Down