Skip to content

Commit 7589959

Browse files
committed
ui: use real M3 themeing on TV
Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 4944762 commit 7589959

File tree

12 files changed

+80
-53
lines changed

12 files changed

+80
-53
lines changed

ui/src/main/java/com/wireguard/android/Application.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import androidx.datastore.preferences.core.PreferenceDataStoreFactory
1717
import androidx.datastore.preferences.core.Preferences
1818
import androidx.datastore.preferences.preferencesDataStoreFile
1919
import com.google.android.material.color.DynamicColors
20-
import com.google.android.material.color.DynamicColorsOptions
21-
import com.wireguard.android.activity.TvMainActivity
2220
import com.wireguard.android.backend.Backend
2321
import com.wireguard.android.backend.GoBackend
2422
import com.wireguard.android.backend.WgQuickBackend
@@ -89,9 +87,7 @@ class Application : android.app.Application() {
8987
override fun onCreate() {
9088
Log.i(TAG, USER_AGENT)
9189
super.onCreate()
92-
DynamicColors.applyToActivitiesIfAvailable(this,
93-
// TODO: Remove this second argument once the TV theme has a proper M3 color palette.
94-
DynamicColorsOptions.Builder().setPrecondition { activity, _ -> activity !is TvMainActivity }.build())
90+
DynamicColors.applyToActivitiesIfAvailable(this)
9591
rootShell = RootShell(applicationContext)
9692
toolsInstaller = ToolsInstaller(applicationContext, rootShell)
9793
preferencesDataStore = PreferenceDataStoreFactory.create { applicationContext.preferencesDataStoreFile("settings") }

ui/src/main/java/com/wireguard/android/databinding/BindingAdapters.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.wireguard.android.R
2323
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
2424
import com.wireguard.android.widget.ToggleSwitch
2525
import com.wireguard.android.widget.ToggleSwitch.OnBeforeCheckedChangeListener
26+
import com.wireguard.android.widget.TvCardView
2627
import com.wireguard.config.Attribute
2728
import com.wireguard.config.InetNetwork
2829
import java.net.InetAddress
@@ -168,4 +169,16 @@ object BindingAdapters {
168169
0
169170
}
170171
}
172+
173+
@JvmStatic
174+
@BindingAdapter("isUp")
175+
fun setIsUp(card: TvCardView, up: Boolean) {
176+
card.isUp = up
177+
}
178+
179+
@JvmStatic
180+
@BindingAdapter("isDeleting")
181+
fun setIsDeleting(card: TvCardView, deleting: Boolean) {
182+
card.isDeleting = deleting
183+
}
171184
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.wireguard.android.widget
7+
8+
import android.content.Context
9+
import android.util.AttributeSet
10+
import android.view.View
11+
import com.google.android.material.card.MaterialCardView
12+
import com.wireguard.android.R
13+
14+
class TvCardView(context: Context?, attrs: AttributeSet?) : MaterialCardView(context, attrs) {
15+
var isUp: Boolean = false
16+
set(value) {
17+
field = value
18+
refreshDrawableState()
19+
}
20+
var isDeleting: Boolean = false
21+
set(value) {
22+
field = value
23+
refreshDrawableState()
24+
}
25+
26+
override fun onCreateDrawableState(extraSpace: Int): IntArray {
27+
if (isUp || isDeleting) {
28+
val drawableState = super.onCreateDrawableState(extraSpace + (if (isUp) 1 else 0) + (if (isDeleting) 1 else 0))
29+
if (isUp) {
30+
View.mergeDrawableStates(drawableState, STATE_IS_UP)
31+
}
32+
if (isDeleting) {
33+
View.mergeDrawableStates(drawableState, STATE_IS_DELETING)
34+
}
35+
return drawableState
36+
}
37+
return super.onCreateDrawableState(extraSpace)
38+
}
39+
40+
companion object {
41+
private val STATE_IS_UP = intArrayOf(R.attr.state_isUp)
42+
private val STATE_IS_DELETING = intArrayOf(R.attr.state_isDeleting)
43+
}
44+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
<item app:state_isUp="true" app:state_isDeleting="false" android:color="?attr/colorPrimaryInverse" />
5+
<item android:state_focused="true" app:state_isDeleting="true" android:color="?attr/colorErrorContainer" />
6+
<item android:color="?attr/colorOnSurfaceInverse" />
7+
</selector>

ui/src/main/res/layout/tv_activity.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@
135135
android:visibility="@{isDeleting ? View.GONE : View.VISIBLE}"
136136
app:icon="@{filesRoot.isEmpty ? @drawable/ic_action_add_white : @drawable/ic_arrow_back}"
137137
app:iconPadding="0dp"
138-
app:iconTint="?attr/colorOnPrimary"
139138
app:layout_constraintBottom_toBottomOf="parent"
140139
app:layout_constraintEnd_toEndOf="parent" />
141140

@@ -149,7 +148,6 @@
149148
android:visibility="@{((tunnels.isEmpty &amp;&amp; !isDeleting) || !filesRoot.isEmpty) ? View.GONE : View.VISIBLE}"
150149
app:icon="@{isDeleting ? @drawable/ic_arrow_back : @drawable/ic_action_delete}"
151150
app:iconPadding="0dp"
152-
app:iconTint="?attr/colorOnPrimary"
153151
app:layout_constraintBottom_toBottomOf="parent"
154152
app:layout_constraintStart_toStartOf="parent" />
155153
</androidx.constraintlayout.widget.ConstraintLayout>

ui/src/main/res/layout/tv_file_list_item.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
android:layout_margin="8dp"
2222
android:layout_marginTop="4dp"
2323
android:layout_marginBottom="0dp"
24-
android:backgroundTint="@color/tv_card_background"
2524
android:checkable="true"
2625
android:focusable="true"
2726
app:contentPadding="8dp">
@@ -35,7 +34,6 @@
3534
android:layout_height="wrap_content"
3635
android:text="@{key}"
3736
android:textAppearance="?attr/textAppearanceTitleLarge"
38-
android:textColor="?attr/colorOnPrimary"
3937
app:layout_constraintStart_toStartOf="parent"
4038
app:layout_constraintTop_toTopOf="parent" />
4139

ui/src/main/res/layout/tv_tunnel_list_item.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,18 @@
2828
type="com.wireguard.android.model.ObservableTunnel" />
2929
</data>
3030

31-
<com.google.android.material.card.MaterialCardView
31+
<com.wireguard.android.widget.TvCardView
3232
android:layout_width="225dp"
3333
android:layout_height="110dp"
3434
android:layout_margin="8dp"
3535
android:layout_marginTop="4dp"
3636
android:layout_marginBottom="0dp"
37+
android:backgroundTint="@color/tv_list_item_tint"
3738
android:checkable="true"
3839
android:focusable="true"
3940
app:contentPadding="8dp"
40-
android:backgroundTint="@{(item.state == State.UP &amp;&amp; !isDeleting) ? @color/tv_secondary_dark_color : (isDeleting &amp;&amp; isFocused) ? @color/tv_card_delete_background : @color/tv_card_background}">
41+
app:isDeleting="@{isDeleting}"
42+
app:isUp="@{item.state == State.UP}">
4143

4244
<androidx.constraintlayout.widget.ConstraintLayout
4345
android:layout_width="match_parent"
@@ -49,7 +51,6 @@
4951
android:layout_height="wrap_content"
5052
android:text="@{item.name}"
5153
android:textAppearance="?attr/textAppearanceTitleLarge"
52-
android:textColor="?attr/colorOnPrimary"
5354
app:layout_constraintStart_toStartOf="parent"
5455
app:layout_constraintTop_toTopOf="parent"
5556
tools:text="@sample/interface_names.json/names/names/name" />
@@ -76,6 +77,6 @@
7677

7778
</androidx.constraintlayout.widget.ConstraintLayout>
7879

79-
</com.google.android.material.card.MaterialCardView>
80+
</com.wireguard.android.widget.TvCardView>
8081

8182
</layout>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
<attr name="state_multiselected" format="boolean" />
55
<attr name="colorMultiselectActiveBackground" format="reference|color" />
66
</declare-styleable>
7+
<declare-styleable name="TvCardView">
8+
<attr name="state_isUp" format="boolean" />
9+
<attr name="state_isDeleting" format="boolean" />
10+
</declare-styleable>
711
</resources>

ui/src/main/res/values/styles.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</style>
1313

1414
<!-- Various additional API-specific features in values-v*/styles.xml -->
15-
<style name="AppTheme" parent="AppThemeBase"/>
15+
<style name="AppTheme" parent="AppThemeBase" />
1616

1717
<style name="WireGuardTheme.MaterialCardView" parent="Widget.Material3.CardView.Elevated">
1818
<item name="cornerRadius">4dp</item>
@@ -36,4 +36,9 @@
3636
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
3737
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
3838
</style>
39+
40+
<style name="TvTheme" parent="AppTheme">
41+
<item name="windowActionBar">false</item>
42+
<item name="windowNoTitle">true</item>
43+
</style>
3944
</resources>

0 commit comments

Comments
 (0)