diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index ac7286f..1e72c66 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -780,3 +780,9 @@ - introduced dedicated `startup` route with session-check loader, - delayed auth/chats navigation until session check is finished. - Added safe fallback in `MainActivity` theme bootstrap to prevent crash if `ThemeRepository` injection is unexpectedly unavailable during startup. + +### Step 114 - Multi-account switch sync fix (chats + realtime) +- Fixed account switch flow to fully rebind app data context: + - restart realtime socket on new active account token, + - force refresh chats for both `archived=false` and `archived=true` right after switch. +- Fixed navigation behavior on account switch to avoid noisy `popBackStack ... not found` and stale restored stack state. diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/account/AccountViewModel.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/account/AccountViewModel.kt index 6705861..e86b237 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/account/AccountViewModel.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/account/AccountViewModel.kt @@ -12,9 +12,11 @@ import kotlinx.coroutines.launch import ru.daemonlord.messenger.core.token.TokenRepository import ru.daemonlord.messenger.domain.auth.usecase.LoginUseCase import ru.daemonlord.messenger.domain.account.repository.AccountRepository +import ru.daemonlord.messenger.domain.chat.repository.ChatRepository import ru.daemonlord.messenger.domain.common.AppError import ru.daemonlord.messenger.domain.common.AppResult import ru.daemonlord.messenger.domain.notifications.repository.NotificationSettingsRepository +import ru.daemonlord.messenger.domain.realtime.RealtimeManager import ru.daemonlord.messenger.domain.settings.model.AppThemeMode import ru.daemonlord.messenger.domain.settings.repository.ThemeRepository import javax.inject.Inject @@ -24,6 +26,8 @@ class AccountViewModel @Inject constructor( private val accountRepository: AccountRepository, private val tokenRepository: TokenRepository, private val loginUseCase: LoginUseCase, + private val chatRepository: ChatRepository, + private val realtimeManager: RealtimeManager, private val notificationSettingsRepository: NotificationSettingsRepository, private val themeRepository: ThemeRepository, ) : ViewModel() { @@ -145,7 +149,20 @@ class AccountViewModel @Inject constructor( onSwitched(false) return@launch } + // Force data/context switch to the newly active account. + realtimeManager.disconnect() + realtimeManager.connect() + val allResult = chatRepository.refreshChats(archived = false) + val archivedResult = chatRepository.refreshChats(archived = true) refresh() + val syncFailed = allResult is AppResult.Error && archivedResult is AppResult.Error + if (syncFailed) { + _uiState.update { + it.copy( + errorMessage = "Account switched, but chats sync failed. Pull to refresh.", + ) + } + } onSwitched(true) } } diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt index 347eac0..75d2164 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/navigation/AppNavGraph.kt @@ -252,8 +252,11 @@ fun MessengerNavHost( onSwitchAccount = { viewModel.recheckSession() navController.navigate(Routes.Chats) { - popUpTo(Routes.Chats) { inclusive = true } + popUpTo(navController.graph.findStartDestination().id) { + saveState = false + } launchSingleTop = true + restoreState = false } }, onLogout = viewModel::logout,