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:
parent
efb5accd57
commit
dbb1de146b
40 changed files with 46 additions and 230 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue