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`
This commit is contained in:
Jorge Martin Espinosa 2025-02-26 10:04:49 +01:00 committed by GitHub
parent efb5accd57
commit dbb1de146b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
40 changed files with 46 additions and 230 deletions

View file

@ -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)

View file

@ -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,
)

View file

@ -35,7 +35,7 @@ class LogoutPresenter @Inject constructor(
@Composable
override fun present(): LogoutState {
val localCoroutineScope = rememberCoroutineScope()
val logoutAction: MutableState<AsyncAction<String?>> = remember {
val logoutAction: MutableState<AsyncAction<Unit>> = remember {
mutableStateOf(AsyncAction.Uninitialized)
}
@ -91,7 +91,7 @@ class LogoutPresenter @Inject constructor(
}
private fun CoroutineScope.logout(
logoutAction: MutableState<AsyncAction<String?>>,
logoutAction: MutableState<AsyncAction<Unit>>,
ignoreSdkError: Boolean,
) = launch {
suspend {

View file

@ -18,6 +18,6 @@ data class LogoutState(
val doesBackupExistOnServer: Boolean,
val recoveryState: RecoveryState,
val backupUploadState: BackupUploadState,
val logoutAction: AsyncAction<String?>,
val logoutAction: AsyncAction<Unit>,
val eventSink: (LogoutEvents) -> Unit,
)

View file

@ -38,7 +38,7 @@ fun aLogoutState(
doesBackupExistOnServer: Boolean = true,
recoveryState: RecoveryState = RecoveryState.ENABLED,
backupUploadState: BackupUploadState = BackupUploadState.Unknown,
logoutAction: AsyncAction<String?> = AsyncAction.Uninitialized,
logoutAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (LogoutEvents) -> Unit = {},
) = LogoutState(
isLastDevice = isLastDevice,

View file

@ -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 = {},
)
}

View file

@ -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)
}

View file

@ -35,7 +35,7 @@ class DirectLogoutPresenter @Inject constructor(
override fun present(): DirectLogoutState {
val localCoroutineScope = rememberCoroutineScope()
val logoutAction: MutableState<AsyncAction<String?>> = remember {
val logoutAction: MutableState<AsyncAction<Unit>> = remember {
mutableStateOf(AsyncAction.Uninitialized)
}
@ -70,7 +70,7 @@ class DirectLogoutPresenter @Inject constructor(
}
private fun CoroutineScope.logout(
logoutAction: MutableState<AsyncAction<String?>>,
logoutAction: MutableState<AsyncAction<Unit>>,
ignoreSdkError: Boolean,
) = launch {
suspend {

View file

@ -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<String?>,
state: AsyncAction<Unit>,
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
}
}

View file

@ -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<LogoutEvents>(expectEvents = false)
ensureCalledOnceWithParam<String?>(data) { callback ->
rule.setLogoutView(
aLogoutState(
logoutAction = AsyncAction.Success(data),
eventSink = eventsRecorder
),
onSuccessLogout = callback,
)
}
}
@Test
fun `last session setting button invoke onChangeRecoveryKeyClicked`() {
val eventsRecorder = EventsRecorder<LogoutEvents>(expectEvents = false)
@ -131,14 +114,12 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setLogou
state: LogoutState,
onChangeRecoveryKeyClick: () -> Unit = EnsureNeverCalled(),
onBackClick: () -> Unit = EnsureNeverCalled(),
onSuccessLogout: (logoutUrlResult: String?) -> Unit = EnsureNeverCalledWithParam()
) {
setContent {
LogoutView(
state = state,
onChangeRecoveryKeyClick = onChangeRecoveryKeyClick,
onBackClick = onBackClick,
onSuccessLogout = onSuccessLogout,
)
}
}

View file

@ -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<DirectLogoutEvents>(expectEvents = false)
ensureCalledOnceWithParam<String?>(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<DirectLogoutEvents>(expectEvents = false)
val data = "data"
ensureCalledOnceWithParam<String?>(data) { callback ->
rule.setDefaultDirectLogoutView(
state = aDirectLogoutState(
logoutAction = AsyncAction.Success(data),
eventSink = eventsRecorder,
),
onSuccessLogout = callback
)
}
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setDefaultDirectLogoutView(
state: DirectLogoutState,
onSuccessLogout: (String?) -> Unit = EnsureNeverCalledWithParam(),
) {
setContent {
DefaultDirectLogoutView().Render(
state,
onSuccessLogout = onSuccessLogout,
)
DefaultDirectLogoutView().Render(state)
}
}