From e400abdd4c007c72f5b5328fb1b14f92d9958b23 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Tue, 1 Jul 2025 13:30:21 +0530 Subject: [PATCH 1/5] feature: Add random user for e2e testing --- .../video/android/data/InMemoryStore.kt | 26 ++++++++++++++++ .../video/android/data/InMemoryStoreImpl.kt | 31 +++++++++++++++++++ .../video/android/data/NoopMemoryStoreImpl.kt | 26 ++++++++++++++++ .../getstream/video/android/di/AppModule.kt | 15 +++++++++ .../android/tooling/util/StreamFlavors.kt | 25 +++++++++++++++ .../video/android/ui/join/CallJoinScreen.kt | 3 +- .../ui/outgoing/DirectCallJoinViewModel.kt | 17 +++++++--- 7 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt new file mode 100644 index 00000000000..a7c724a7e9f --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.data + +import io.getstream.video.android.model.User + +interface InMemoryStore { + + fun saveUser(user: User) + + fun getUser(): User? +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt new file mode 100644 index 00000000000..66d1e80d6bf --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.data + +import io.getstream.video.android.model.User + +class InMemoryStoreImpl : InMemoryStore { + private var temporaryUser: User? = null + + override fun saveUser(user: User) { + temporaryUser = user + } + + override fun getUser(): User? { + return temporaryUser + } +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt new file mode 100644 index 00000000000..801f25e2c3d --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.data + +import io.getstream.video.android.model.User + +class NoopMemoryStoreImpl : InMemoryStore { + + override fun saveUser(user: User) {} + + override fun getUser(): User? = null +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt index 1cec7a156bb..d9548347123 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt @@ -26,8 +26,13 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import io.getstream.video.android.R +import io.getstream.video.android.data.InMemoryStore +import io.getstream.video.android.data.InMemoryStoreImpl +import io.getstream.video.android.data.NoopMemoryStoreImpl import io.getstream.video.android.data.repositories.GoogleAccountRepository import io.getstream.video.android.datastore.delegate.StreamUserDataStore +import io.getstream.video.android.tooling.util.StreamBuildFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil import io.getstream.video.android.util.NetworkMonitor import javax.inject.Singleton @@ -62,4 +67,14 @@ object AppModule { @Singleton fun provideNetworkMonitor(@ApplicationContext context: Context) = NetworkMonitor(context) + + @Provides + @Singleton + fun provideInMemoryStore(): InMemoryStore { + val buildFlavour = StreamBuildFlavorsUtil.getCurrentBuildFlavor() + return when (buildFlavour) { + is StreamBuildFlavors.E2eTesting -> InMemoryStoreImpl() + else -> NoopMemoryStoreImpl() + } + } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt index 78795aa67e0..d62c4556020 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt @@ -16,12 +16,37 @@ package io.getstream.video.android.tooling.util +import io.getstream.video.android.BuildConfig + /** * Defined flavors. Used in code logic. */ internal object StreamFlavors { const val development = "development" const val production = "production" + const val e2etesting = "e2etesting" +} + +object StreamBuildFlavorsUtil { + fun getCurrentBuildFlavor(): StreamBuildFlavors { + if (isProduction()) { + return StreamBuildFlavors.Production + } + if (isE2eTesting()) { + return StreamBuildFlavors.E2eTesting + } + return StreamBuildFlavors.Development + } + + fun isDevelopment() = BuildConfig.FLAVOR == StreamBuildFlavors.Development.type + fun isProduction() = BuildConfig.FLAVOR == StreamBuildFlavors.Production.type + fun isE2eTesting() = BuildConfig.FLAVOR == StreamBuildFlavors.E2eTesting.type +} + +sealed class StreamBuildFlavors(val type: String) { + data object Development : StreamBuildFlavors("development") + data object Production : StreamBuildFlavors("production") + data object E2eTesting : StreamBuildFlavors("e2etesting") } public object StreamEnvironments { diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt index 9227448285b..ff48d7230db 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt @@ -101,6 +101,7 @@ import io.getstream.video.android.defaultCallId import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewUsers import io.getstream.video.android.model.User +import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil import io.getstream.video.android.tooling.util.StreamFlavors import io.getstream.video.android.util.config.AppConfig import io.getstream.video.android.util.config.types.StreamEnvironment @@ -136,7 +137,7 @@ fun CallJoinScreen( ) { CallJoinHeader( user = user, - showDirectCall = BuildConfig.FLAVOR == StreamFlavors.development, + showDirectCall = StreamBuildFlavorsUtil.isDevelopment() || StreamBuildFlavorsUtil.isE2eTesting(), onAvatarLongClick = { if (isNetworkAvailable) isSignOutDialogVisible = true }, onDirectCallClick = navigateToDirectCallJoin, onSignOutClick = { diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt index 627e9f7f170..9f6e7a6940d 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt @@ -19,13 +19,14 @@ package io.getstream.video.android.ui.outgoing import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import io.getstream.video.android.BuildConfig +import io.getstream.video.android.data.InMemoryStore import io.getstream.video.android.data.repositories.GoogleAccountRepository import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.model.User import io.getstream.video.android.models.builtInUsers import io.getstream.video.android.models.toUsers -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.firstOrNull @@ -37,6 +38,7 @@ import javax.inject.Inject class DirectCallJoinViewModel @Inject constructor( private val userDataStore: StreamUserDataStore, private val googleAccountRepository: GoogleAccountRepository, + private val inMemoryStore: InMemoryStore, ) : ViewModel() { private val _uiState = MutableStateFlow(DirectCallUiState()) val uiState = _uiState.asStateFlow() @@ -50,8 +52,15 @@ class DirectCallJoinViewModel @Inject constructor( private suspend fun getCombinedUsers(): List { val currentUser = userDataStore.user.firstOrNull() val googleUsers = suspend { googleAccountRepository.getAllAccounts().orEmpty().toUsers() } - return when (BuildConfig.FLAVOR == StreamFlavors.development) { - true -> User.builtInUsers().filterNot { it.id == currentUser?.id } + googleUsers() + val buildFlavour = StreamBuildFlavorsUtil.getCurrentBuildFlavor() + return when (buildFlavour) { + is StreamBuildFlavors.Development -> User.builtInUsers() + .filterNot { it.id == currentUser?.id } + googleUsers() + + is StreamBuildFlavors.E2eTesting -> { + inMemoryStore.getUser()?.let { arrayListOf(it) } ?: emptyList() + } + else -> googleUsers() } } From a9a1124cc5a4939a96ca469c63514bfd115fc9ff Mon Sep 17 00:00:00 2001 From: rahullohra Date: Wed, 2 Jul 2025 14:59:25 +0530 Subject: [PATCH 2/5] chore: refactor files --- .../video/android/data/InMemoryStore.kt | 26 ---------------- .../video/android/data/InMemoryStoreImpl.kt | 31 ------------------- .../video/android/data/NoopMemoryStoreImpl.kt | 26 ---------------- .../data/datasource/local/InMemoryStore.kt | 10 ++++++ .../datasource/local/InMemoryStoreImpl.kt | 18 +++++++++++ .../datasource/local/NoopMemoryStoreImpl.kt | 10 ++++++ .../getstream/video/android/di/AppModule.kt | 6 ++-- .../android/ui/join/CallJoinViewModel.kt | 20 ++++++++++++ .../ui/outgoing/DirectCallJoinViewModel.kt | 2 +- 9 files changed, 62 insertions(+), 87 deletions(-) delete mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt delete mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt delete mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt create mode 100644 demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt deleted file mode 100644 index a7c724a7e9f..00000000000 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStore.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.data - -import io.getstream.video.android.model.User - -interface InMemoryStore { - - fun saveUser(user: User) - - fun getUser(): User? -} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt deleted file mode 100644 index 66d1e80d6bf..00000000000 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/InMemoryStoreImpl.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.data - -import io.getstream.video.android.model.User - -class InMemoryStoreImpl : InMemoryStore { - private var temporaryUser: User? = null - - override fun saveUser(user: User) { - temporaryUser = user - } - - override fun getUser(): User? { - return temporaryUser - } -} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt deleted file mode 100644 index 801f25e2c3d..00000000000 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/NoopMemoryStoreImpl.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.data - -import io.getstream.video.android.model.User - -class NoopMemoryStoreImpl : InMemoryStore { - - override fun saveUser(user: User) {} - - override fun getUser(): User? = null -} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt new file mode 100644 index 00000000000..b9056972412 --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt @@ -0,0 +1,10 @@ +package io.getstream.video.android.data.datasource.local + +import io.getstream.video.android.model.User + +interface InMemoryStore { + + fun saveUser(user: User) + + fun getUser(): User? +} \ No newline at end of file diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt new file mode 100644 index 00000000000..cf4511d7f50 --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt @@ -0,0 +1,18 @@ +package io.getstream.video.android.data.datasource.local + +import io.getstream.video.android.model.User + +/** + * Only used in E2E Testing builds + */ +class InMemoryStoreImpl : InMemoryStore { + private var temporaryUser: User? = null + + override fun saveUser(user: User) { + temporaryUser = user + } + + override fun getUser(): User? { + return temporaryUser + } +} \ No newline at end of file diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt new file mode 100644 index 00000000000..dfc432726dd --- /dev/null +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt @@ -0,0 +1,10 @@ +package io.getstream.video.android.data.datasource.local + +import io.getstream.video.android.model.User + +class NoopMemoryStoreImpl : InMemoryStore { + + override fun saveUser(user: User) {} + + override fun getUser(): User? = null +} \ No newline at end of file diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt index d9548347123..418caa6f250 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt @@ -26,9 +26,9 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import io.getstream.video.android.R -import io.getstream.video.android.data.InMemoryStore -import io.getstream.video.android.data.InMemoryStoreImpl -import io.getstream.video.android.data.NoopMemoryStoreImpl +import io.getstream.video.android.data.datasource.local.InMemoryStore +import io.getstream.video.android.data.datasource.local.InMemoryStoreImpl +import io.getstream.video.android.data.datasource.local.NoopMemoryStoreImpl import io.getstream.video.android.data.repositories.GoogleAccountRepository import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.tooling.util.StreamBuildFlavors diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt index 12388cff98e..0bbb25a5278 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt @@ -24,11 +24,13 @@ import io.getstream.android.push.PushProvider import io.getstream.chat.android.client.ChatClient import io.getstream.video.android.core.Call import io.getstream.video.android.core.StreamVideo +import io.getstream.video.android.data.datasource.local.InMemoryStore import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.model.Device import io.getstream.video.android.model.User import io.getstream.video.android.model.mapper.isValidCallCid import io.getstream.video.android.model.mapper.toTypeAndId +import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil import io.getstream.video.android.util.NetworkMonitor import io.getstream.video.android.util.StreamVideoInitHelper import io.getstream.video.android.util.fcmToken @@ -37,6 +39,8 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.shareIn @@ -48,6 +52,7 @@ import javax.inject.Inject class CallJoinViewModel @Inject constructor( private val dataStore: StreamUserDataStore, private val googleSignInClient: GoogleSignInClient, + private val inMemoryStore: InMemoryStore, networkMonitor: NetworkMonitor, ) : ViewModel() { val user: Flow = dataStore.user @@ -84,6 +89,21 @@ class CallJoinViewModel @Inject constructor( } } } + + /** + * For E2E Testing Only + */ + if (StreamBuildFlavorsUtil.isE2eTesting()) { + viewModelScope.launch { + user + .filterNotNull() + .collectLatest { newUser -> + if (inMemoryStore.getUser() == null) { + inMemoryStore.saveUser(newUser) + } + } + } + } } fun handleUiEvent(event: CallJoinEvent) { diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt index 9f6e7a6940d..d6af0294c9b 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt @@ -19,7 +19,7 @@ package io.getstream.video.android.ui.outgoing import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import io.getstream.video.android.data.InMemoryStore +import io.getstream.video.android.data.datasource.local.InMemoryStore import io.getstream.video.android.data.repositories.GoogleAccountRepository import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.model.User From c542db440ac1e1625a45bb9d67d6c58c935f6606 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Wed, 2 Jul 2025 15:16:12 +0530 Subject: [PATCH 3/5] chore: Introduce StreamBuildFlavorUtil --- .../kotlin/io/getstream/video/android/App.kt | 4 +- .../getstream/video/android/MainActivity.kt | 4 +- .../getstream/video/android/di/AppModule.kt | 8 +-- .../android/tooling/util/StreamFlavors.kt | 53 +++++++++++-------- .../video/android/ui/call/CallScreen.kt | 4 +- .../video/android/ui/join/CallJoinScreen.kt | 7 ++- .../android/ui/join/CallJoinViewModel.kt | 4 +- .../video/android/ui/login/LoginScreen.kt | 4 +- .../ui/outgoing/DirectCallJoinViewModel.kt | 10 ++-- .../video/android/util/config/AppConfig.kt | 5 +- 10 files changed, 56 insertions(+), 47 deletions(-) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/App.kt b/demo-app/src/main/kotlin/io/getstream/video/android/App.kt index c97551de29d..25bb70f165c 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/App.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/App.kt @@ -20,7 +20,7 @@ import android.app.Application import android.content.Context import dagger.hilt.android.HiltAndroidApp import io.getstream.video.android.datastore.delegate.StreamUserDataStore -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.StreamVideoInitHelper import kotlinx.coroutines.runBlocking @@ -57,7 +57,7 @@ class App : Application() { val Context.app get() = applicationContext as App -val defaultCallId get() = if (BuildConfig.FLAVOR == StreamFlavors.development) { +val defaultCallId get() = if (StreamBuildFlavorUtil.isDevelopment) { "default:79cYh3J5JgGk" } else { "" diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/MainActivity.kt b/demo-app/src/main/kotlin/io/getstream/video/android/MainActivity.kt index f2561228725..a013a8324e8 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/MainActivity.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/MainActivity.kt @@ -37,7 +37,7 @@ import io.getstream.video.android.core.StreamVideo import io.getstream.video.android.core.notifications.NotificationHandler import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.model.StreamCallId -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.ui.AppNavHost import io.getstream.video.android.ui.AppScreens import io.getstream.video.android.ui.common.StreamCallActivity @@ -66,7 +66,7 @@ class MainActivity : ComponentActivity() { // Try to read the Google Play install referrer value. We use it to deliver // the Call ID from the QR code link. @Suppress("KotlinConstantConditions") - if (BuildConfig.FLAVOR == StreamFlavors.production) { + if (StreamBuildFlavorUtil.isProduction) { InstallReferrer(this).extractInstallReferrer { callId: String -> Log.d("MainActivity", "Call ID: $callId") firebaseAnalytics.logEvent(FirebaseEvents.INSTALL_FROM_QR_CODE, null) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt index 418caa6f250..79a358e35a6 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt @@ -31,8 +31,8 @@ import io.getstream.video.android.data.datasource.local.InMemoryStoreImpl import io.getstream.video.android.data.datasource.local.NoopMemoryStoreImpl import io.getstream.video.android.data.repositories.GoogleAccountRepository import io.getstream.video.android.datastore.delegate.StreamUserDataStore -import io.getstream.video.android.tooling.util.StreamBuildFlavors -import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil +import io.getstream.video.android.tooling.util.StreamBuildFlavor +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.NetworkMonitor import javax.inject.Singleton @@ -71,9 +71,9 @@ object AppModule { @Provides @Singleton fun provideInMemoryStore(): InMemoryStore { - val buildFlavour = StreamBuildFlavorsUtil.getCurrentBuildFlavor() + val buildFlavour = StreamBuildFlavorUtil.current return when (buildFlavour) { - is StreamBuildFlavors.E2eTesting -> InMemoryStoreImpl() + is StreamBuildFlavor.E2eTesting -> InMemoryStoreImpl() else -> NoopMemoryStoreImpl() } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt index d62c4556020..8e23387c815 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt @@ -17,36 +17,45 @@ package io.getstream.video.android.tooling.util import io.getstream.video.android.BuildConfig +import io.getstream.video.android.tooling.util.StreamBuildFlavor.Development +import io.getstream.video.android.tooling.util.StreamBuildFlavor.E2eTesting +import io.getstream.video.android.tooling.util.StreamBuildFlavor.Production /** * Defined flavors. Used in code logic. */ -internal object StreamFlavors { - const val development = "development" - const val production = "production" - const val e2etesting = "e2etesting" -} -object StreamBuildFlavorsUtil { - fun getCurrentBuildFlavor(): StreamBuildFlavors { - if (isProduction()) { - return StreamBuildFlavors.Production - } - if (isE2eTesting()) { - return StreamBuildFlavors.E2eTesting - } - return StreamBuildFlavors.Development - } +object StreamBuildFlavorUtil { + + val current: StreamBuildFlavor + get() = StreamBuildFlavor.from(BuildConfig.FLAVOR) + + val isDevelopment: Boolean + get() = current is Development + + val isProduction: Boolean + get() = current is Production - fun isDevelopment() = BuildConfig.FLAVOR == StreamBuildFlavors.Development.type - fun isProduction() = BuildConfig.FLAVOR == StreamBuildFlavors.Production.type - fun isE2eTesting() = BuildConfig.FLAVOR == StreamBuildFlavors.E2eTesting.type + val isE2eTesting: Boolean + get() = current is E2eTesting } -sealed class StreamBuildFlavors(val type: String) { - data object Development : StreamBuildFlavors("development") - data object Production : StreamBuildFlavors("production") - data object E2eTesting : StreamBuildFlavors("e2etesting") + +sealed class StreamBuildFlavor(val type: String) { + data object Development : StreamBuildFlavor("development") + data object Production : StreamBuildFlavor("production") + data object E2eTesting : StreamBuildFlavor("e2etesting") + + companion object { + private val values = listOf( + Development, + Production, + E2eTesting + ) + + fun from(type: String): StreamBuildFlavor = + values.find { it.type == type } ?: Development + } } public object StreamEnvironments { diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt index b3e2125b7b6..a6a803d0b10 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt @@ -114,7 +114,7 @@ import io.getstream.video.android.filters.video.VirtualBackgroundVideoFilter import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewCall import io.getstream.video.android.tooling.extensions.toPx -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.ui.closedcaptions.ClosedCaptionUiState import io.getstream.video.android.ui.closedcaptions.ClosedCaptionUiState.Available.toClosedCaptionUiState import io.getstream.video.android.ui.closedcaptions.ClosedCaptionsContainer @@ -287,7 +287,7 @@ fun CallScreen( call = call, layout = layout, enableInPictureInPicture = true, - enableDiagnostics = BuildConfig.DEBUG || BuildConfig.FLAVOR == StreamFlavors.development, + enableDiagnostics = BuildConfig.DEBUG || StreamBuildFlavorUtil.isDevelopment, onCallAction = { when (it) { ChooseLayout -> isShowingLayoutChooseMenu = true diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt index ff48d7230db..7dae6722465 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt @@ -101,8 +101,7 @@ import io.getstream.video.android.defaultCallId import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewUsers import io.getstream.video.android.model.User -import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.config.AppConfig import io.getstream.video.android.util.config.types.StreamEnvironment @@ -137,7 +136,7 @@ fun CallJoinScreen( ) { CallJoinHeader( user = user, - showDirectCall = StreamBuildFlavorsUtil.isDevelopment() || StreamBuildFlavorsUtil.isE2eTesting(), + showDirectCall = StreamBuildFlavorUtil.isDevelopment || StreamBuildFlavorUtil.isE2eTesting, onAvatarLongClick = { if (isNetworkAvailable) isSignOutDialogVisible = true }, onDirectCallClick = navigateToDirectCallJoin, onSignOutClick = { @@ -198,7 +197,7 @@ private fun HandleCallJoinUiState( @Composable private fun CallJoinHeader( user: User?, - isProduction: Boolean = BuildConfig.FLAVOR == StreamFlavors.production, + isProduction: Boolean = StreamBuildFlavorUtil.isProduction, showDirectCall: Boolean = user?.custom?.get("email")?.contains("getstreamio") == true, onAvatarLongClick: () -> Unit, onDirectCallClick: () -> Unit, diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt index 0bbb25a5278..27e57c0d39d 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinViewModel.kt @@ -30,7 +30,7 @@ import io.getstream.video.android.model.Device import io.getstream.video.android.model.User import io.getstream.video.android.model.mapper.isValidCallCid import io.getstream.video.android.model.mapper.toTypeAndId -import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.NetworkMonitor import io.getstream.video.android.util.StreamVideoInitHelper import io.getstream.video.android.util.fcmToken @@ -93,7 +93,7 @@ class CallJoinViewModel @Inject constructor( /** * For E2E Testing Only */ - if (StreamBuildFlavorsUtil.isE2eTesting()) { + if (StreamBuildFlavorUtil.isE2eTesting) { viewModelScope.launch { user .filterNotNull() diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt index a722f6406c7..525ad6996e4 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt @@ -101,7 +101,7 @@ import io.getstream.video.android.compose.ui.components.base.styling.StreamDialo import io.getstream.video.android.model.User import io.getstream.video.android.models.builtInUsers import io.getstream.video.android.tooling.extensions.toPx -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.UserHelper import io.getstream.video.android.util.config.AppConfig import io.getstream.video.android.util.config.types.StreamEnvironment @@ -127,7 +127,7 @@ fun LoginScreen( } val selectedEnv by AppConfig.currentEnvironment.collectAsStateWithLifecycle() val availableEnvs by remember { mutableStateOf(AppConfig.availableEnvironments) } - val availableLogins = when (BuildConfig.FLAVOR == StreamFlavors.development) { + val availableLogins = when (StreamBuildFlavorUtil.isDevelopment) { true -> listOf("built-in", "google", "email", "guest") else -> listOf("google", "email", "guest") } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt index d6af0294c9b..af0cb0de092 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt @@ -25,8 +25,8 @@ import io.getstream.video.android.datastore.delegate.StreamUserDataStore import io.getstream.video.android.model.User import io.getstream.video.android.models.builtInUsers import io.getstream.video.android.models.toUsers -import io.getstream.video.android.tooling.util.StreamBuildFlavors -import io.getstream.video.android.tooling.util.StreamBuildFlavorsUtil +import io.getstream.video.android.tooling.util.StreamBuildFlavor +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.firstOrNull @@ -52,12 +52,12 @@ class DirectCallJoinViewModel @Inject constructor( private suspend fun getCombinedUsers(): List { val currentUser = userDataStore.user.firstOrNull() val googleUsers = suspend { googleAccountRepository.getAllAccounts().orEmpty().toUsers() } - val buildFlavour = StreamBuildFlavorsUtil.getCurrentBuildFlavor() + val buildFlavour = StreamBuildFlavorUtil.current return when (buildFlavour) { - is StreamBuildFlavors.Development -> User.builtInUsers() + is StreamBuildFlavor.Development -> User.builtInUsers() .filterNot { it.id == currentUser?.id } + googleUsers() - is StreamBuildFlavors.E2eTesting -> { + is StreamBuildFlavor.E2eTesting -> { inMemoryStore.getUser()?.let { arrayListOf(it) } ?: emptyList() } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt b/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt index 34c650c1a52..bceeaa87785 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt @@ -27,7 +27,8 @@ import com.squareup.moshi.adapter import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import io.getstream.log.taggedLogger import io.getstream.video.android.BuildConfig -import io.getstream.video.android.tooling.util.StreamFlavors +import io.getstream.video.android.tooling.util.StreamBuildFlavor +import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.config.types.StreamEnvironment import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi @@ -136,7 +137,7 @@ object AppConfig { } private fun List.default(currentFlavor: String): StreamEnvironment { - return if (currentFlavor == StreamFlavors.development) { + return if (currentFlavor == StreamBuildFlavor.Development.type) { first { it.env == "pronto" } } else { first { it.env == "demo" } From 13c34a9b1758c1e06dcce514ba8fab107c0880a7 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Wed, 2 Jul 2025 15:17:32 +0530 Subject: [PATCH 4/5] chore: Introduce StreamBuildFlavorUtil --- .../data/datasource/local/InMemoryStore.kt | 18 +++++++++++++++++- .../data/datasource/local/InMemoryStoreImpl.kt | 18 +++++++++++++++++- .../datasource/local/NoopMemoryStoreImpl.kt | 18 +++++++++++++++++- .../android/tooling/util/StreamFlavors.kt | 3 +-- .../video/android/ui/join/CallJoinScreen.kt | 1 - .../video/android/util/config/AppConfig.kt | 1 - 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt index b9056972412..0a0751d61d7 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStore.kt @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package io.getstream.video.android.data.datasource.local import io.getstream.video.android.model.User @@ -7,4 +23,4 @@ interface InMemoryStore { fun saveUser(user: User) fun getUser(): User? -} \ No newline at end of file +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt index cf4511d7f50..7e8bb74daa4 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/InMemoryStoreImpl.kt @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package io.getstream.video.android.data.datasource.local import io.getstream.video.android.model.User @@ -15,4 +31,4 @@ class InMemoryStoreImpl : InMemoryStore { override fun getUser(): User? { return temporaryUser } -} \ No newline at end of file +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt index dfc432726dd..9d955475a33 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/datasource/local/NoopMemoryStoreImpl.kt @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package io.getstream.video.android.data.datasource.local import io.getstream.video.android.model.User @@ -7,4 +23,4 @@ class NoopMemoryStoreImpl : InMemoryStore { override fun saveUser(user: User) {} override fun getUser(): User? = null -} \ No newline at end of file +} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt index 8e23387c815..836cad48a20 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt @@ -40,7 +40,6 @@ object StreamBuildFlavorUtil { get() = current is E2eTesting } - sealed class StreamBuildFlavor(val type: String) { data object Development : StreamBuildFlavor("development") data object Production : StreamBuildFlavor("production") @@ -50,7 +49,7 @@ sealed class StreamBuildFlavor(val type: String) { private val values = listOf( Development, Production, - E2eTesting + E2eTesting, ) fun from(type: String): StreamBuildFlavor = diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt index 7dae6722465..15e980460e3 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt @@ -89,7 +89,6 @@ import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupPositionProvider import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.getstream.video.android.BuildConfig import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.avatar.UserAvatar diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt b/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt index bceeaa87785..b6cdf4d0d30 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/util/config/AppConfig.kt @@ -28,7 +28,6 @@ import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import io.getstream.log.taggedLogger import io.getstream.video.android.BuildConfig import io.getstream.video.android.tooling.util.StreamBuildFlavor -import io.getstream.video.android.tooling.util.StreamBuildFlavorUtil import io.getstream.video.android.util.config.types.StreamEnvironment import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi From db2844d42bc137bec9e68ca3103f0eae90834432 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Wed, 2 Jul 2025 16:17:49 +0530 Subject: [PATCH 5/5] chore: use enums for build flavor --- .../getstream/video/android/di/AppModule.kt | 2 +- .../android/tooling/util/StreamFlavors.kt | 32 +++++++------------ .../ui/outgoing/DirectCallJoinViewModel.kt | 4 +-- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt index 79a358e35a6..1922ca305b8 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/di/AppModule.kt @@ -73,7 +73,7 @@ object AppModule { fun provideInMemoryStore(): InMemoryStore { val buildFlavour = StreamBuildFlavorUtil.current return when (buildFlavour) { - is StreamBuildFlavor.E2eTesting -> InMemoryStoreImpl() + StreamBuildFlavor.E2eTesting -> InMemoryStoreImpl() else -> NoopMemoryStoreImpl() } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt index 836cad48a20..95a8ff0d1f5 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/util/StreamFlavors.kt @@ -26,34 +26,24 @@ import io.getstream.video.android.tooling.util.StreamBuildFlavor.Production */ object StreamBuildFlavorUtil { - val current: StreamBuildFlavor get() = StreamBuildFlavor.from(BuildConfig.FLAVOR) - val isDevelopment: Boolean - get() = current is Development - - val isProduction: Boolean - get() = current is Production - - val isE2eTesting: Boolean - get() = current is E2eTesting + val isDevelopment: Boolean get() = current == Development + val isProduction: Boolean get() = current == Production + val isE2eTesting: Boolean get() = current == E2eTesting } -sealed class StreamBuildFlavor(val type: String) { - data object Development : StreamBuildFlavor("development") - data object Production : StreamBuildFlavor("production") - data object E2eTesting : StreamBuildFlavor("e2etesting") +enum class StreamBuildFlavor(val type: String) { + Development("development"), + Production("production"), + E2eTesting("e2etesting"), + ; companion object { - private val values = listOf( - Development, - Production, - E2eTesting, - ) - - fun from(type: String): StreamBuildFlavor = - values.find { it.type == type } ?: Development + fun from(type: String?): StreamBuildFlavor { + return entries.find { it.type == type } ?: Development + } } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt index af0cb0de092..6bef56d36a1 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinViewModel.kt @@ -54,10 +54,10 @@ class DirectCallJoinViewModel @Inject constructor( val googleUsers = suspend { googleAccountRepository.getAllAccounts().orEmpty().toUsers() } val buildFlavour = StreamBuildFlavorUtil.current return when (buildFlavour) { - is StreamBuildFlavor.Development -> User.builtInUsers() + StreamBuildFlavor.Development -> User.builtInUsers() .filterNot { it.id == currentUser?.id } + googleUsers() - is StreamBuildFlavor.E2eTesting -> { + StreamBuildFlavor.E2eTesting -> { inMemoryStore.getUser()?.let { arrayListOf(it) } ?: emptyList() }