Skip to content

Commit 7fb7a97

Browse files
authored
XML: render dark/light modes in a single paparazzi snapshot instance. (#6506)
* support rendering dark/light modes in one instance * update paprazzi golden image * fix spotless violation * fix device config mismatch and re-render header's images * drop get rule in sublcasses and consume the one in our base
1 parent dcb8199 commit 7fb7a97

13 files changed

Lines changed: 29 additions & 23 deletions

stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/PaparazziViewTest.kt

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package io.getstream.chat.android.ui
1919
import android.content.Context
2020
import android.view.View
2121
import android.widget.LinearLayout
22+
import app.cash.paparazzi.DeviceConfig
2223
import app.cash.paparazzi.InstantAnimationsRule
2324
import app.cash.paparazzi.Paparazzi
2425
import coil3.ComponentRegistry
@@ -29,6 +30,7 @@ import coil3.request.Disposable
2930
import coil3.request.ErrorResult
3031
import coil3.request.ImageRequest
3132
import coil3.request.ImageResult
33+
import com.android.resources.NightMode
3234
import io.getstream.chat.android.client.test.MockedChatClientTest
3335
import io.getstream.chat.android.ui.common.helper.DateFormatter
3436
import io.getstream.chat.android.ui.common.images.internal.StreamCoil
@@ -42,23 +44,11 @@ internal abstract class PaparazziViewTest : MockedChatClientTest {
4244
@get:Rule
4345
abstract val paparazzi: Paparazzi
4446

45-
// Light mode context
46-
private val lightContext get() = paparazzi.context
47-
// TODO Figure out how to properly support dark/light modes in a single paparazzi snapshot instance.
48-
/*.createConfigurationContext(Configuration().apply {
49-
uiMode = Configuration.UI_MODE_NIGHT_NO
50-
})*/
51-
52-
// Dark mode context
53-
private val darkContext get() = paparazzi.context
54-
// TODO Figure out how to properly support dark/light modes in a single paparazzi snapshot instance.
55-
/*.createConfigurationContext(Configuration().apply {
56-
uiMode = Configuration.UI_MODE_NIGHT_YES
57-
})*/
58-
5947
@get:Rule
6048
val instantAnimations = InstantAnimationsRule()
6149

50+
abstract val deviceConfig: DeviceConfig
51+
6252
@Before
6353
fun prepare() {
6454
ChatUI.appContext = paparazzi.context
@@ -70,8 +60,8 @@ internal abstract class PaparazziViewTest : MockedChatClientTest {
7060
isInDarkMode: Boolean = false,
7161
viewFactory: (context: Context) -> View,
7262
) {
73-
val context = if (isInDarkMode) darkContext else lightContext
74-
paparazzi.snapshot(view = viewFactory(context))
63+
applyNightMode(isInDarkMode)
64+
paparazzi.snapshot(view = viewFactory(paparazzi.context))
7565
}
7666

7767
fun snapshotColumn(view: (context: Context) -> View) {
@@ -86,9 +76,14 @@ internal abstract class PaparazziViewTest : MockedChatClientTest {
8676
orientation: Int,
8777
viewFactory: (Context) -> View,
8878
) {
89-
val lightView = viewFactory(lightContext)
90-
// TODO Figure out how to properly support dark/light modes in a single paparazzi snapshot instance.
91-
// val darkView = viewFactory(darkContext)
79+
applyNightMode(false)
80+
val lightView = viewFactory(paparazzi.context)
81+
82+
applyNightMode(true)
83+
val darkView = viewFactory(paparazzi.context)
84+
85+
// Reset to light so the container and final snapshot render in light mode
86+
applyNightMode(false)
9287

9388
val container = LinearLayout(paparazzi.context).apply {
9489
this.orientation = orientation
@@ -106,12 +101,19 @@ internal abstract class PaparazziViewTest : MockedChatClientTest {
106101
)
107102
}
108103
addView(lightView, layoutParams)
109-
// TODO Figure out how to properly support dark/light modes in a single paparazzi snapshot instance.
110-
// addView(darkView, layoutParams)
104+
addView(darkView, layoutParams)
111105
}
112106

113107
paparazzi.snapshot(container)
114108
}
109+
110+
private fun applyNightMode(isDark: Boolean) {
111+
paparazzi.unsafeUpdateConfig(
112+
deviceConfig = deviceConfig.copy(
113+
nightMode = if (isDark) NightMode.NIGHT else NightMode.NOTNIGHT,
114+
),
115+
)
116+
}
115117
}
116118

117119
private object TestDateFormatter : DateFormatter {

stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/channels/header/ChannelListHeaderViewTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import org.junit.Test
2424

2525
internal class ChannelListHeaderViewTest : PaparazziViewTest() {
2626

27-
override val paparazzi = Paparazzi(deviceConfig = DeviceConfig.PIXEL_2)
27+
override val deviceConfig = DeviceConfig.PIXEL_2
28+
29+
override val paparazzi = Paparazzi(deviceConfig = deviceConfig)
2830

2931
@Test
3032
fun `connected, no user`() {

stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/channels/list/ChannelListViewTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ import org.junit.Test
3030

3131
internal class ChannelListViewTest : PaparazziViewTest() {
3232

33-
override val paparazzi = Paparazzi(deviceConfig = DeviceConfig.PIXEL_4A)
33+
override val deviceConfig = DeviceConfig.PIXEL_4A
34+
35+
override val paparazzi = Paparazzi(deviceConfig = deviceConfig)
3436

3537
@Before
3638
fun setUp() {
Loading
Loading
Loading
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)