From 274d9dc7c18f59a1ea9da084c4bca67041a86249 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 26 Feb 2025 10:04:49 +0100 Subject: [PATCH] Upgrade SDK version to 25.02.26 (#4305) * Upgrade SDK version to 25.02.26 * Remove OIDC URL result from logout, the SDK no longer provides it * Handle room creation and destruction in a better way * Remove `onSuccessLogout` --- .../room/joined/JoinedRoomLoadedFlowNode.kt | 14 +------ .../appnav/loggedin/LoggedInPresenterTest.kt | 3 +- .../lockscreen/impl/unlock/PinUnlockNode.kt | 6 --- .../impl/unlock/PinUnlockPresenter.kt | 4 +- .../lockscreen/impl/unlock/PinUnlockState.kt | 2 +- .../impl/unlock/PinUnlockStateProvider.kt | 2 +- .../lockscreen/impl/unlock/PinUnlockView.kt | 12 +----- .../impl/unlock/activity/PinUnlockActivity.kt | 4 -- .../impl/unlock/PinUnlockPresenterTest.kt | 2 +- .../features/logout/api/LogoutUseCase.kt | 4 +- .../logout/api/direct/DirectLogoutState.kt | 2 +- .../api/direct/DirectLogoutStateProvider.kt | 4 +- .../logout/api/direct/DirectLogoutView.kt | 5 +-- .../android/features/logout/api/util/Util.kt | 23 ------------ .../logout/impl/DefaultLogoutUseCase.kt | 4 +- .../features/logout/impl/LogoutNode.kt | 8 ---- .../features/logout/impl/LogoutPresenter.kt | 4 +- .../features/logout/impl/LogoutState.kt | 2 +- .../logout/impl/LogoutStateProvider.kt | 2 +- .../features/logout/impl/LogoutView.kt | 5 --- .../impl/direct/DefaultDirectLogoutView.kt | 13 +------ .../impl/direct/DirectLogoutPresenter.kt | 4 +- .../logout/impl/ui/LogoutActionDialog.kt | 12 +----- .../features/logout/impl/LogoutViewTest.kt | 19 ---------- .../direct/DefaultDirectLogoutViewTest.kt | 37 +------------------ .../features/logout/test/FakeLogoutUseCase.kt | 4 +- .../impl/draft/MatrixComposerDraftStore.kt | 4 +- .../impl/root/PreferencesRootNode.kt | 8 +--- .../features/roomlist/impl/RoomListNode.kt | 2 +- .../impl/outgoing/VerifySelfSessionNode.kt | 2 - .../outgoing/VerifySelfSessionPresenter.kt | 4 +- .../impl/outgoing/VerifySelfSessionState.kt | 2 +- .../VerifySelfSessionStateProvider.kt | 2 +- .../impl/outgoing/VerifySelfSessionView.kt | 9 +---- .../VerifySelfSessionPresenterTest.kt | 3 +- .../outgoing/VerifySelfSessionViewTest.kt | 18 --------- gradle/libs.versions.toml | 2 +- .../libraries/matrix/api/MatrixClient.kt | 5 +-- .../libraries/matrix/impl/RustMatrixClient.kt | 6 +-- .../libraries/matrix/test/FakeMatrixClient.kt | 8 ++-- 40 files changed, 46 insertions(+), 230 deletions(-) delete mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/util/Util.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt index df2e25d4b3..543c2558e1 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt @@ -9,9 +9,7 @@ package io.element.android.appnav.room.joined import android.os.Parcelable import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.Modifier -import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext @@ -56,7 +54,7 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor( roomComponentFactory: RoomComponentFactory, ) : BaseFlowNode( backstack = BackStack( - initialElement = when (val input = plugins.filterIsInstance(Inputs::class.java).first().initialElement) { + initialElement = when (val input = plugins.filterIsInstance().first().initialElement) { is RoomNavigationTarget.Messages -> NavTarget.Messages(input.focusedEventId) RoomNavigationTarget.Details -> NavTarget.RoomDetails RoomNavigationTarget.NotificationSettings -> NavTarget.RoomNotificationSettings @@ -197,16 +195,6 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { - // Rely on the View Lifecycle in addition to the Node Lifecycle, - // because this node enters 'onDestroy' before his children, so it can leads to - // using the room in a child node where it's already closed. - DisposableEffect(Unit) { - onDispose { - if (lifecycle.currentState == Lifecycle.State.DESTROYED) { - inputs.room.destroy() - } - } - } BackstackView() } } diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt index bfd416eaf3..c19d476187 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt @@ -521,10 +521,9 @@ class LoggedInPresenterTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `present - LogoutAndMigrateToNativeSlidingSync logs out the user`() = runTest { - val logoutLambda = lambdaRecorder { userInitiated, ignoreSdkError -> + val logoutLambda = lambdaRecorder { userInitiated, ignoreSdkError -> assertThat(userInitiated).isTrue() assertThat(ignoreSdkError).isTrue() - null } val matrixClient = FakeMatrixClient().apply { this.logoutLambda = logoutLambda diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt index f62df0a55d..cea53bb844 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockNode.kt @@ -7,7 +7,6 @@ package io.element.android.features.lockscreen.impl.unlock -import androidx.activity.compose.LocalActivity import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier @@ -18,8 +17,6 @@ import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.compound.theme.ElementTheme -import io.element.android.features.logout.api.util.onSuccessLogout import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -41,8 +38,6 @@ class PinUnlockNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { val state = presenter.present() - val activity = requireNotNull(LocalActivity.current) - val isDark = ElementTheme.isLightTheme.not() LaunchedEffect(state.isUnlocked) { if (state.isUnlocked) { onUnlock() @@ -53,7 +48,6 @@ class PinUnlockNode @AssistedInject constructor( // UnlockNode is only used for in-app unlock, so we can safely set isInAppUnlock to true. // It's set to false in PinUnlockActivity. isInAppUnlock = true, - onSuccessLogout = { onSuccessLogout(activity, isDark, it) }, modifier = modifier ) } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt index 129d76f426..9f3bf082e2 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenter.kt @@ -53,7 +53,7 @@ class PinUnlockPresenter @Inject constructor( mutableStateOf(false) } val signOutAction = remember { - mutableStateOf>(AsyncAction.Uninitialized) + mutableStateOf>(AsyncAction.Uninitialized) } var biometricUnlockResult by remember { mutableStateOf(null) @@ -169,7 +169,7 @@ class PinUnlockPresenter @Inject constructor( } } - private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { + private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { suspend { logoutUseCase.logout(ignoreSdkError = true) }.runCatchingUpdatingState(signOutAction) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt index 191e3151d9..dd24fbefd7 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockState.kt @@ -18,7 +18,7 @@ data class PinUnlockState( val showWrongPinTitle: Boolean, val remainingAttempts: AsyncData, val showSignOutPrompt: Boolean, - val signOutAction: AsyncAction, + val signOutAction: AsyncAction, val showBiometricUnlock: Boolean, val isUnlocked: Boolean, val biometricUnlockResult: BiometricAuthenticator.AuthenticationResult?, diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt index 77d20585d1..54647eaad8 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockStateProvider.kt @@ -41,7 +41,7 @@ fun aPinUnlockState( showBiometricUnlock: Boolean = true, biometricUnlockResult: BiometricAuthenticator.AuthenticationResult? = null, isUnlocked: Boolean = false, - signOutAction: AsyncAction = AsyncAction.Uninitialized, + signOutAction: AsyncAction = AsyncAction.Uninitialized, ) = PinUnlockState( pinEntry = AsyncData.Success(pinEntry), showWrongPinTitle = showWrongPinTitle, diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt index f9665b52dd..64db614a9f 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt @@ -29,9 +29,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Lock import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -67,7 +65,6 @@ import io.element.android.libraries.ui.strings.CommonStrings fun PinUnlockView( state: PinUnlockState, isInAppUnlock: Boolean, - onSuccessLogout: (logoutUrlResult: String?) -> Unit, modifier: Modifier = Modifier, ) { OnLifecycleEvent { _, event -> @@ -89,12 +86,7 @@ fun PinUnlockView( AsyncAction.Loading -> { ProgressDialog(text = stringResource(id = R.string.screen_signout_in_progress_dialog_content)) } - is AsyncAction.Success -> { - val latestOnSuccessLogout by rememberUpdatedState(onSuccessLogout) - LaunchedEffect(state) { - latestOnSuccessLogout(state.signOutAction.data) - } - } + is AsyncAction.Success, is AsyncAction.Confirming, is AsyncAction.Failure, AsyncAction.Uninitialized -> Unit @@ -369,7 +361,6 @@ internal fun PinUnlockViewInAppPreview(@PreviewParameter(PinUnlockStateProvider: PinUnlockView( state = state, isInAppUnlock = true, - onSuccessLogout = {}, ) } } @@ -381,7 +372,6 @@ internal fun PinUnlockViewPreview(@PreviewParameter(PinUnlockStateProvider::clas PinUnlockView( state = state, isInAppUnlock = false, - onSuccessLogout = {}, ) } } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt index f89d25dd76..1be54e7b43 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/activity/PinUnlockActivity.kt @@ -15,14 +15,12 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import io.element.android.compound.theme.ElementTheme import io.element.android.features.enterprise.api.EnterpriseService import io.element.android.features.lockscreen.api.LockScreenLockState import io.element.android.features.lockscreen.api.LockScreenService import io.element.android.features.lockscreen.impl.unlock.PinUnlockPresenter import io.element.android.features.lockscreen.impl.unlock.PinUnlockView import io.element.android.features.lockscreen.impl.unlock.di.PinUnlockBindings -import io.element.android.features.logout.api.util.onSuccessLogout import io.element.android.libraries.architecture.bindings import io.element.android.libraries.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore @@ -51,11 +49,9 @@ class PinUnlockActivity : AppCompatActivity() { enterpriseService = enterpriseService, ) { val state = presenter.present() - val isDark = ElementTheme.isLightTheme.not() PinUnlockView( state = state, isInAppUnlock = false, - onSuccessLogout = { onSuccessLogout(this, isDark, it) }, ) } } diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt index f03e61bdb7..cea9fe29f5 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt @@ -98,7 +98,7 @@ class PinUnlockPresenterTest { @Test fun `present - forgot pin flow`() = runTest { - val signOutLambda = lambdaRecorder { "" } + val signOutLambda = lambdaRecorder {} val signOut = FakeLogoutUseCase(signOutLambda) val presenter = createPinUnlockPresenter(this, logoutUseCase = signOut) moleculeFlow(RecompositionMode.Immediate) { diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutUseCase.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutUseCase.kt index 32058bd154..6f265ec88c 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutUseCase.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutUseCase.kt @@ -14,10 +14,8 @@ interface LogoutUseCase { /** * Log out the current user and then perform any needed cleanup tasks. * @param ignoreSdkError if true, the SDK error will be ignored and the user will be logged out anyway. - * @return an optional URL. When the URL is there, it should be presented to the user after logout for - * Relying Party (RP) initiated logout on their account page. */ - suspend fun logout(ignoreSdkError: Boolean): String? + suspend fun logout(ignoreSdkError: Boolean) interface Factory { fun create(sessionId: String): LogoutUseCase diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutState.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutState.kt index 1e28d2d7fc..4e040b30bd 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutState.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutState.kt @@ -11,6 +11,6 @@ import io.element.android.libraries.architecture.AsyncAction data class DirectLogoutState( val canDoDirectSignOut: Boolean, - val logoutAction: AsyncAction, + val logoutAction: AsyncAction, val eventSink: (DirectLogoutEvents) -> Unit, ) diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutStateProvider.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutStateProvider.kt index a02b1fc619..993ad3cf0c 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutStateProvider.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutStateProvider.kt @@ -17,13 +17,13 @@ open class DirectLogoutStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized, + logoutAction: AsyncAction = AsyncAction.Uninitialized, eventSink: (DirectLogoutEvents) -> Unit = {}, ) = DirectLogoutState( canDoDirectSignOut = canDoDirectSignOut, diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutView.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutView.kt index be5c2d4d52..4d6b6df3d2 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutView.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutView.kt @@ -11,8 +11,5 @@ import androidx.compose.runtime.Composable interface DirectLogoutView { @Composable - fun Render( - state: DirectLogoutState, - onSuccessLogout: (logoutUrlResult: String?) -> Unit - ) + fun Render(state: DirectLogoutState) } diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/util/Util.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/util/Util.kt deleted file mode 100644 index 87dff8e4f0..0000000000 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/util/Util.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.logout.api.util - -import android.app.Activity -import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab -import timber.log.Timber - -fun onSuccessLogout( - activity: Activity, - darkTheme: Boolean, - url: String?, -) { - Timber.d("Success logout with result url: $url") - url?.let { - activity.openUrlInChromeCustomTab(null, darkTheme, it) - } -} diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCase.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCase.kt index 8ede6ddcfa..59906b1d74 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCase.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutUseCase.kt @@ -19,9 +19,9 @@ class DefaultLogoutUseCase @Inject constructor( private val authenticationService: MatrixAuthenticationService, private val matrixClientProvider: MatrixClientProvider, ) : LogoutUseCase { - override suspend fun logout(ignoreSdkError: Boolean): String? { + override suspend fun logout(ignoreSdkError: Boolean) { val currentSession = authenticationService.getLatestSessionId() - return if (currentSession != null) { + if (currentSession != null) { matrixClientProvider.getOrRestore(currentSession) .getOrThrow() .logout(userInitiated = true, ignoreSdkError = true) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt index a1da26b58b..382ef75b62 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutNode.kt @@ -7,7 +7,6 @@ package io.element.android.features.logout.impl -import androidx.activity.compose.LocalActivity import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.bumble.appyx.core.modality.BuildContext @@ -17,9 +16,7 @@ import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.compound.theme.ElementTheme import io.element.android.features.logout.api.LogoutEntryPoint -import io.element.android.features.logout.api.util.onSuccessLogout import io.element.android.libraries.di.SessionScope @ContributesNode(SessionScope::class) @@ -35,14 +32,9 @@ class LogoutNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { val state = presenter.present() - val activity = requireNotNull(LocalActivity.current) - val isDark = ElementTheme.isLightTheme.not() LogoutView( state = state, onChangeRecoveryKeyClick = ::onChangeRecoveryKeyClick, - onSuccessLogout = { - onSuccessLogout(activity, isDark, it) - }, onBackClick = ::navigateUp, modifier = modifier, ) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt index 99efefcedf..c26f3a7407 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt @@ -35,7 +35,7 @@ class LogoutPresenter @Inject constructor( @Composable override fun present(): LogoutState { val localCoroutineScope = rememberCoroutineScope() - val logoutAction: MutableState> = remember { + val logoutAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } @@ -91,7 +91,7 @@ class LogoutPresenter @Inject constructor( } private fun CoroutineScope.logout( - logoutAction: MutableState>, + logoutAction: MutableState>, ignoreSdkError: Boolean, ) = launch { suspend { diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt index 3e889c0962..2f84c837c6 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt @@ -18,6 +18,6 @@ data class LogoutState( val doesBackupExistOnServer: Boolean, val recoveryState: RecoveryState, val backupUploadState: BackupUploadState, - val logoutAction: AsyncAction, + val logoutAction: AsyncAction, val eventSink: (LogoutEvents) -> Unit, ) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt index 456ec6ce16..12e83fc713 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt @@ -38,7 +38,7 @@ fun aLogoutState( doesBackupExistOnServer: Boolean = true, recoveryState: RecoveryState = RecoveryState.ENABLED, backupUploadState: BackupUploadState = BackupUploadState.Unknown, - logoutAction: AsyncAction = AsyncAction.Uninitialized, + logoutAction: AsyncAction = AsyncAction.Uninitialized, eventSink: (LogoutEvents) -> Unit = {}, ) = LogoutState( isLastDevice = isLastDevice, diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt index 2f54294ea8..f8e5a428c2 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt @@ -45,7 +45,6 @@ fun LogoutView( state: LogoutState, onChangeRecoveryKeyClick: () -> Unit, onBackClick: () -> Unit, - onSuccessLogout: (logoutUrlResult: String?) -> Unit, modifier: Modifier = Modifier, ) { val eventSink = state.eventSink @@ -80,9 +79,6 @@ fun LogoutView( onDismissDialog = { eventSink(LogoutEvents.CloseDialogs) }, - onSuccessLogout = { - onSuccessLogout(it) - }, ) } @@ -177,7 +173,6 @@ internal fun LogoutViewPreview( LogoutView( state, onChangeRecoveryKeyClick = {}, - onSuccessLogout = {}, onBackClick = {}, ) } diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutView.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutView.kt index 3ec8ed3c39..e1cf8aa656 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutView.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutView.kt @@ -23,10 +23,7 @@ import javax.inject.Inject @ContributesBinding(SessionScope::class) class DefaultDirectLogoutView @Inject constructor() : DirectLogoutView { @Composable - override fun Render( - state: DirectLogoutState, - onSuccessLogout: (logoutUrlResult: String?) -> Unit, - ) { + override fun Render(state: DirectLogoutState) { val eventSink = state.eventSink LogoutActionDialog( state.logoutAction, @@ -39,9 +36,6 @@ class DefaultDirectLogoutView @Inject constructor() : DirectLogoutView { onDismissDialog = { eventSink(DirectLogoutEvents.CloseDialogs) }, - onSuccessLogout = { - onSuccessLogout(it) - }, ) } } @@ -51,8 +45,5 @@ class DefaultDirectLogoutView @Inject constructor() : DirectLogoutView { internal fun DefaultDirectLogoutViewPreview( @PreviewParameter(DirectLogoutStateProvider::class) state: DirectLogoutState, ) = ElementPreview { - DefaultDirectLogoutView().Render( - state = state, - onSuccessLogout = {}, - ) + DefaultDirectLogoutView().Render(state = state) } diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt index 63d1484655..4694b6dc2f 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt @@ -35,7 +35,7 @@ class DirectLogoutPresenter @Inject constructor( override fun present(): DirectLogoutState { val localCoroutineScope = rememberCoroutineScope() - val logoutAction: MutableState> = remember { + val logoutAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } @@ -70,7 +70,7 @@ class DirectLogoutPresenter @Inject constructor( } private fun CoroutineScope.logout( - logoutAction: MutableState>, + logoutAction: MutableState>, ignoreSdkError: Boolean, ) = launch { suspend { diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutActionDialog.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutActionDialog.kt index 9998a1c930..7249871772 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutActionDialog.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/ui/LogoutActionDialog.kt @@ -8,9 +8,7 @@ package io.element.android.features.logout.impl.ui import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.res.stringResource import io.element.android.features.logout.impl.R import io.element.android.libraries.architecture.AsyncAction @@ -20,11 +18,10 @@ import io.element.android.libraries.ui.strings.CommonStrings @Composable fun LogoutActionDialog( - state: AsyncAction, + state: AsyncAction, onConfirmClick: () -> Unit, onForceLogoutClick: () -> Unit, onDismissDialog: () -> Unit, - onSuccessLogout: (String?) -> Unit, ) { when (state) { AsyncAction.Uninitialized -> @@ -44,11 +41,6 @@ fun LogoutActionDialog( onRetry = onForceLogoutClick, onDismiss = onDismissDialog, ) - is AsyncAction.Success -> { - val latestOnSuccessLogout by rememberUpdatedState(onSuccessLogout) - LaunchedEffect(state) { - latestOnSuccessLogout(state.data) - } - } + is AsyncAction.Success -> Unit } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutViewTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutViewTest.kt index 4d078f0b96..00e294f7d1 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutViewTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutViewTest.kt @@ -15,11 +15,9 @@ import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.tests.testutils.EnsureNeverCalled -import io.element.android.tests.testutils.EnsureNeverCalledWithParam import io.element.android.tests.testutils.EventsRecorder import io.element.android.tests.testutils.clickOn import io.element.android.tests.testutils.ensureCalledOnce -import io.element.android.tests.testutils.ensureCalledOnceWithParam import io.element.android.tests.testutils.pressBack import io.element.android.tests.testutils.pressTag import org.junit.Rule @@ -96,21 +94,6 @@ class LogoutViewTest { eventsRecorder.assertSingle(LogoutEvents.CloseDialogs) } - @Test - fun `success logout invoke onSuccessLogout`() { - val data = "data" - val eventsRecorder = EventsRecorder(expectEvents = false) - ensureCalledOnceWithParam(data) { callback -> - rule.setLogoutView( - aLogoutState( - logoutAction = AsyncAction.Success(data), - eventSink = eventsRecorder - ), - onSuccessLogout = callback, - ) - } - } - @Test fun `last session setting button invoke onChangeRecoveryKeyClicked`() { val eventsRecorder = EventsRecorder(expectEvents = false) @@ -131,14 +114,12 @@ private fun AndroidComposeTestRule.setLogou state: LogoutState, onChangeRecoveryKeyClick: () -> Unit = EnsureNeverCalled(), onBackClick: () -> Unit = EnsureNeverCalled(), - onSuccessLogout: (logoutUrlResult: String?) -> Unit = EnsureNeverCalledWithParam() ) { setContent { LogoutView( state = state, onChangeRecoveryKeyClick = onChangeRecoveryKeyClick, onBackClick = onBackClick, - onSuccessLogout = onSuccessLogout, ) } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutViewTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutViewTest.kt index 24e00e2998..3581f682fa 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutViewTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutViewTest.kt @@ -16,10 +16,8 @@ import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.ui.strings.CommonStrings -import io.element.android.tests.testutils.EnsureNeverCalledWithParam import io.element.android.tests.testutils.EventsRecorder import io.element.android.tests.testutils.clickOn -import io.element.android.tests.testutils.ensureCalledOnceWithParam import io.element.android.tests.testutils.pressBackKey import org.junit.Ignore import org.junit.Rule @@ -96,45 +94,12 @@ class DefaultDirectLogoutViewTest { rule.clickOn(CommonStrings.action_cancel) eventsRecorder.assertSingle(DirectLogoutEvents.CloseDialogs) } - - @Test - fun `success logout invoke expected callback and sends expected Event`() { - val eventsRecorder = EventsRecorder(expectEvents = false) - ensureCalledOnceWithParam(null) { callback -> - rule.setDefaultDirectLogoutView( - state = aDirectLogoutState( - logoutAction = AsyncAction.Success(null), - eventSink = eventsRecorder, - ), - onSuccessLogout = callback - ) - } - } - - @Test - fun `success logout invoke expected callback and sends expected Event with data`() { - val eventsRecorder = EventsRecorder(expectEvents = false) - val data = "data" - ensureCalledOnceWithParam(data) { callback -> - rule.setDefaultDirectLogoutView( - state = aDirectLogoutState( - logoutAction = AsyncAction.Success(data), - eventSink = eventsRecorder, - ), - onSuccessLogout = callback - ) - } - } } private fun AndroidComposeTestRule.setDefaultDirectLogoutView( state: DirectLogoutState, - onSuccessLogout: (String?) -> Unit = EnsureNeverCalledWithParam(), ) { setContent { - DefaultDirectLogoutView().Render( - state, - onSuccessLogout = onSuccessLogout, - ) + DefaultDirectLogoutView().Render(state) } } diff --git a/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutUseCase.kt b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutUseCase.kt index dadccf1b26..e71266b596 100644 --- a/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutUseCase.kt +++ b/features/logout/test/src/main/kotlin/io/element/android/features/logout/test/FakeLogoutUseCase.kt @@ -12,9 +12,9 @@ import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.simulateLongTask class FakeLogoutUseCase( - var logoutLambda: (Boolean) -> String? = { lambdaError() } + var logoutLambda: (Boolean) -> Unit = { lambdaError() } ) : LogoutUseCase { - override suspend fun logout(ignoreSdkError: Boolean): String? = simulateLongTask { + override suspend fun logout(ignoreSdkError: Boolean) = simulateLongTask { logoutLambda(ignoreSdkError) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/MatrixComposerDraftStore.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/MatrixComposerDraftStore.kt index b850e7b559..cd9d55b281 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/MatrixComposerDraftStore.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/MatrixComposerDraftStore.kt @@ -21,7 +21,7 @@ class MatrixComposerDraftStore @Inject constructor( private val client: MatrixClient, ) : ComposerDraftStore { override suspend fun loadDraft(roomId: RoomId): ComposerDraft? { - return client.getRoom(roomId)?.use { room -> + return client.getRoom(roomId)?.let { room -> room.loadComposerDraft() .onFailure { Timber.e(it, "Failed to load composer draft for room $roomId") @@ -35,7 +35,7 @@ class MatrixComposerDraftStore @Inject constructor( } override suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?) { - client.getRoom(roomId)?.use { room -> + client.getRoom(roomId)?.let { room -> val updateDraftResult = if (draft == null) { room.clearComposerDraft() } else { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt index 887f14a7f7..c1c98be353 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootNode.kt @@ -21,7 +21,6 @@ import io.element.android.anvilannotations.ContributesNode import io.element.android.compound.theme.ElementTheme import io.element.android.features.logout.api.direct.DirectLogoutEvents import io.element.android.features.logout.api.direct.DirectLogoutView -import io.element.android.features.logout.api.util.onSuccessLogout import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.user.MatrixUser @@ -140,11 +139,6 @@ class PreferencesRootNode @AssistedInject constructor( onDeactivateClick = this::onOpenAccountDeactivation ) - directLogoutView.Render( - state = state.directLogoutState, - onSuccessLogout = { - onSuccessLogout(activity, isDark, it) - } - ) + directLogoutView.Render(state = state.directLogoutState) } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt index 05ed6b2937..f507fe64d6 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt @@ -111,6 +111,6 @@ class RoomListNode @AssistedInject constructor( ) } - directLogoutView.Render(state.directLogoutState) {} + directLogoutView.Render(state.directLogoutState) } } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionNode.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionNode.kt index f58d22619e..dbd39c4a12 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionNode.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionNode.kt @@ -20,7 +20,6 @@ import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode import io.element.android.appconfig.LearnMoreConfig import io.element.android.compound.theme.ElementTheme -import io.element.android.features.logout.api.util.onSuccessLogout import io.element.android.features.verifysession.api.VerifySessionEntryPoint import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.architecture.inputs @@ -56,7 +55,6 @@ class VerifySelfSessionNode @AssistedInject constructor( onEnterRecoveryKey = callback::onEnterRecoveryKey, onResetKey = callback::onResetKey, onFinish = callback::onDone, - onSuccessLogout = { onSuccessLogout(activity, isDark, it) }, ) } } diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenter.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenter.kt index 35e66ad24e..c0760074ed 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenter.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenter.kt @@ -69,7 +69,7 @@ class VerifySelfSessionPresenter @AssistedInject constructor( val skipVerification by sessionPreferencesStore.isSessionVerificationSkipped().collectAsState(initial = false) val sessionVerifiedStatus by sessionVerificationService.sessionVerifiedStatus.collectAsState() val signOutAction = remember { - mutableStateOf>(AsyncAction.Uninitialized) + mutableStateOf>(AsyncAction.Uninitialized) } val step by remember { derivedStateOf { @@ -195,7 +195,7 @@ class VerifySelfSessionPresenter @AssistedInject constructor( .launchIn(this) } - private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { + private fun CoroutineScope.signOut(signOutAction: MutableState>) = launch { suspend { logoutUseCase.logout(ignoreSdkError = true) }.runCatchingUpdatingState(signOutAction) diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionState.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionState.kt index 6c04042b92..3c998247c7 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionState.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionState.kt @@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.verification.SessionVerificationD @Immutable data class VerifySelfSessionState( val step: Step, - val signOutAction: AsyncAction, + val signOutAction: AsyncAction, val displaySkipButton: Boolean, val eventSink: (VerifySelfSessionViewEvents) -> Unit, ) { diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionStateProvider.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionStateProvider.kt index 31927562bf..9ebb80b68b 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionStateProvider.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionStateProvider.kt @@ -65,7 +65,7 @@ open class VerifySelfSessionStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized, + signOutAction: AsyncAction = AsyncAction.Uninitialized, displaySkipButton: Boolean = false, eventSink: (VerifySelfSessionViewEvents) -> Unit = {}, ) = VerifySelfSessionState( diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionView.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionView.kt index ca683424e9..2a73a4b627 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionView.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionView.kt @@ -58,7 +58,6 @@ fun VerifySelfSessionView( onEnterRecoveryKey: () -> Unit, onResetKey: () -> Unit, onFinish: () -> Unit, - onSuccessLogout: (String?) -> Unit, modifier: Modifier = Modifier, ) { val step = state.step @@ -144,12 +143,7 @@ fun VerifySelfSessionView( AsyncAction.Loading -> { ProgressDialog(text = stringResource(id = R.string.screen_signout_in_progress_dialog_content)) } - is AsyncAction.Success -> { - val latestOnSuccessLogout by rememberUpdatedState(onSuccessLogout) - LaunchedEffect(state) { - latestOnSuccessLogout(state.signOutAction.data) - } - } + is AsyncAction.Success, is AsyncAction.Confirming, is AsyncAction.Failure, AsyncAction.Uninitialized -> Unit @@ -372,6 +366,5 @@ internal fun VerifySelfSessionViewPreview(@PreviewParameter(VerifySelfSessionSta onEnterRecoveryKey = {}, onResetKey = {}, onFinish = {}, - onSuccessLogout = {}, ) } diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenterTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenterTest.kt index 0e3b05ecbf..435e2e688c 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenterTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionPresenterTest.kt @@ -314,7 +314,7 @@ class VerifySelfSessionPresenterTest { emitVerifiedStatus(SessionVerifiedStatus.Verified) emitVerificationFlowState(VerificationFlowState.DidFinish) } - val signOutLambda = lambdaRecorder { "aUrl" } + val signOutLambda = lambdaRecorder {} val presenter = createVerifySelfSessionPresenter( service, logoutUseCase = FakeLogoutUseCase(signOutLambda) @@ -326,7 +326,6 @@ class VerifySelfSessionPresenterTest { assertThat(awaitItem().signOutAction.isLoading()).isTrue() val finalItem = awaitItem() assertThat(finalItem.signOutAction.isSuccess()).isTrue() - assertThat(finalItem.signOutAction.dataOrNull()).isEqualTo("aUrl") signOutLambda.assertions().isCalledOnce().with(value(true)) } } diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionViewTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionViewTest.kt index e812d98038..9eb8724152 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionViewTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/outgoing/VerifySelfSessionViewTest.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 import io.element.android.features.verifysession.impl.R import io.element.android.features.verifysession.impl.ui.aEmojisSessionVerificationData -import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.tests.testutils.EnsureNeverCalled @@ -21,7 +20,6 @@ import io.element.android.tests.testutils.EnsureNeverCalledWithParam import io.element.android.tests.testutils.EventsRecorder import io.element.android.tests.testutils.clickOn import io.element.android.tests.testutils.ensureCalledOnce -import io.element.android.tests.testutils.ensureCalledOnceWithParam import io.element.android.tests.testutils.pressBackKey import org.junit.Rule import org.junit.Test @@ -224,27 +222,12 @@ class VerifySelfSessionViewTest { } } - @Test - fun `on success logout - onFinished callback is called immediately`() { - val aUrl = "aUrl" - ensureCalledOnceWithParam(aUrl) { callback -> - rule.setVerifySelfSessionView( - aVerifySelfSessionState( - signOutAction = AsyncAction.Success(aUrl), - eventSink = EnsureNeverCalledWithParam(), - ), - onSuccessLogout = callback, - ) - } - } - private fun AndroidComposeTestRule.setVerifySelfSessionView( state: VerifySelfSessionState, onLearnMoreClick: () -> Unit = EnsureNeverCalled(), onEnterRecoveryKey: () -> Unit = EnsureNeverCalled(), onFinished: () -> Unit = EnsureNeverCalled(), onResetKey: () -> Unit = EnsureNeverCalled(), - onSuccessLogout: (String?) -> Unit = EnsureNeverCalledWithParam(), ) { setContent { VerifySelfSessionView( @@ -253,7 +236,6 @@ class VerifySelfSessionViewTest { onEnterRecoveryKey = onEnterRecoveryKey, onFinish = onFinished, onResetKey = onResetKey, - onSuccessLogout = onSuccessLogout, ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 59a3b7ed97..7979754742 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -173,7 +173,7 @@ jsoup = "org.jsoup:jsoup:1.18.3" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.2.17" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.2.26" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index 5616bb0839..c19793fb8d 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -84,12 +84,11 @@ interface MatrixClient : Closeable { /** * Logout the user. - * Returns an optional URL. When the URL is there, it should be presented to the user after logout for - * Relying Party (RP) initiated logout on their account page. + * * @param userInitiated if false, the logout came from the HS, no request will be made and the session entry will be kept in the store. * @param ignoreSdkError if true, the SDK will ignore any error and delete the session data anyway. */ - suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean): String? + suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean) /** * Retrieve the user profile, will also eventually emit a new value to [userProfile]. diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index e915e7ea4c..9ba2655c76 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -493,8 +493,7 @@ class RustMatrixClient( deleteSessionDirectory(deleteCryptoDb = false) } - override suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean): String? { - var result: String? = null + override suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean) { sessionCoroutineScope.cancel() // Remove current delegate so we don't receive an auth error clientDelegateTaskHandle?.cancelAndDestroy() @@ -502,7 +501,7 @@ class RustMatrixClient( withContext(sessionDispatcher) { if (userInitiated) { try { - result = innerClient.logout() + innerClient.logout() } catch (failure: Throwable) { if (ignoreSdkError) { Timber.e(failure, "Fail to call logout on HS. Still delete local files.") @@ -521,7 +520,6 @@ class RustMatrixClient( sessionStore.removeSession(sessionId.value) } } - return result } override fun canDeactivateAccount(): Boolean { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index 93c2d4c075..4ab4a7d11d 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -122,9 +122,7 @@ class FakeMatrixClient( var getRoomSummaryFlowLambda = { _: RoomIdOrAlias -> flowOf>(Optional.empty()) } - var logoutLambda: (Boolean, Boolean) -> String? = { _, _ -> - null - } + var logoutLambda: (Boolean, Boolean) -> Unit = { _, _ -> } override suspend fun getRoom(roomId: RoomId): MatrixRoom? { return getRoomResults[roomId] @@ -174,8 +172,8 @@ class FakeMatrixClient( clearCacheLambda() } - override suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean): String? = simulateLongTask { - return logoutLambda(ignoreSdkError, userInitiated) + override suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean) = simulateLongTask { + logoutLambda(ignoreSdkError, userInitiated) } override fun canDeactivateAccount() = canDeactivateAccountResult()