Custom color support for dock and drawer background

This commit is contained in:
paphonb
2019-06-11 17:53:35 +07:00
parent 74363037c8
commit 25f60a5c09
8 changed files with 129 additions and 47 deletions

View File

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

View File

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

View File

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

View File

@@ -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
}

View File

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

View File

@@ -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();

View File

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

View File

@@ -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"