mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-19 18:58:19 +00:00
Custom color support for dock and drawer background
This commit is contained in:
@@ -62,4 +62,11 @@
|
||||
<item>ch.deletescape.lawnchair.colors.WallpaperSecondaryColorResolver</item>
|
||||
<item>ch.deletescape.lawnchair.colors.WallpaperTertiaryColorResolver</item>
|
||||
</string-array>
|
||||
<string-array name="resolvers_shelf_background">
|
||||
<item>ch.deletescape.lawnchair.colors.resolvers.ShelfBackgroundAutoResolver</item>
|
||||
<item>ch.deletescape.lawnchair.colors.LawnchairAccentResolver</item>
|
||||
<item>ch.deletescape.lawnchair.colors.WallpaperMainColorResolver</item>
|
||||
<item>ch.deletescape.lawnchair.colors.WallpaperSecondaryColorResolver</item>
|
||||
<item>ch.deletescape.lawnchair.colors.WallpaperTertiaryColorResolver</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
@@ -576,6 +576,7 @@
|
||||
|
||||
<string name="icon_text_scale_pref_title">Text size</string>
|
||||
<string name="text_color">Text color</string>
|
||||
<string name="background_color">Background color</string>
|
||||
|
||||
<string name="pref_notification_count_title">Display notification count</string>
|
||||
<string name="pref_notification_count_summary">Display notification count inside the dots</string>
|
||||
|
||||
@@ -21,10 +21,7 @@ import android.content.Context
|
||||
import android.graphics.Color.*
|
||||
import android.text.TextUtils
|
||||
import ch.deletescape.lawnchair.*
|
||||
import ch.deletescape.lawnchair.colors.resolvers.DockQsbAutoResolver
|
||||
import ch.deletescape.lawnchair.colors.resolvers.DrawerLabelAutoResolver
|
||||
import ch.deletescape.lawnchair.colors.resolvers.DrawerQsbAutoResolver
|
||||
import ch.deletescape.lawnchair.colors.resolvers.WorkspaceLabelAutoResolver
|
||||
import ch.deletescape.lawnchair.colors.resolvers.*
|
||||
import ch.deletescape.lawnchair.util.SingletonHolder
|
||||
import ch.deletescape.lawnchair.util.ThemedContextProvider
|
||||
import com.android.launcher3.Utilities
|
||||
@@ -155,24 +152,33 @@ class ColorEngine private constructor(val context: Context) : LawnchairPreferenc
|
||||
const val ALLAPPS_QSB_BG = "pref_allappsQsbColorResolver"
|
||||
const val ALLAPPS_ICON_LABEL = "pref_allAppsLabelColorResolver"
|
||||
const val WORKSPACE_ICON_LABEL = "pref_workspaceLabelColorResolver"
|
||||
const val DOCK_BACKGROUND = "pref_dockBackgroundColorResolver"
|
||||
const val ALLAPPS_BACKGROUND = "pref_allAppsBackgroundColorResolver"
|
||||
|
||||
fun getDefaultResolver(key: String, context: Context, engine: ColorEngine): ColorResolver {
|
||||
return when (key) {
|
||||
HOTSEAT_QSB_BG -> {
|
||||
DockQsbAutoResolver(ColorResolver.Config(key, engine, engine::onColorChanged))
|
||||
DockQsbAutoResolver(createConfig(key, engine))
|
||||
}
|
||||
ALLAPPS_QSB_BG -> {
|
||||
DrawerQsbAutoResolver(ColorResolver.Config(key, engine, engine::onColorChanged))
|
||||
DrawerQsbAutoResolver(createConfig(key, engine))
|
||||
}
|
||||
ALLAPPS_ICON_LABEL -> {
|
||||
DrawerLabelAutoResolver(ColorResolver.Config(key, engine, engine::onColorChanged))
|
||||
DrawerLabelAutoResolver(createConfig(key, engine))
|
||||
}
|
||||
WORKSPACE_ICON_LABEL -> {
|
||||
WorkspaceLabelAutoResolver(ColorResolver.Config(key, engine, engine::onColorChanged))
|
||||
WorkspaceLabelAutoResolver(createConfig(key, engine))
|
||||
}
|
||||
DOCK_BACKGROUND, ALLAPPS_BACKGROUND -> {
|
||||
ShelfBackgroundAutoResolver(createConfig(key, engine))
|
||||
}
|
||||
ACCENT -> engine.createColorResolver(key, LawnchairConfig.getInstance(context).defaultColorResolver)
|
||||
else -> engine.createColorResolver(key, LawnchairConfig.getInstance(context).defaultColorResolver)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createConfig(key: String, engine: ColorEngine)
|
||||
= ColorResolver.Config(key, engine, engine::onColorChanged)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.support.v4.graphics.ColorUtils
|
||||
import ch.deletescape.lawnchair.LawnchairLauncher
|
||||
import ch.deletescape.lawnchair.LawnchairPreferences
|
||||
import ch.deletescape.lawnchair.colors.ColorEngine
|
||||
import ch.deletescape.lawnchair.colors.ThemeAttributeColorResolver
|
||||
import ch.deletescape.lawnchair.colors.WallpaperColorResolver
|
||||
import ch.deletescape.lawnchair.theme.ThemeManager
|
||||
import com.android.launcher3.R
|
||||
@@ -92,4 +93,10 @@ class DrawerQsbDarkResolver(config: Config) : WallpaperColorResolver(config) {
|
||||
colorInfo.mainColor)
|
||||
|
||||
override fun getDisplayName() = engine.context.resources.getString(R.string.theme_dark)
|
||||
}
|
||||
}
|
||||
|
||||
@Keep
|
||||
class ShelfBackgroundAutoResolver(config: Config) : ThemeAttributeColorResolver(config) {
|
||||
|
||||
override val colorAttr = R.attr.allAppsScrimColor
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.view.View
|
||||
import ch.deletescape.lawnchair.LawnchairPreferences
|
||||
import ch.deletescape.lawnchair.blur.BlurDrawable
|
||||
import ch.deletescape.lawnchair.blur.BlurWallpaperProvider
|
||||
import ch.deletescape.lawnchair.colors.ColorEngine
|
||||
import ch.deletescape.lawnchair.dpToPx
|
||||
import ch.deletescape.lawnchair.isVisible
|
||||
import ch.deletescape.lawnchair.runOnMainThread
|
||||
@@ -61,7 +62,8 @@ import com.google.android.apps.nexuslauncher.qsb.AbstractQsbLayout
|
||||
*/
|
||||
|
||||
class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(context, attrs),
|
||||
LawnchairPreferences.OnPreferenceChangeListener, View.OnLayoutChangeListener, BlurWallpaperProvider.Listener {
|
||||
LawnchairPreferences.OnPreferenceChangeListener, View.OnLayoutChangeListener,
|
||||
BlurWallpaperProvider.Listener, ColorEngine.OnColorChangeListener {
|
||||
|
||||
private val key_radius = "pref_dockRadius"
|
||||
private val key_opacity = "pref_allAppsOpacitySB"
|
||||
@@ -70,6 +72,7 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
private val key_search_radius = "pref_searchbarRadius"
|
||||
|
||||
private val prefsToWatch = arrayOf(key_radius, key_opacity, key_dock_opacity, key_dock_arrow, key_search_radius)
|
||||
private val colorsToWatch = arrayOf(ColorEngine.Resolvers.ALLAPPS_BACKGROUND, ColorEngine.Resolvers.DOCK_BACKGROUND)
|
||||
|
||||
private val blurDrawableCallback by lazy {
|
||||
object : Drawable.Callback {
|
||||
@@ -108,7 +111,12 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
}
|
||||
private val insets = Rect()
|
||||
|
||||
private val alphaRanges = ArrayList<AlphaRange>()
|
||||
private val colorRanges = ArrayList<ColorRange>()
|
||||
|
||||
private var allAppsBackground = 0
|
||||
private var dockBackground = 0
|
||||
|
||||
private val reInitUiRunnable = this::reInitUi
|
||||
|
||||
private fun createBlurDrawable(): BlurDrawable? {
|
||||
blurDrawable?.let { if (isAttachedToWindow) it.stopListening() }
|
||||
@@ -163,6 +171,7 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
super.onAttachedToWindow()
|
||||
|
||||
prefs.addOnPreferenceChangeListener(this, *prefsToWatch)
|
||||
ColorEngine.getInstance(context).addColorChangeListeners(this, *colorsToWatch)
|
||||
mLauncher.hotseatSearchBox?.addOnLayoutChangeListener(this)
|
||||
BlurWallpaperProvider.getInstance(context).addListener(this)
|
||||
blurDrawable?.startListening()
|
||||
@@ -176,14 +185,12 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
}
|
||||
key_opacity -> {
|
||||
mEndAlpha = prefs.allAppsOpacity.takeIf { it >= 0 } ?: DEFAULT_END_ALPHA
|
||||
mEndScrim = ColorUtils.setAlphaComponent(mEndScrim, mEndAlpha)
|
||||
mEndFlatColor = ColorUtils.compositeColors(mEndScrim, ColorUtils.setAlphaComponent(
|
||||
mScrimColor, mMaxScrimAlpha))
|
||||
calculateEndScrim()
|
||||
mEndFlatColorAlpha = Color.alpha(mEndFlatColor)
|
||||
reInitUi()
|
||||
postReInitUi()
|
||||
}
|
||||
key_dock_opacity -> {
|
||||
reInitUi()
|
||||
postReInitUi()
|
||||
}
|
||||
key_dock_arrow -> {
|
||||
updateDragHandleVisibility()
|
||||
@@ -191,12 +198,32 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
key_search_radius -> {
|
||||
if (searchBlurDrawable != null) {
|
||||
searchBlurDrawable = createSearchBlurDrawable()
|
||||
reInitUi()
|
||||
postReInitUi()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onColorChange(resolver: String, color: Int, foregroundColor: Int) {
|
||||
when (resolver) {
|
||||
ColorEngine.Resolvers.ALLAPPS_BACKGROUND -> {
|
||||
allAppsBackground = color
|
||||
calculateEndScrim()
|
||||
postReInitUi()
|
||||
}
|
||||
ColorEngine.Resolvers.DOCK_BACKGROUND -> {
|
||||
dockBackground = color
|
||||
postReInitUi()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun calculateEndScrim() {
|
||||
mEndScrim = ColorUtils.setAlphaComponent(allAppsBackground, mEndAlpha)
|
||||
mEndFlatColor = ColorUtils.compositeColors(mEndScrim, ColorUtils.setAlphaComponent(
|
||||
mScrimColor, mMaxScrimAlpha))
|
||||
}
|
||||
|
||||
private fun rebuildColors() {
|
||||
val homeProgress = LauncherState.NORMAL.getScrimProgress(mLauncher)
|
||||
val recentsProgress = LauncherState.OVERVIEW.getScrimProgress(mLauncher)
|
||||
@@ -204,30 +231,36 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
val hasDockBackground = !prefs.dockGradientStyle
|
||||
val hasRecents = Utilities.isRecentsEnabled() && recentsProgress < 1f
|
||||
|
||||
val alphas = ArrayList<Pair<Float, Int>>()
|
||||
alphas.add(Pair(Float.NEGATIVE_INFINITY, mEndAlpha))
|
||||
alphas.add(Pair(0.5f, mEndAlpha))
|
||||
val fullShelfColor = ColorUtils.setAlphaComponent(allAppsBackground, mEndAlpha)
|
||||
val recentsShelfColor = ColorUtils.setAlphaComponent(allAppsBackground, super.getMidAlpha())
|
||||
val homeShelfColor = ColorUtils.setAlphaComponent(dockBackground, midAlpha)
|
||||
val nullShelfColor = ColorUtils.setAlphaComponent(
|
||||
if (hasDockBackground) dockBackground else allAppsBackground, 0)
|
||||
|
||||
val colors = ArrayList<Pair<Float, Int>>()
|
||||
colors.add(Pair(Float.NEGATIVE_INFINITY, fullShelfColor))
|
||||
colors.add(Pair(0.5f, fullShelfColor))
|
||||
if (hasRecents && hasDockBackground) {
|
||||
if (homeProgress < recentsProgress) {
|
||||
alphas.add(Pair(homeProgress, midAlpha))
|
||||
alphas.add(Pair(recentsProgress, super.getMidAlpha()))
|
||||
colors.add(Pair(homeProgress, homeShelfColor))
|
||||
colors.add(Pair(recentsProgress, recentsShelfColor))
|
||||
} else {
|
||||
alphas.add(Pair(recentsProgress, super.getMidAlpha()))
|
||||
alphas.add(Pair(homeProgress, midAlpha))
|
||||
colors.add(Pair(recentsProgress, recentsShelfColor))
|
||||
colors.add(Pair(homeProgress, homeShelfColor))
|
||||
}
|
||||
} else if (hasDockBackground) {
|
||||
alphas.add(Pair(homeProgress, midAlpha))
|
||||
colors.add(Pair(homeProgress, homeShelfColor))
|
||||
} else if (hasRecents) {
|
||||
alphas.add(Pair(recentsProgress, super.getMidAlpha()))
|
||||
colors.add(Pair(recentsProgress, recentsShelfColor))
|
||||
}
|
||||
alphas.add(Pair(1f, 0))
|
||||
alphas.add(Pair(Float.POSITIVE_INFINITY, 0))
|
||||
colors.add(Pair(1f, nullShelfColor))
|
||||
colors.add(Pair(Float.POSITIVE_INFINITY, nullShelfColor))
|
||||
|
||||
alphaRanges.clear()
|
||||
for (i in (1 until alphas.size)) {
|
||||
val alpha1 = alphas[i - 1]
|
||||
val alpha2 = alphas[i]
|
||||
alphaRanges.add(AlphaRange(alpha1.first, alpha2.first, alpha1.second, alpha2.second))
|
||||
colorRanges.clear()
|
||||
for (i in (1 until colors.size)) {
|
||||
val color1 = colors[i - 1]
|
||||
val color2 = colors[i]
|
||||
colorRanges.add(ColorRange(color1.first, color2.first, color1.second, color2.second))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,6 +272,7 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
super.onDetachedFromWindow()
|
||||
|
||||
prefs.removeOnPreferenceChangeListener(this, *prefsToWatch)
|
||||
ColorEngine.getInstance(context).removeColorChangeListeners(this, *colorsToWatch)
|
||||
mLauncher.hotseatSearchBox?.removeOnLayoutChangeListener(this)
|
||||
BlurWallpaperProvider.getInstance(context).removeListener(this)
|
||||
blurDrawable?.stopListening()
|
||||
@@ -259,7 +293,7 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
override fun setInsets(insets: Rect) {
|
||||
super.setInsets(insets)
|
||||
this.insets.set(insets)
|
||||
invalidate()
|
||||
postReInitUi()
|
||||
}
|
||||
|
||||
override fun onDrawFlatColor(canvas: Canvas) {
|
||||
@@ -334,11 +368,18 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
|
||||
mDragHandleOffset = Math.max(0f, mDragHandleBounds.top + mDragHandleSize - mShelfTop)
|
||||
|
||||
alphaRanges.forEach {
|
||||
if (!useFlatColor) {
|
||||
mShelfColor = getColorForProgress(mProgress)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getColorForProgress(progress: Float): Int {
|
||||
colorRanges.forEach {
|
||||
if (mProgress in it) {
|
||||
mShelfColor = ColorUtils.setAlphaComponent(mEndScrim, it.getAlpha(mProgress))
|
||||
return it.getColor(progress)
|
||||
}
|
||||
}
|
||||
throw IllegalStateException("No color fround for progress $progress")
|
||||
}
|
||||
|
||||
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||
@@ -360,18 +401,25 @@ class BlurScrimView(context: Context, attrs: AttributeSet) : ShelfScrimView(cont
|
||||
}
|
||||
|
||||
override fun onEnabledChanged() {
|
||||
reInitUi()
|
||||
postReInitUi()
|
||||
searchBlurDrawable = createSearchBlurDrawable()
|
||||
}
|
||||
|
||||
class AlphaRange(private val start: Float, private val end: Float,
|
||||
private val startAlpha: Int, private val endAlpha: Int) {
|
||||
private fun postReInitUi() {
|
||||
handler?.removeCallbacks(reInitUiRunnable)
|
||||
handler?.post(reInitUiRunnable)
|
||||
}
|
||||
|
||||
class ColorRange(private val start: Float, private val end: Float,
|
||||
private val startColor: Int, private val endColor: Int) {
|
||||
|
||||
private val range = start..end
|
||||
|
||||
fun getAlpha(progress: Float): Int {
|
||||
return Math.round(Utilities.mapToRange(
|
||||
progress, start, end, startAlpha.toFloat(), endAlpha.toFloat(), ACCEL))
|
||||
fun getColor(progress: Float): Int {
|
||||
if (start == Float.NEGATIVE_INFINITY) return endColor
|
||||
if (end == Float.POSITIVE_INFINITY) return startColor
|
||||
val amount = Utilities.mapToRange(progress, start, end, 0f, 1f, ACCEL)
|
||||
return ColorUtils.blendARGB(startColor, endColor, amount)
|
||||
}
|
||||
|
||||
operator fun contains(value: Float) = value in range
|
||||
|
||||
@@ -180,11 +180,11 @@ public class ShelfScrimView extends ScrimView {
|
||||
return;
|
||||
}
|
||||
|
||||
// if (mProgress <= 0) {
|
||||
// onDrawFlatColor(canvas);
|
||||
// canvas.drawColor(mShelfColor);
|
||||
// return;
|
||||
// }
|
||||
if (mProgress <= 0) {
|
||||
onDrawFlatColor(canvas);
|
||||
canvas.drawColor(mShelfColor);
|
||||
return;
|
||||
}
|
||||
|
||||
int height = getHeight();
|
||||
int width = getWidth();
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
app:summaryFormat="%.0f%%"
|
||||
app:summaryMultiplier="100"
|
||||
android:persistent="true" />
|
||||
|
||||
<ch.deletescape.lawnchair.colors.preferences.ColorPickerPreference
|
||||
android:key="pref_allAppsBackgroundColorResolver"
|
||||
android:title="@string/background_color"
|
||||
app:colorMode="RGB"
|
||||
app:resolvers="@array/resolvers_shelf_background"/>
|
||||
</ch.deletescape.lawnchair.preferences.StyledPreferenceCategory>
|
||||
|
||||
<ch.deletescape.lawnchair.preferences.StyledPreferenceCategory
|
||||
|
||||
@@ -21,6 +21,13 @@
|
||||
android:title="@string/dock_fill"
|
||||
android:dependency="pref_dockPreset"
|
||||
android:persistent="true" />
|
||||
|
||||
<ch.deletescape.lawnchair.colors.preferences.ColorPickerPreference
|
||||
android:key="pref_dockBackgroundColorResolver"
|
||||
android:title="@string/background_color"
|
||||
android:dependency="enableGradient"
|
||||
app:colorMode="RGB"
|
||||
app:resolvers="@array/resolvers_shelf_background"/>
|
||||
|
||||
<ch.deletescape.lawnchair.preferences.DockSwitchPreference
|
||||
android:key="enableShadow"
|
||||
|
||||
Reference in New Issue
Block a user