Skip to content

Commit 99d6c69

Browse files
committed
Add Dracula-M3, Nord, Monokai, Ayu, Catppuccin themes; fix appbar crash
Five new full-fledged M3 dark themes surfaced by name in the modern picker (legacy Dracula id 23 left untouched): - Dracula-M3 (id 26), Nord (27), Monokai (28), Ayu (29), Catppuccin (30). - Each: official palette in colors.xml + day/night styles with the full dark canvas, M3 role overrides, black chrome (surface app/bottom bars, dark ActionBar overlay, themed tabs), status semantics, and a visible connected FAB icon (fabConnectedColor = on-primary). Registered in Theme.kt (ids, style maps, MODERN_THEMES, DARK_ONLY_THEMES) + strings. Fix app-bar inflation crash: appBarBackgroundColor must resolve to a CONCRETE @color, not an attr reference. android:background reads it as a drawable via getDrawableForDensity, which does not follow attr-to-attr indirection (?attr -> ?attr crashed AppBarLayout/BottomAppBar inflation). Each theme now sets appBarBackgroundColor to a concrete color matching its colorPrimary (legacy) or dark canvas (modern). StatsBar drops its explicit backgroundTint and inherits the per-theme bottomAppBarStyle instead. Verified on Android: all 6 modern themes apply with correct accents, dark chrome, visible FAB icon, no crashes; legacy themes unchanged.
1 parent 67636f3 commit 99d6c69

7 files changed

Lines changed: 1167 additions & 13 deletions

File tree

app/src/main/java/io/nekohasekai/sagernet/utils/Theme.kt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,21 @@ object Theme {
3434
const val DRACULA = 23
3535
const val DYNAMIC = 24
3636
const val DARK_HIGH_CONTRAST = 25
37+
const val DRACULA_M3 = 26
38+
const val NORD = 27
39+
const val MONOKAI = 28
40+
const val AYU = 29
41+
const val CATPPUCCIN = 30
3742

3843
/**
3944
* Themes that only make sense in dark mode: selecting one forces night mode
4045
* on so its dark canvas (values-night) takes effect, and the prior night
4146
* setting is restored on exit (see SettingsPreferenceFragment). Dracula was
42-
* the first such theme; Dark High Contrast (OLED black) is dark-only too.
47+
* the first such theme; the modern M3 themes are dark-only too.
4348
*/
44-
val DARK_ONLY_THEMES = setOf(DRACULA, DARK_HIGH_CONTRAST)
49+
val DARK_ONLY_THEMES = setOf(
50+
DRACULA, DARK_HIGH_CONTRAST, DRACULA_M3, NORD, MONOKAI, AYU, CATPPUCCIN,
51+
)
4552

4653
private fun defaultTheme() = PINK_SSR
4754

@@ -61,6 +68,11 @@ object Theme {
6168
*/
6269
val MODERN_THEMES: List<ThemeInfo> = listOf(
6370
ThemeInfo(DARK_HIGH_CONTRAST, R.string.theme_dark_high_contrast, R.color.dhc_primary),
71+
ThemeInfo(DRACULA_M3, R.string.theme_dracula_m3, R.color.draculam3_primary),
72+
ThemeInfo(NORD, R.string.theme_nord, R.color.nord_primary),
73+
ThemeInfo(MONOKAI, R.string.theme_monokai, R.color.monokai_primary),
74+
ThemeInfo(AYU, R.string.theme_ayu, R.color.ayu_primary),
75+
ThemeInfo(CATPPUCCIN, R.string.theme_catppuccin, R.color.catppuccin_primary),
6476
ThemeInfo(DYNAMIC, R.string.theme_dynamic, R.color.color_dynamic_swatch),
6577
)
6678

@@ -106,6 +118,11 @@ object Theme {
106118
VERDANT_MINT -> R.style.Theme_SagerNet_VerdantMint
107119
DRACULA -> R.style.Theme_SagerNet_Dracula
108120
DARK_HIGH_CONTRAST -> R.style.Theme_SagerNet_DarkHighContrast
121+
DRACULA_M3 -> R.style.Theme_SagerNet_DraculaM3
122+
NORD -> R.style.Theme_SagerNet_Nord
123+
MONOKAI -> R.style.Theme_SagerNet_Monokai
124+
AYU -> R.style.Theme_SagerNet_Ayu
125+
CATPPUCCIN -> R.style.Theme_SagerNet_Catppuccin
109126
DYNAMIC -> R.style.Theme_SagerNet
110127
else -> getTheme(defaultTheme())
111128
}
@@ -137,6 +154,11 @@ object Theme {
137154
VERDANT_MINT -> R.style.Theme_SagerNet_Dialog_VerdantMint
138155
DRACULA -> R.style.Theme_SagerNet_Dialog_Dracula
139156
DARK_HIGH_CONTRAST -> R.style.Theme_SagerNet_Dialog_DarkHighContrast
157+
DRACULA_M3 -> R.style.Theme_SagerNet_Dialog_DraculaM3
158+
NORD -> R.style.Theme_SagerNet_Dialog_Nord
159+
MONOKAI -> R.style.Theme_SagerNet_Dialog_Monokai
160+
AYU -> R.style.Theme_SagerNet_Dialog_Ayu
161+
CATPPUCCIN -> R.style.Theme_SagerNet_Dialog_Catppuccin
140162
DYNAMIC -> R.style.Theme_SagerNet_Dialog
141163
else -> getDialogTheme(defaultTheme())
142164
}

app/src/main/res/layout/layout_main.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
android:layout_height="wrap_content"
2626
android:layout_gravity="bottom"
2727
android:nextFocusUp="@+id/fab"
28-
app:backgroundTint="?attr/appBarBackgroundColor"
2928
app:contentInsetStart="0dp"
3029
app:fabAlignmentMode="center"
3130
app:fabAnchorMode="cradle"

app/src/main/res/values-night/themes.xml

Lines changed: 481 additions & 1 deletion
Large diffs are not rendered by default.

app/src/main/res/values/attrs.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@
4949
<!-- Tonal "elevated surface" color for cards (route / group); each theme
5050
variant tints toward its own primary. -->
5151
<attr name="cardElevatedSurfaceColor" format="color" />
52-
<!-- Background for the top app bar / toolbar and the bottom status bar.
53-
Defaults to colorPrimary (legacy single-accent chrome); full M3 dark
54-
themes (Dark High Contrast) override it with colorSurface so the chrome
55-
is the dark canvas and the accent is reserved for actions/selection. -->
52+
<!-- Background for the top app bar / toolbar and tab strips. Each theme sets
53+
this to a CONCRETE @color (matching its colorPrimary for legacy themes,
54+
or the dark canvas for full M3 dark themes). It must not be an attr
55+
reference: android:background resolves it as a drawable and does not
56+
follow attr-to-attr indirection (that crashed AppBarLayout inflation). -->
5657
<attr name="appBarBackgroundColor" format="color" />
5758
</resources>

app/src/main/res/values/colors.xml

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,114 @@
400400
<color name="dhc_300">#2EA043</color> <!-- colorMaterial300 stand-in -->
401401
<color name="card_elevated_dhc">#0D0D0D</color>
402402

403+
<!-- ===================== Phase 3: modern M3 dark themes =====================
404+
Each is a full M3 dark theme surfaced by name in the picker. Base
405+
declarations live here so resources always resolve; the live dark canvas
406+
is applied via the theme styles (these themes force night mode on). -->
407+
408+
<!-- Dracula-M3 (official palette; separate from the legacy Dracula id 23). -->
409+
<color name="draculam3_primary">#BD93F9</color> <!-- purple -->
410+
<color name="draculam3_primary_dark">#6272A4</color> <!-- comment blue -->
411+
<color name="draculam3_on_primary">#282A36</color>
412+
<color name="draculam3_accent">#FF79C6</color> <!-- pink -->
413+
<color name="draculam3_blue">#8BE9FD</color> <!-- cyan -->
414+
<color name="draculam3_background">#282A36</color>
415+
<color name="draculam3_surface">#343746</color>
416+
<color name="draculam3_surface_variant">#3C3F52</color>
417+
<color name="draculam3_container">#44475A</color>
418+
<color name="draculam3_on_surface">#F8F8F2</color>
419+
<color name="draculam3_on_surface_variant">#C9CEE3</color>
420+
<color name="draculam3_outline">#6272A4</color>
421+
<color name="draculam3_outline_variant">#3C3F52</color>
422+
<color name="draculam3_green">#50FA7B</color>
423+
<color name="draculam3_red">#FF5555</color>
424+
<color name="draculam3_yellow">#F1FA8C</color>
425+
<color name="draculam3_100">#44475A</color>
426+
<color name="draculam3_300">#6272A4</color>
427+
<color name="card_elevated_draculam3">#343746</color>
428+
429+
<!-- Nord (official palette). -->
430+
<color name="nord_primary">#88C0D0</color> <!-- frost cyan -->
431+
<color name="nord_primary_dark">#5E81AC</color> <!-- frost deep blue -->
432+
<color name="nord_on_primary">#2E3440</color>
433+
<color name="nord_accent">#81A1C1</color> <!-- frost blue -->
434+
<color name="nord_blue">#81A1C1</color>
435+
<color name="nord_background">#2E3440</color>
436+
<color name="nord_surface">#3B4252</color>
437+
<color name="nord_surface_variant">#434C5E</color>
438+
<color name="nord_container">#434C5E</color>
439+
<color name="nord_on_surface">#ECEFF4</color>
440+
<color name="nord_on_surface_variant">#D8DEE9</color>
441+
<color name="nord_outline">#4C566A</color>
442+
<color name="nord_outline_variant">#3B4252</color>
443+
<color name="nord_green">#A3BE8C</color>
444+
<color name="nord_red">#BF616A</color>
445+
<color name="nord_yellow">#EBCB8B</color>
446+
<color name="nord_100">#434C5E</color>
447+
<color name="nord_300">#5E81AC</color>
448+
<color name="card_elevated_nord">#3B4252</color>
449+
450+
<!-- Monokai (classic palette). -->
451+
<color name="monokai_primary">#A6E22E</color> <!-- green -->
452+
<color name="monokai_primary_dark">#75A813</color>
453+
<color name="monokai_on_primary">#272822</color>
454+
<color name="monokai_accent">#66D9EF</color> <!-- blue -->
455+
<color name="monokai_blue">#66D9EF</color>
456+
<color name="monokai_background">#272822</color>
457+
<color name="monokai_surface">#31322B</color>
458+
<color name="monokai_surface_variant">#3A3B33</color>
459+
<color name="monokai_container">#3E3D32</color>
460+
<color name="monokai_on_surface">#F8F8F2</color>
461+
<color name="monokai_on_surface_variant">#CFCFC2</color>
462+
<color name="monokai_outline">#75715E</color>
463+
<color name="monokai_outline_variant">#3A3B33</color>
464+
<color name="monokai_green">#A6E22E</color>
465+
<color name="monokai_red">#F92672</color> <!-- pink/red -->
466+
<color name="monokai_yellow">#E6DB74</color>
467+
<color name="monokai_100">#3E3D32</color>
468+
<color name="monokai_300">#75715E</color>
469+
<color name="card_elevated_monokai">#31322B</color>
470+
471+
<!-- Ayu Mirage (official palette). -->
472+
<color name="ayu_primary">#FFCC66</color> <!-- amber accent -->
473+
<color name="ayu_primary_dark">#FFA759</color> <!-- orange -->
474+
<color name="ayu_on_primary">#1F2430</color>
475+
<color name="ayu_accent">#5CCFE6</color> <!-- cyan -->
476+
<color name="ayu_blue">#5CCFE6</color>
477+
<color name="ayu_background">#1F2430</color>
478+
<color name="ayu_surface">#232834</color>
479+
<color name="ayu_surface_variant">#2A303C</color>
480+
<color name="ayu_container">#2D3440</color>
481+
<color name="ayu_on_surface">#E6E1CF</color>
482+
<color name="ayu_on_surface_variant">#B8B5A5</color>
483+
<color name="ayu_outline">#54596B</color>
484+
<color name="ayu_outline_variant">#2A303C</color>
485+
<color name="ayu_green">#BAE67E</color>
486+
<color name="ayu_red">#FF6666</color>
487+
<color name="ayu_yellow">#FFD580</color>
488+
<color name="ayu_100">#2D3440</color>
489+
<color name="ayu_300">#FFA759</color>
490+
<color name="card_elevated_ayu">#232834</color>
491+
492+
<!-- Catppuccin Mocha (official palette). -->
493+
<color name="catppuccin_primary">#CBA6F7</color> <!-- mauve -->
494+
<color name="catppuccin_primary_dark">#B4A0E5</color>
495+
<color name="catppuccin_on_primary">#1E1E2E</color>
496+
<color name="catppuccin_accent">#89B4FA</color> <!-- blue -->
497+
<color name="catppuccin_blue">#89B4FA</color>
498+
<color name="catppuccin_background">#1E1E2E</color>
499+
<color name="catppuccin_surface">#28283D</color>
500+
<color name="catppuccin_surface_variant">#313244</color>
501+
<color name="catppuccin_container">#45475A</color>
502+
<color name="catppuccin_on_surface">#CDD6F4</color>
503+
<color name="catppuccin_on_surface_variant">#BAC2DE</color>
504+
<color name="catppuccin_outline">#6C7086</color>
505+
<color name="catppuccin_outline_variant">#313244</color>
506+
<color name="catppuccin_green">#A6E3A1</color>
507+
<color name="catppuccin_red">#F38BA8</color>
508+
<color name="catppuccin_yellow">#F9E2AF</color>
509+
<color name="catppuccin_100">#45475A</color>
510+
<color name="catppuccin_300">#6C7086</color>
511+
<color name="card_elevated_catppuccin">#28283D</color>
512+
403513
</resources>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<string name="theme">Theme</string>
1717
<string name="theme_dynamic">Dynamic (Material You)</string>
1818
<string name="theme_dark_high_contrast">Dark High Contrast</string>
19+
<string name="theme_dracula_m3">Dracula</string>
20+
<string name="theme_nord">Nord</string>
21+
<string name="theme_monokai">Monokai</string>
22+
<string name="theme_ayu">Ayu</string>
23+
<string name="theme_catppuccin">Catppuccin</string>
1924
<string name="theme_classic_colors">Classic colors…</string>
2025
<string name="theme_classic_color_swatch">Color theme %1$d</string>
2126
<string name="document">Document</string>

0 commit comments

Comments
 (0)