Skip to content

Commit 2f22026

Browse files
authored
Remove allowUIAutomationTest from ChatTheme public API (#6353)
* Introduce `SampleChatTheme` to standardize theme configuration across the sample app and remove the `allowUIAutomationTest` parameter. * Add avatar snapshot tests and refactor previews. * Remove duplicated UI tests in favor of Paparazzi tests
1 parent 84ada32 commit 2f22026

26 files changed

Lines changed: 405 additions & 904 deletions

File tree

stream-chat-android-compose-sample/src/e2e/java/io/getstream/chat/android/compose/sample/ui/JwtTestActivity.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ import androidx.lifecycle.lifecycleScope
4949
import io.getstream.chat.android.client.ChatClient
5050
import io.getstream.chat.android.client.token.TokenProvider
5151
import io.getstream.chat.android.compose.sample.data.PredefinedUserCredentials
52-
import io.getstream.chat.android.compose.ui.theme.ChatTheme
5352
import io.getstream.chat.android.models.ConnectionState
5453
import io.getstream.chat.android.models.User
5554
import kotlinx.coroutines.Dispatchers
@@ -65,7 +64,7 @@ class JwtTestActivity : AppCompatActivity() {
6564
super.onCreate(savedInstanceState)
6665

6766
setContent {
68-
ChatTheme(allowUIAutomationTest = true) {
67+
SampleChatTheme {
6968
JwtTestScreen(
7069
onClick = {
7170
lifecycleScope.launch {

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/list/ChannelsActivity.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
5858
import io.getstream.chat.android.client.ChatClient
5959
import io.getstream.chat.android.client.api.models.QueryThreadsRequest
6060
import io.getstream.chat.android.client.api.state.globalStateFlow
61-
import io.getstream.chat.android.compose.sample.ChatApp
6261
import io.getstream.chat.android.compose.sample.ChatHelper
6362
import io.getstream.chat.android.compose.sample.R
6463
import io.getstream.chat.android.compose.sample.feature.channel.ChannelConstants.CHANNEL_ARG_DRAFT
@@ -67,11 +66,11 @@ import io.getstream.chat.android.compose.sample.feature.channel.add.group.AddGro
6766
import io.getstream.chat.android.compose.sample.feature.channel.isGroupChannel
6867
import io.getstream.chat.android.compose.sample.feature.reminders.MessageRemindersActivity
6968
import io.getstream.chat.android.compose.sample.ui.MessagesActivity
69+
import io.getstream.chat.android.compose.sample.ui.SampleChatTheme
7070
import io.getstream.chat.android.compose.sample.ui.channel.DirectChannelInfoActivity
7171
import io.getstream.chat.android.compose.sample.ui.channel.GroupChannelInfoActivity
7272
import io.getstream.chat.android.compose.sample.ui.component.AppBottomBar
7373
import io.getstream.chat.android.compose.sample.ui.component.AppBottomBarOption
74-
import io.getstream.chat.android.compose.sample.ui.component.CustomChatComponentFactory
7574
import io.getstream.chat.android.compose.sample.ui.login.UserLoginActivity
7675
import io.getstream.chat.android.compose.sample.ui.profile.UserProfileActivity
7776
import io.getstream.chat.android.compose.state.channels.list.ItemState
@@ -151,11 +150,7 @@ class ChannelsActivity : ComponentActivity() {
151150
val unreadChannelsCount by unreadChannelsCountFlow.collectAsStateWithLifecycle(0)
152151
val unreadThreadsCount by unreadThreadsCountFlow.collectAsStateWithLifecycle(0)
153152

154-
ChatTheme(
155-
dateFormatter = ChatApp.dateFormatter,
156-
allowUIAutomationTest = true,
157-
componentFactory = CustomChatComponentFactory(),
158-
) {
153+
SampleChatTheme {
159154
val user by channelsViewModel.user.collectAsStateWithLifecycle()
160155
val drawerState = rememberDrawerState(DrawerValue.Closed)
161156
val coroutineScope = rememberCoroutineScope()

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/MessagesActivity.kt

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import android.os.Bundle
2222
import androidx.activity.ComponentActivity
2323
import androidx.activity.compose.setContent
2424
import androidx.activity.result.contract.ActivityResultContracts
25-
import androidx.compose.foundation.isSystemInDarkTheme
2625
import androidx.compose.runtime.Composable
2726
import androidx.core.net.toUri
2827
import io.getstream.chat.android.compose.sample.ChatApp
@@ -32,14 +31,10 @@ import io.getstream.chat.android.compose.sample.ui.channel.DirectChannelInfoActi
3231
import io.getstream.chat.android.compose.sample.ui.channel.GroupChannelInfoActivity
3332
import io.getstream.chat.android.compose.sample.ui.component.CustomChatComponentFactory
3433
import io.getstream.chat.android.compose.sample.vm.SharedLocationViewModelFactory
35-
import io.getstream.chat.android.compose.ui.components.messageoptions.MessageOptionItemVisibility
3634
import io.getstream.chat.android.compose.ui.messages.ChannelScreen
3735
import io.getstream.chat.android.compose.ui.theme.AttachmentPickerConfig
38-
import io.getstream.chat.android.compose.ui.theme.ChatTheme
3936
import io.getstream.chat.android.compose.ui.theme.ChatUiConfig
4037
import io.getstream.chat.android.compose.ui.theme.ComposerConfig
41-
import io.getstream.chat.android.compose.ui.theme.MessageOptionsTheme
42-
import io.getstream.chat.android.compose.ui.theme.ReactionOptionsTheme
4338
import io.getstream.chat.android.compose.viewmodel.messages.ChannelViewModelFactory
4439
import io.getstream.chat.android.models.Channel
4540
import io.getstream.chat.android.models.ReactionSortingByLastReactionAt
@@ -78,24 +73,16 @@ class MessagesActivity : ComponentActivity() {
7873

7974
@Composable
8075
private fun SetupChatTheme() {
81-
val isInDarkMode = isSystemInDarkTheme()
8276
val locationViewModelFactory = SharedLocationViewModelFactory(cid)
83-
ChatTheme(
84-
isInDarkMode = isInDarkMode,
77+
SampleChatTheme(
8578
componentFactory = CustomChatComponentFactory(locationViewModelFactory = locationViewModelFactory),
86-
dateFormatter = ChatApp.dateFormatter,
8779
config = ChatUiConfig(
8880
composer = ComposerConfig(
8981
linkPreviewEnabled = ChatApp.isComposerLinkPreviewEnabled,
9082
floatingStyleEnabled = settings.isComposerFloatingStyleEnabled,
9183
),
9284
attachmentPicker = AttachmentPickerConfig(useSystemPicker = settings.isSystemAttachmentPickerEnabled),
9385
),
94-
allowUIAutomationTest = true,
95-
reactionOptionsTheme = ReactionOptionsTheme.defaultTheme(),
96-
messageOptionsTheme = MessageOptionsTheme.defaultTheme(
97-
optionVisibility = MessageOptionItemVisibility(),
98-
),
9986
) {
10087
SetupContent()
10188
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (c) 2014-2026 Stream.io Inc. All rights reserved.
3+
*
4+
* Licensed under the Stream License;
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://github.com/GetStream/stream-chat-android/blob/main/LICENSE
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
@file:OptIn(ExperimentalComposeUiApi::class)
18+
19+
package io.getstream.chat.android.compose.sample.ui
20+
21+
import androidx.compose.foundation.layout.Box
22+
import androidx.compose.runtime.Composable
23+
import androidx.compose.ui.ExperimentalComposeUiApi
24+
import androidx.compose.ui.Modifier
25+
import androidx.compose.ui.semantics.semantics
26+
import androidx.compose.ui.semantics.testTagsAsResourceId
27+
import io.getstream.chat.android.compose.sample.ChatApp
28+
import io.getstream.chat.android.compose.sample.ui.component.CustomChatComponentFactory
29+
import io.getstream.chat.android.compose.ui.theme.ChannelOptionsTheme
30+
import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory
31+
import io.getstream.chat.android.compose.ui.theme.ChatTheme
32+
import io.getstream.chat.android.compose.ui.theme.ChatUiConfig
33+
34+
/**
35+
* Sample app wrapper around [ChatTheme] that enables test tags as resource IDs for UIAutomator
36+
* E2E tests and sets [ChatApp.dateFormatter] and [CustomChatComponentFactory] as defaults.
37+
*/
38+
@Composable
39+
internal fun SampleChatTheme(
40+
config: ChatUiConfig = ChatUiConfig(),
41+
componentFactory: ChatComponentFactory = CustomChatComponentFactory(),
42+
channelOptionsTheme: ChannelOptionsTheme = ChannelOptionsTheme.defaultTheme(),
43+
content: @Composable () -> Unit,
44+
) {
45+
Box(modifier = Modifier.semantics { testTagsAsResourceId = true }) {
46+
ChatTheme(
47+
dateFormatter = ChatApp.dateFormatter,
48+
config = config,
49+
componentFactory = componentFactory,
50+
channelOptionsTheme = channelOptionsTheme,
51+
content = content,
52+
)
53+
}
54+
}

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/chats/ChatsActivity.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ import io.getstream.chat.android.compose.sample.feature.channel.ChannelConstants
5555
import io.getstream.chat.android.compose.sample.feature.channel.add.AddChannelActivity
5656
import io.getstream.chat.android.compose.sample.feature.channel.isGroupChannel
5757
import io.getstream.chat.android.compose.sample.feature.channel.list.CustomChatEventHandlerFactory
58+
import io.getstream.chat.android.compose.sample.ui.SampleChatTheme
5859
import io.getstream.chat.android.compose.sample.ui.component.AppBottomBar
5960
import io.getstream.chat.android.compose.sample.ui.component.AppBottomBarOption
60-
import io.getstream.chat.android.compose.sample.ui.component.CustomChatComponentFactory
6161
import io.getstream.chat.android.compose.sample.ui.login.UserLoginActivity
6262
import io.getstream.chat.android.compose.sample.ui.pinned.PinnedMessagesScreen
6363
import io.getstream.chat.android.compose.ui.channel.attachments.ChannelFilesAttachmentsScreen
@@ -158,10 +158,7 @@ class ChatsActivity : ComponentActivity() {
158158
super.onCreate(savedInstanceState)
159159

160160
setContent {
161-
ChatTheme(
162-
dateFormatter = ChatApp.dateFormatter,
163-
allowUIAutomationTest = true,
164-
componentFactory = CustomChatComponentFactory(),
161+
SampleChatTheme(
165162
channelOptionsTheme = ChannelOptionsTheme.defaultTheme(
166163
optionVisibility = ChannelOptionItemVisibility(
167164
isViewInfoVisible = AdaptiveLayoutInfo.singlePaneWindow(),

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/CustomLoginActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import io.getstream.chat.android.compose.sample.R
6565
import io.getstream.chat.android.compose.sample.data.UserCredentials
6666
import io.getstream.chat.android.compose.sample.data.customSettings
6767
import io.getstream.chat.android.compose.sample.feature.channel.list.ChannelsActivity
68+
import io.getstream.chat.android.compose.sample.ui.SampleChatTheme
6869
import io.getstream.chat.android.compose.sample.ui.chats.ChatsActivity
6970
import io.getstream.chat.android.compose.ui.theme.ChatTheme
7071
import io.getstream.chat.android.models.User
@@ -84,7 +85,7 @@ class CustomLoginActivity : AppCompatActivity() {
8485
super.onCreate(savedInstanceState)
8586

8687
setContent {
87-
ChatTheme(allowUIAutomationTest = true) {
88+
SampleChatTheme {
8889
CustomLoginScreen(
8990
onBackButtonClick = ::finish,
9091
onLoginButtonClick = { userCredentials ->

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/UserLoginActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import io.getstream.chat.android.compose.sample.data.PredefinedUserCredentials
6262
import io.getstream.chat.android.compose.sample.data.UserCredentials
6363
import io.getstream.chat.android.compose.sample.data.customSettings
6464
import io.getstream.chat.android.compose.sample.feature.channel.list.ChannelsActivity
65+
import io.getstream.chat.android.compose.sample.ui.SampleChatTheme
6566
import io.getstream.chat.android.compose.sample.ui.chats.ChatsActivity
6667
import io.getstream.chat.android.compose.ui.components.avatar.AvatarSize
6768
import io.getstream.chat.android.compose.ui.components.avatar.UserAvatar
@@ -80,7 +81,7 @@ class UserLoginActivity : AppCompatActivity() {
8081
super.onCreate(savedInstanceState)
8182

8283
setContent {
83-
ChatTheme(allowUIAutomationTest = true) {
84+
SampleChatTheme {
8485
UserLoginScreen(
8586
onUserItemClick = { userCredentials ->
8687
lifecycleScope.launch {

0 commit comments

Comments
 (0)