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:
parent
ee8bbcfa6b
commit
e71a010e22
1 changed files with 32 additions and 18 deletions
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue