Skip to content

Commit 5e54a71

Browse files
committed
Fix FAB tint regression and complete Dracula dialog overrides
Addresses reviewer feedback on PR: - P1: applyStateTint set imageTintList to ?textColorPrimary on every theme, which on non-Dracula light themes painted the connect-FAB icon a dark/wrong color, and cleared the tint to null on transient states. Default statusConnectedColor/statusStoppedColor to ?attr/colorOnPrimary (the FAB's normal on-primary icon color) and use colorOnPrimary for transient states, so non-Dracula themes keep their original appearance. StatsBar status text uses the same fallback (it sits on the colorPrimary bar). - Major/P2: add the four missing semantic overrides (profileName/status/ testFail) to Theme.SagerNet.Dialog.Dracula in both day and night so the Dracula dialog palette stays consistent. Verified in compiled APK: base theme status attrs resolve to ?colorOnPrimary; Dracula resolves to yellow/green/red.
1 parent ae4854d commit 5e54a71

5 files changed

Lines changed: 23 additions & 14 deletions

File tree

app/src/main/java/io/nekohasekai/sagernet/widget/ServiceButton.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,15 @@ class ServiceButton @JvmOverloads constructor(
133133
}
134134

135135
private fun applyStateTint(state: BaseService.State) {
136-
// Tint the connect FAB icon by state: connected=green, stopped=red,
137-
// transient states neutral (cleared). Non-Dracula themes default these
138-
// attrs to the primary text color, so there is no visible change.
136+
// Tint the connect FAB icon by state: connected=green, stopped=red. For
137+
// transient states (and on non-Dracula themes) fall back to colorOnPrimary,
138+
// which is the FAB's normal icon color, so those themes look unchanged.
139139
val attr = when (state) {
140140
BaseService.State.Connected -> R.attr.statusConnectedColor
141141
BaseService.State.Stopped -> R.attr.statusStoppedColor
142-
else -> null
142+
else -> com.google.android.material.R.attr.colorOnPrimary
143143
}
144-
imageTintList = attr?.let { ColorStateList.valueOf(context.getColorAttr(it)) }
144+
imageTintList = ColorStateList.valueOf(context.getColorAttr(attr))
145145
}
146146

147147
private fun changeState(icon: AnimatedState, animate: Boolean) {

app/src/main/java/io/nekohasekai/sagernet/widget/StatsBar.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,13 @@ class StatsBar @JvmOverloads constructor(
8282

8383
private fun setStatusColorByState(state: BaseService.State) {
8484
// Connected = statusConnectedColor, Stopped = statusStoppedColor, transient
85-
// states stay neutral. For non-Dracula themes these attrs default to the
86-
// primary text color, so there is no visible change.
85+
// states use colorOnPrimary (the bar's normal on-primary text color). For
86+
// non-Dracula themes the connected/stopped attrs also default to
87+
// colorOnPrimary, so there is no visible change.
8788
val attr = when (state) {
8889
BaseService.State.Connected -> R.attr.statusConnectedColor
8990
BaseService.State.Stopped -> R.attr.statusStoppedColor
90-
else -> android.R.attr.textColorPrimary
91+
else -> com.google.android.material.R.attr.colorOnPrimary
9192
}
9293
statusText.setTextColor(context.getColorAttr(attr))
9394
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,9 @@
4848
<item name="android:colorBackground">@color/dracula_background</item>
4949
<item name="colorOnBackground">@color/dracula_on_surface</item>
5050
<item name="protocolColor">@color/color_dracula_green</item>
51+
<item name="profileNameColor">@color/color_dracula_yellow</item>
52+
<item name="statusConnectedColor">@color/color_dracula_green</item>
53+
<item name="statusStoppedColor">@color/color_dracula_red</item>
54+
<item name="testFailColor">@color/color_dracula_red</item>
5155
</style>
5256
</resources>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
<!-- Protocol/type label color; defaults to accent, Dracula overrides green. -->
99
<item name="protocolColor">?attr/accentOrTextSecondary</item>
1010
<item name="profileNameColor">?android:attr/textColorPrimary</item>
11-
<item name="statusConnectedColor">?android:attr/textColorPrimary</item>
12-
<item name="statusStoppedColor">?android:attr/textColorPrimary</item>
11+
<item name="statusConnectedColor">?attr/colorOnPrimary</item>
12+
<item name="statusStoppedColor">?attr/colorOnPrimary</item>
1313
<item name="testFailColor">@color/material_red_500</item>
1414
<item name="actionModeCloseDrawable">@drawable/ic_navigation_close</item>
1515
<item name="colorButtonNormal">?colorAccent</item>

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
<!-- Per-theme semantic colors; default to primary text (no visible change),
88
Dracula overrides them. -->
99
<item name="profileNameColor">?android:attr/textColorPrimary</item>
10-
<item name="statusConnectedColor">?android:attr/textColorPrimary</item>
11-
<item name="statusStoppedColor">?android:attr/textColorPrimary</item>
10+
<item name="statusConnectedColor">?attr/colorOnPrimary</item>
11+
<item name="statusStoppedColor">?attr/colorOnPrimary</item>
1212
<item name="testFailColor">@color/material_red_500</item>
1313
<!-- Default nav-drawer selected-item fill; also satisfies the
1414
?itemShapeFillColor self-reference in @color/navigation_item so the
@@ -73,8 +73,8 @@
7373
<item name="actionBarStyle">@style/Widget.MaterialComponents.ActionBar.Solid</item>
7474
<item name="protocolColor">?attr/accentOrTextSecondary</item>
7575
<item name="profileNameColor">?android:attr/textColorPrimary</item>
76-
<item name="statusConnectedColor">?android:attr/textColorPrimary</item>
77-
<item name="statusStoppedColor">?android:attr/textColorPrimary</item>
76+
<item name="statusConnectedColor">?attr/colorOnPrimary</item>
77+
<item name="statusStoppedColor">?attr/colorOnPrimary</item>
7878
<item name="testFailColor">@color/material_red_500</item>
7979
<item name="itemShapeFillColor">?colorPrimary</item>
8080
<item name="actionModeCloseDrawable">@drawable/ic_navigation_close</item>
@@ -667,6 +667,10 @@
667667
<item name="colorMaterial300">@color/color_dracula_300</item>
668668
<item name="cardElevatedSurfaceColor">@color/card_elevated_dracula</item>
669669
<item name="protocolColor">@color/color_dracula_green</item>
670+
<item name="profileNameColor">@color/color_dracula_yellow</item>
671+
<item name="statusConnectedColor">@color/color_dracula_green</item>
672+
<item name="statusStoppedColor">@color/color_dracula_red</item>
673+
<item name="testFailColor">@color/color_dracula_red</item>
670674
</style>
671675

672676
<style name="Theme.Start" parent="Theme.MaterialComponents.DayNight">

0 commit comments

Comments
 (0)