diff --git a/lawnchair/res/values/config.xml b/lawnchair/res/values/config.xml
index 58086e6e88..a86658ff37 100644
--- a/lawnchair/res/values/config.xml
+++ b/lawnchair/res/values/config.xml
@@ -50,6 +50,9 @@
default
+
+ app_icon
+
false
true
false
diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index 8b5eb508f7..4df3e92879 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -54,6 +54,8 @@
Label Size
Show Labels
Notification Dots
+ Notification Dot Color
+ App Icon Color
Preferences
About
News
diff --git a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
index 8b974325bb..3a7baa700f 100644
--- a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
+++ b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt
@@ -86,6 +86,14 @@ class PreferenceManager2(private val context: Context) : PreferenceManager {
save = { it.toString() },
)
+ val notificationDotColor = preference(
+ key = stringPreferencesKey(name = "notification_dot_color"),
+ parse = ColorOption::fromString,
+ save = ColorOption::toString,
+ onSet = { reloadHelper.reloadGrid() },
+ defaultValue = ColorOption.fromString(context.getString(R.string.config_default_notification_dot_color)),
+ )
+
val showNotificationCount = preference(
key = booleanPreferencesKey(name = "show_notification_count"),
defaultValue = context.resources.getBoolean(R.bool.config_default_show_notification_count),
diff --git a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
index 9c4eb34d9c..ec9d443c15 100644
--- a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
+++ b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt
@@ -80,6 +80,7 @@ class ThemeProvider(private val context: Context) {
getColorScheme(wallpaperPrimary ?: ColorOption.LawnchairBlue.color)
}
is ColorOption.CustomColor -> getColorScheme(accentColor.color)
+ else -> getColorScheme(ColorOption.LawnchairBlue.color)
}
private val systemColorScheme get() = when {
diff --git a/lawnchair/src/app/lawnchair/theme/color/ColorOption.kt b/lawnchair/src/app/lawnchair/theme/color/ColorOption.kt
index 6e05e37c38..ecbf235918 100644
--- a/lawnchair/src/app/lawnchair/theme/color/ColorOption.kt
+++ b/lawnchair/src/app/lawnchair/theme/color/ColorOption.kt
@@ -20,8 +20,8 @@ sealed class ColorOption {
override val colorPreferenceEntry = ColorPreferenceEntry(
this,
{ stringResource(id = R.string.system) },
- { LocalContext.current.getSystemAccent(false) },
- { LocalContext.current.getSystemAccent(true) }
+ { context -> context.getSystemAccent(false) },
+ { context -> context.getSystemAccent(true) }
)
override fun toString() = "system_accent"
@@ -33,8 +33,7 @@ sealed class ColorOption {
override val colorPreferenceEntry = ColorPreferenceEntry(
this,
{ stringResource(id = R.string.wallpaper) },
- {
- val context = LocalContext.current
+ { context ->
val wallpaperManager = WallpaperManagerCompat.INSTANCE.get(context)
val primaryColor = wallpaperManager.wallpaperColors?.primaryColor
primaryColor ?: LawnchairBlue.color
@@ -62,12 +61,25 @@ sealed class ColorOption {
override fun toString() = "custom|#${String.format("%08x", color)}"
}
+ object AppIcon : ColorOption() {
+ override val isSupported = false
+
+ override val colorPreferenceEntry = ColorPreferenceEntry(
+ this,
+ { stringResource(id = R.string.app_icon_color) },
+ { 0 }
+ )
+
+ override fun toString() = "app_icon"
+ }
+
companion object {
val LawnchairBlue = CustomColor(0xFF007FFF)
fun fromString(stringValue: String) = when (stringValue) {
"system_accent" -> SystemAccent
"wallpaper_primary" -> WallpaperPrimary
+ "app_icon" -> AppIcon
else -> instantiateCustomColor(stringValue)
}
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt
index 4588055a65..5705532b3b 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt
@@ -106,6 +106,10 @@ fun GeneralPreferences() {
adapter = prefs2.showNotificationCount.getAdapter(),
label = stringResource(id = R.string.show_notification_count),
)
+ ColorPreference(
+ preference = prefs2.notificationDotColor,
+ label = stringResource(id = R.string.notification_dots_color),
+ )
}
}
PreferenceGroup(heading = stringResource(id = R.string.colors)) {
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt
index 82bd5f3fb1..5f60281327 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt
@@ -9,6 +9,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
@Composable
@@ -17,9 +18,9 @@ fun ColorDot(
modifier: Modifier = Modifier
) {
val color = if (MaterialTheme.colors.isLight) {
- entry.lightColor()
+ entry.lightColor(LocalContext.current)
} else {
- entry.darkColor()
+ entry.darkColor(LocalContext.current)
}
ColorDot(
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorOptions.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorOptions.kt
index affe805bc3..4a19342a81 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorOptions.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorOptions.kt
@@ -21,3 +21,5 @@ val staticColors = listOf(
val dynamicColors = listOf(ColorOption.SystemAccent, ColorOption.WallpaperPrimary)
.filter(ColorOption::isSupported)
.map(ColorOption::colorPreferenceEntry)
+
+val dynamicColorsForNotificationDot = dynamicColors + listOf(ColorOption.AppIcon.colorPreferenceEntry)
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreference.kt
index 58a08153bc..8f6f1f55a5 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreference.kt
@@ -21,6 +21,7 @@ import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
import app.lawnchair.preferences.PreferenceAdapter
import app.lawnchair.preferences.getAdapter
import app.lawnchair.theme.color.ColorOption
@@ -43,7 +44,7 @@ fun ColorPreference(
val navController = LocalNavController.current
PreferenceTemplate(
title = { Text(text = label) },
- endWidget = { ColorDot(Color(adapter.state.value.colorPreferenceEntry.lightColor())) },
+ endWidget = { ColorDot(Color(adapter.state.value.colorPreferenceEntry.lightColor(LocalContext.current))) },
description = {
Text(text = adapter.state.value.colorPreferenceEntry.label())
},
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreferenceEntry.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreferenceEntry.kt
index 22b8fe44d3..534b21c7fa 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreferenceEntry.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorPreferenceEntry.kt
@@ -1,11 +1,12 @@
package app.lawnchair.ui.preferences.components.colorpreference
+import android.content.Context
import androidx.compose.runtime.Composable
import app.lawnchair.ui.theme.lightenColor
open class ColorPreferenceEntry(
val value: T,
val label: @Composable () -> String,
- val lightColor: @Composable () -> Int,
- val darkColor: @Composable () -> Int = { lightenColor(lightColor()) },
+ val lightColor: (Context) -> Int,
+ val darkColor: (Context) -> Int = { context -> lightenColor(lightColor(context)) },
)
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSelectionPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSelectionPreference.kt
index fcb5dff24c..bf0703eaf9 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSelectionPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSelectionPreference.kt
@@ -44,14 +44,23 @@ fun NavGraphBuilder.colorSelectionGraph(route: String) {
val preferenceManager2 = preferenceManager2()
val pref = when (prefKey) {
preferenceManager2.accentColor.key.name -> preferenceManager2.accentColor
+ preferenceManager2.notificationDotColor.key.name -> preferenceManager2.notificationDotColor
else -> return@composable
}
val label = when (prefKey) {
preferenceManager2.accentColor.key.name -> stringResource(id = R.string.accent_color)
+ preferenceManager2.notificationDotColor.key.name -> stringResource(id = R.string.notification_dots_color)
else -> return@composable
}
- ColorSelection(label = label, preference = pref)
-
+ val dynamicEntries = when (prefKey) {
+ preferenceManager2.notificationDotColor.key.name -> dynamicColorsForNotificationDot
+ else -> dynamicColors
+ }
+ ColorSelection(
+ label = label,
+ preference = pref,
+ dynamicEntries = dynamicEntries,
+ )
}
}
}
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/CustomColorPicker.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/CustomColorPicker.kt
index 51fcbcddb7..ffebbb0a2b 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/CustomColorPicker.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/CustomColorPicker.kt
@@ -14,6 +14,7 @@ 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.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -54,7 +55,7 @@ fun CustomColorPicker(
val focusManager = LocalFocusManager.current
- val selectedColor = selectedColorOption.colorPreferenceEntry.lightColor()
+ val selectedColor = selectedColorOption.colorPreferenceEntry.lightColor(LocalContext.current)
val selectedColorCompose = Color(selectedColor)
val textFieldValue = remember {
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt
index 7b8e6a2646..89a4b04bc9 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt
@@ -14,6 +14,7 @@ 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.LocalContext
import androidx.compose.ui.unit.dp
import app.lawnchair.ui.preferences.components.PreferenceGroup
import app.lawnchair.ui.preferences.components.colorpreference.ColorPreferenceEntry
@@ -80,9 +81,9 @@ fun ColorSwatch(
selected: Boolean
) {
val color = if (MaterialTheme.colors.isLight) {
- entry.lightColor()
+ entry.lightColor(LocalContext.current)
} else {
- entry.darkColor()
+ entry.darkColor(LocalContext.current)
}
Box(
diff --git a/platform_frameworks_libs_systemui b/platform_frameworks_libs_systemui
index 1498fe9989..a1365017ea 160000
--- a/platform_frameworks_libs_systemui
+++ b/platform_frameworks_libs_systemui
@@ -1 +1 @@
-Subproject commit 1498fe9989a59fcd6934439eb62cd12d1541aed4
+Subproject commit a1365017ea4fd104b41b33fa010eefec63e4c86c
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 487e0ce5aa..5fda036e70 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -52,6 +52,7 @@ import java.io.PrintWriter;
import app.lawnchair.DeviceProfileOverrides;
import app.lawnchair.preferences2.PreferenceManager2;
+import app.lawnchair.theme.color.ColorOption;
@SuppressLint("NewApi")
public class DeviceProfile {
@@ -502,11 +503,15 @@ public class DeviceProfile {
typeface = ResourcesCompat.getFont(context, R.font.inter_regular);
}
+ // Load dot color
+ ColorOption colorOption = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getNotificationDotColor());
+ int color = colorOption.getColorPreferenceEntry().getLightColor().invoke(context);
+
// This is done last, after iconSizePx is calculated above.
Path dotPath = GraphicsUtils.getShapePath(DEFAULT_DOT_SIZE);
- mDotRendererWorkSpace = new DotRenderer(iconSizePx, dotPath, DEFAULT_DOT_SIZE, showNotificationCount, typeface);
+ mDotRendererWorkSpace = new DotRenderer(iconSizePx, dotPath, DEFAULT_DOT_SIZE, showNotificationCount, typeface, color);
mDotRendererAllApps = iconSizePx == allAppsIconSizePx ? mDotRendererWorkSpace :
- new DotRenderer(allAppsIconSizePx, dotPath, DEFAULT_DOT_SIZE, showNotificationCount, typeface);
+ new DotRenderer(allAppsIconSizePx, dotPath, DEFAULT_DOT_SIZE, showNotificationCount, typeface, color);
}
private int getHorizontalMarginPx(InvariantDeviceProfile idp, Resources res) {