Skip to content

Commit afa1489

Browse files
authored
Merge pull request #610 from GetStream/refactor/dogfooding-fix
Refactor to use SharedFlow for the events
2 parents 27f2fcb + b7f5275 commit afa1489

File tree

6 files changed

+27
-22
lines changed

6 files changed

+27
-22
lines changed

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/join/CallJoinScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ fun CallJoinScreen(
7070
navigateToCallLobby: (callId: String) -> Unit,
7171
navigateUpToLogin: () -> Unit
7272
) {
73-
val uiState by callJoinViewModel.uiState.collectAsState()
73+
val uiState by callJoinViewModel.uiState.collectAsState(CallJoinUiState.Nothing)
7474

7575
HandleCallJoinUiState(
7676
callJoinUiState = uiState,

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/join/CallJoinViewModel.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ import io.getstream.video.android.datastore.delegate.StreamUserDataStore
2626
import io.getstream.video.android.model.User
2727
import io.getstream.video.android.model.mapper.isValidCallId
2828
import io.getstream.video.android.model.mapper.toTypeAndId
29-
import kotlinx.coroutines.flow.MutableStateFlow
29+
import kotlinx.coroutines.flow.MutableSharedFlow
30+
import kotlinx.coroutines.flow.SharedFlow
3031
import kotlinx.coroutines.flow.SharingStarted
3132
import kotlinx.coroutines.flow.StateFlow
3233
import kotlinx.coroutines.flow.flatMapLatest
3334
import kotlinx.coroutines.flow.flowOf
34-
import kotlinx.coroutines.flow.stateIn
35+
import kotlinx.coroutines.flow.shareIn
3536
import kotlinx.coroutines.launch
3637
import java.util.UUID
3738
import javax.inject.Inject
@@ -42,13 +43,14 @@ class CallJoinViewModel @Inject constructor(
4243
) : ViewModel() {
4344
val user: StateFlow<User?> = dataStore.user
4445

45-
private val event: MutableStateFlow<CallJoinEvent> = MutableStateFlow(CallJoinEvent.Nothing)
46-
internal val uiState: StateFlow<CallJoinUiState> = event
46+
private val event: MutableSharedFlow<CallJoinEvent> = MutableSharedFlow()
47+
internal val uiState: SharedFlow<CallJoinUiState> = event
4748
.flatMapLatest { event ->
4849
when (event) {
4950
is CallJoinEvent.GoBackToLogin -> {
5051
flowOf(CallJoinUiState.GoBackToLogin)
5152
}
53+
5254
is CallJoinEvent.JoinCall -> {
5355
val call = joinCall(event.callId)
5456
flowOf(CallJoinUiState.JoinCompleted(callId = call.cid))
@@ -58,21 +60,21 @@ class CallJoinViewModel @Inject constructor(
5860
else -> flowOf(CallJoinUiState.Nothing)
5961
}
6062
}
61-
.stateIn(viewModelScope, SharingStarted.Lazily, CallJoinUiState.Nothing)
63+
.shareIn(viewModelScope, SharingStarted.Lazily, 0)
6264

6365
init {
6466
viewModelScope.launch {
6567
// We need to check whether the StreamVideo instance is initialised and go back to Login
6668
// if not. In the current implementation we only initialise after Login and if the
6769
// Android process is restored then the Login is skipped Stream Video is not initialised.
6870
if (!StreamVideo.isInstalled) {
69-
event.value = CallJoinEvent.GoBackToLogin
71+
event.emit(CallJoinEvent.GoBackToLogin)
7072
}
7173
}
7274
}
7375

7476
fun handleUiEvent(event: CallJoinEvent) {
75-
this.event.value = event
77+
viewModelScope.launch { this@CallJoinViewModel.event.emit(event) }
7678
}
7779

7880
private fun joinCall(callId: String? = null): Call {

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/lobby/CallLobbyScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private fun CallLobbyHeader(
111111
callLobbyViewModel: CallLobbyViewModel = hiltViewModel(),
112112
navigateUpToLogin: () -> Unit
113113
) {
114-
val uiState by callLobbyViewModel.uiState.collectAsState()
114+
val uiState by callLobbyViewModel.uiState.collectAsState(initial = CallLobbyUiState.Nothing)
115115

116116
HandleCallLobbyUiState(
117117
callLobbyUiState = uiState,

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/lobby/CallLobbyViewModel.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ import io.getstream.video.android.core.StreamVideo
2626
import io.getstream.video.android.datastore.delegate.StreamUserDataStore
2727
import io.getstream.video.android.model.StreamCallId
2828
import io.getstream.video.android.model.User
29+
import kotlinx.coroutines.flow.MutableSharedFlow
2930
import kotlinx.coroutines.flow.MutableStateFlow
31+
import kotlinx.coroutines.flow.SharedFlow
3032
import kotlinx.coroutines.flow.SharingStarted
3133
import kotlinx.coroutines.flow.StateFlow
3234
import kotlinx.coroutines.flow.flatMapLatest
3335
import kotlinx.coroutines.flow.flowOf
3436
import kotlinx.coroutines.flow.onCompletion
35-
import kotlinx.coroutines.flow.stateIn
37+
import kotlinx.coroutines.flow.shareIn
38+
import kotlinx.coroutines.launch
3639
import javax.inject.Inject
3740

3841
@HiltViewModel
@@ -54,8 +57,8 @@ class CallLobbyViewModel @Inject constructor(
5457
private val _isLoading: MutableStateFlow<Boolean> = MutableStateFlow(false)
5558
internal val isLoading: StateFlow<Boolean> = _isLoading
5659

57-
private val event: MutableStateFlow<CallLobbyEvent> = MutableStateFlow(CallLobbyEvent.Nothing)
58-
internal val uiState: StateFlow<CallLobbyUiState> = event
60+
private val event: MutableSharedFlow<CallLobbyEvent> = MutableSharedFlow()
61+
internal val uiState: SharedFlow<CallLobbyUiState> = event
5962
.flatMapLatest { event ->
6063
when (event) {
6164
is CallLobbyEvent.JoinCall -> flowOf(CallLobbyUiState.JoinCompleted)
@@ -64,10 +67,10 @@ class CallLobbyViewModel @Inject constructor(
6467
}
6568
}
6669
.onCompletion { _isLoading.value = false }
67-
.stateIn(viewModelScope, SharingStarted.Lazily, CallLobbyUiState.Nothing)
70+
.shareIn(viewModelScope, SharingStarted.Lazily, 0)
6871

6972
fun handleUiEvent(event: CallLobbyEvent) {
70-
this.event.value = event
73+
viewModelScope.launch { this@CallLobbyViewModel.event.emit(event) }
7174
}
7275

7376
fun enableCamera(enabled: Boolean) {

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/login/LoginScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fun LoginScreen(
7373
loginViewModel: LoginViewModel = hiltViewModel(),
7474
navigateToCallJoin: () -> Unit
7575
) {
76-
val uiState by loginViewModel.uiState.collectAsState()
76+
val uiState by loginViewModel.uiState.collectAsState(initial = LoginUiState.Nothing)
7777
val isLoading by remember(uiState) { mutableStateOf(uiState !is LoginUiState.Nothing) }
7878
var isShowingEmailLoginDialog by remember { mutableStateOf(false) }
7979

dogfooding/src/main/kotlin/io/getstream/video/android/dogfooding/ui/login/LoginViewModel.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ import io.getstream.video.android.dogfooding.token.TokenResponse
3232
import io.getstream.video.android.model.User
3333
import kotlinx.coroutines.Dispatchers
3434
import kotlinx.coroutines.delay
35-
import kotlinx.coroutines.flow.MutableStateFlow
35+
import kotlinx.coroutines.flow.MutableSharedFlow
36+
import kotlinx.coroutines.flow.SharedFlow
3637
import kotlinx.coroutines.flow.SharingStarted
37-
import kotlinx.coroutines.flow.StateFlow
3838
import kotlinx.coroutines.flow.collectLatest
3939
import kotlinx.coroutines.flow.flatMapLatest
4040
import kotlinx.coroutines.flow.flow
4141
import kotlinx.coroutines.flow.flowOf
4242
import kotlinx.coroutines.flow.flowOn
43-
import kotlinx.coroutines.flow.stateIn
43+
import kotlinx.coroutines.flow.shareIn
4444
import kotlinx.coroutines.launch
4545
import java.util.UUID
4646
import javax.inject.Inject
@@ -50,19 +50,19 @@ class LoginViewModel @Inject constructor(
5050
private val dataStore: StreamUserDataStore
5151
) : ViewModel() {
5252

53-
private val event: MutableStateFlow<LoginEvent> = MutableStateFlow(LoginEvent.Nothing)
54-
internal val uiState: StateFlow<LoginUiState> = event
53+
private val event: MutableSharedFlow<LoginEvent> = MutableSharedFlow()
54+
internal val uiState: SharedFlow<LoginUiState> = event
5555
.flatMapLatest { event ->
5656
when (event) {
5757
is LoginEvent.Loading -> flowOf(LoginUiState.Loading)
5858
is LoginEvent.GoogleSignIn -> flowOf(LoginUiState.GoogleSignIn)
5959
is LoginEvent.SignInInSuccess -> signInInSuccess(event.email)
6060
else -> flowOf(LoginUiState.Nothing)
6161
}
62-
}.stateIn(viewModelScope, SharingStarted.Lazily, LoginUiState.Nothing)
62+
}.shareIn(viewModelScope, SharingStarted.Lazily, 0)
6363

6464
fun handleUiEvent(event: LoginEvent) {
65-
this.event.value = event
65+
viewModelScope.launch { this@LoginViewModel.event.emit(event) }
6666
}
6767

6868
private fun signInInSuccess(email: String) = flow<LoginUiState> {

0 commit comments

Comments
 (0)