Fix the logic of the room list banner state (#3615)

* Fix `deriveStateOf` preventing the banner state from updating

* Try improving implementation of the check

* No need for `syncState`
This commit is contained in:
Jorge Martin Espinosa
2024-10-08 12:13:39 +02:00
committed by GitHub
parent ee8bbcfa6b
commit e71a010e22

View File

@@ -52,7 +52,6 @@ import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.libraries.matrix.api.roomlist.RoomList
import io.element.android.libraries.matrix.api.sync.SyncService
import io.element.android.libraries.matrix.api.sync.SyncState
import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.push.api.notifications.NotificationCleaner
@@ -173,33 +172,48 @@ class RoomListPresenter @Inject constructor(
}
@Composable
private fun securityBannerState(
private fun rememberSecurityBannerState(
securityBannerDismissed: Boolean,
needsSlidingSyncMigration: Boolean,
): State<SecurityBannerState> {
val currentSecurityBannerDismissed by rememberUpdatedState(securityBannerDismissed)
val currentNeedsSlidingSyncMigration by rememberUpdatedState(needsSlidingSyncMigration)
val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState()
val syncState by syncService.syncState.collectAsState()
return remember {
derivedStateOf {
when {
currentSecurityBannerDismissed -> SecurityBannerState.None
syncState == SyncState.Running -> {
when (recoveryState) {
RecoveryState.DISABLED -> SecurityBannerState.SetUpRecovery
RecoveryState.INCOMPLETE -> SecurityBannerState.RecoveryKeyConfirmation
RecoveryState.UNKNOWN,
RecoveryState.WAITING_FOR_SYNC,
RecoveryState.ENABLED -> SecurityBannerState.None
}
}
needsSlidingSyncMigration -> SecurityBannerState.NeedsNativeSlidingSyncMigration
else -> SecurityBannerState.None
}
calculateBannerState(
securityBannerDismissed = currentSecurityBannerDismissed,
needsSlidingSyncMigration = currentNeedsSlidingSyncMigration,
recoveryState = recoveryState,
)
}
}
}
private fun calculateBannerState(
securityBannerDismissed: Boolean,
needsSlidingSyncMigration: Boolean,
recoveryState: RecoveryState,
): SecurityBannerState {
if (securityBannerDismissed) {
return SecurityBannerState.None
}
when (recoveryState) {
RecoveryState.DISABLED -> return SecurityBannerState.SetUpRecovery
RecoveryState.INCOMPLETE -> return SecurityBannerState.RecoveryKeyConfirmation
RecoveryState.UNKNOWN,
RecoveryState.WAITING_FOR_SYNC,
RecoveryState.ENABLED -> Unit
}
if (needsSlidingSyncMigration) {
return SecurityBannerState.NeedsNativeSlidingSyncMigration
}
return SecurityBannerState.None
}
@Composable
private fun roomListContentState(
securityBannerDismissed: Boolean,
@@ -228,7 +242,7 @@ class RoomListPresenter @Inject constructor(
showEmpty -> RoomListContentState.Empty
showSkeleton -> RoomListContentState.Skeleton(count = 16)
else -> {
val securityBannerState by securityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
RoomListContentState.Rooms(
securityBannerState = securityBannerState,
fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(),