From 59ec2442f899300a60402cdba69559d611bd8957 Mon Sep 17 00:00:00 2001 From: Wangtaotaoo Date: Fri, 24 Jul 2026 17:23:08 +0800 Subject: [PATCH] fix: validate highlightColor before passing to SystemUI Invalid color strings (e.g. "013" without '#' prefix) in theme configs cause SystemUI to crash with IllegalArgumentException in DynamicIslandBaseContentView.updateDarkLightMode() when Color.parseColor() is called. Add toSafeColorHex() validation in resolveColor() that catches IllegalArgumentException from Color.parseColor() and falls back to the default color hex value. This prevents malformed theme data (from imported .hbr files or legacy configs) from crashing SystemUI. --- .../service/translators/BaseTranslator.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/d4viddf/hyperbridge/service/translators/BaseTranslator.kt b/app/src/main/java/com/d4viddf/hyperbridge/service/translators/BaseTranslator.kt index 316d2eb..b6d6b92 100644 --- a/app/src/main/java/com/d4viddf/hyperbridge/service/translators/BaseTranslator.kt +++ b/app/src/main/java/com/d4viddf/hyperbridge/service/translators/BaseTranslator.kt @@ -75,13 +75,13 @@ abstract class BaseTranslator( // A. Specific Color Override val overrideColor = override?.highlightColor if (!overrideColor.isNullOrEmpty()) { - return overrideColor + return overrideColor.toSafeColorHex(defaultHex) } // B. App-Specific "Use App Colors" // If explicit true -> extract. If explicit false -> skip extraction (fall to global). if (override?.useAppColors == true) { - return getAppBrandColor(pkg) ?: theme.global.highlightColor ?: defaultHex + return (getAppBrandColor(pkg) ?: theme.global.highlightColor ?: defaultHex).toSafeColorHex(defaultHex) } } @@ -89,11 +89,26 @@ abstract class BaseTranslator( // Only run if app override didn't explicitly disable it (useAppColors != false) val appOverrideDisabled = theme.apps[pkg]?.useAppColors == false if (theme.global.useAppColors && !appOverrideDisabled && pkg != null) { - return getAppBrandColor(pkg) ?: theme.global.highlightColor ?: defaultHex + return (getAppBrandColor(pkg) ?: theme.global.highlightColor ?: defaultHex).toSafeColorHex(defaultHex) } // 3. Global Theme Highlight -> Default Fallback - return theme.global.highlightColor ?: defaultHex + return (theme.global.highlightColor ?: defaultHex).toSafeColorHex(defaultHex) + } + + /** + * Validates that a color string can be parsed by [android.graphics.Color.parseColor]. + * Returns the original string if valid, or [fallback] if parsing fails. + * This prevents SystemUI crashes caused by invalid color values in theme configs. + */ + private fun String.toSafeColorHex(fallback: String): String { + return try { + Color.parseColor(this) + this + } catch (_: IllegalArgumentException) { + Log.w("BaseTranslator", "Invalid highlight color \"$this\", falling back to \"$fallback\"") + fallback + } } private fun getAppBrandColor(pkg: String): String? {