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