Skip to content

Commit 7fd0ad0

Browse files
committed
Improve APIs, add tests
1 parent 175bada commit 7fd0ad0

File tree

22 files changed

+562
-76
lines changed

22 files changed

+562
-76
lines changed

features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowManager.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package io.element.android.features.securebackup.impl.reset
1919
import io.element.android.libraries.architecture.AsyncData
2020
import io.element.android.libraries.di.annotations.SessionCoroutineScope
2121
import io.element.android.libraries.matrix.api.MatrixClient
22-
import io.element.android.libraries.matrix.api.core.SessionId
2322
import io.element.android.libraries.matrix.api.encryption.IdentityResetHandle
2423
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
2524
import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus
@@ -46,10 +45,6 @@ class ResetIdentityFlowManager @Inject constructor(
4645
}
4746
}
4847

49-
fun currentSessionId(): SessionId {
50-
return matrixClient.sessionId
51-
}
52-
5348
fun getResetHandle(): StateFlow<AsyncData<IdentityResetHandle>> {
5449
return if (resetHandleFlow.value.isLoading() || resetHandleFlow.value.isSuccess()) {
5550
resetHandleFlow

features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import com.bumble.appyx.navmodel.backstack.operation.push
3434
import dagger.assisted.Assisted
3535
import dagger.assisted.AssistedInject
3636
import io.element.android.anvilannotations.ContributesNode
37-
import io.element.android.features.securebackup.impl.reset.password.ResetKeyPasswordNode
38-
import io.element.android.features.securebackup.impl.reset.root.ResetKeyRootNode
37+
import io.element.android.features.securebackup.impl.reset.password.ResetIdentityPasswordNode
38+
import io.element.android.features.securebackup.impl.reset.root.ResetIdentityRootNode
3939
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
4040
import io.element.android.libraries.architecture.AsyncData
4141
import io.element.android.libraries.architecture.BackstackView
@@ -108,18 +108,18 @@ class ResetIdentityFlowNode @AssistedInject constructor(
108108
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
109109
return when (navTarget) {
110110
is NavTarget.Root -> {
111-
val callback = object : ResetKeyRootNode.Callback {
111+
val callback = object : ResetIdentityRootNode.Callback {
112112
override fun onContinue() {
113113
coroutineScope.startReset()
114114
}
115115
}
116-
createNode<ResetKeyRootNode>(buildContext, listOf(callback))
116+
createNode<ResetIdentityRootNode>(buildContext, listOf(callback))
117117
}
118118
is NavTarget.ResetPassword -> {
119119
val handle = resetIdentityFlowManager.currentHandleFlow.value.dataOrNull() as? IdentityPasswordResetHandle ?: error("No password handle found")
120-
createNode<ResetKeyPasswordNode>(
120+
createNode<ResetIdentityPasswordNode>(
121121
buildContext,
122-
listOf(ResetKeyPasswordNode.Inputs(resetIdentityFlowManager.currentSessionId(), handle))
122+
listOf(ResetIdentityPasswordNode.Inputs(handle))
123123
)
124124
}
125125
is NavTarget.ResetOidc -> {
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package io.element.android.features.securebackup.impl.reset.password
1818

19-
sealed interface ResetKeyPasswordEvent {
20-
data class Reset(val password: String) : ResetKeyPasswordEvent
21-
data object DismissError : ResetKeyPasswordEvent
19+
sealed interface ResetIdentityPasswordEvent {
20+
data class Reset(val password: String) : ResetIdentityPasswordEvent
21+
data object DismissError : ResetIdentityPasswordEvent
2222
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,33 @@ import androidx.compose.ui.Modifier
2121
import com.bumble.appyx.core.modality.BuildContext
2222
import com.bumble.appyx.core.node.Node
2323
import com.bumble.appyx.core.plugin.Plugin
24-
import com.bumble.appyx.core.plugin.plugins
2524
import dagger.assisted.Assisted
2625
import dagger.assisted.AssistedInject
2726
import io.element.android.anvilannotations.ContributesNode
2827
import io.element.android.libraries.architecture.NodeInputs
2928
import io.element.android.libraries.architecture.inputs
29+
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
3030
import io.element.android.libraries.di.SessionScope
31-
import io.element.android.libraries.matrix.api.core.UserId
3231
import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle
3332

3433
@ContributesNode(SessionScope::class)
35-
class ResetKeyPasswordNode @AssistedInject constructor(
34+
class ResetIdentityPasswordNode @AssistedInject constructor(
3635
@Assisted buildContext: BuildContext,
3736
@Assisted plugins: List<Plugin>,
37+
private val coroutineDispatchers: CoroutineDispatchers,
3838
) : Node(buildContext, plugins = plugins) {
3939

40-
data class Inputs(val userId: UserId, val handle: IdentityPasswordResetHandle) : NodeInputs
40+
data class Inputs(val handle: IdentityPasswordResetHandle) : NodeInputs
4141

4242
private val presenter by lazy {
4343
val inputs = inputs<Inputs>()
44-
ResetKeyPasswordPresenter(inputs.userId, inputs.handle)
44+
ResetIdentityPasswordPresenter(inputs.handle, dispatchers = coroutineDispatchers)
4545
}
4646

4747
@Composable
4848
override fun View(modifier: Modifier) {
4949
val state = presenter.present()
50-
ResetKeyPasswordView(
50+
ResetIdentityPasswordView(
5151
state = state,
5252
onBack = ::navigateUp
5353
)
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,37 +24,37 @@ import androidx.compose.runtime.rememberCoroutineScope
2424
import io.element.android.libraries.architecture.AsyncAction
2525
import io.element.android.libraries.architecture.Presenter
2626
import io.element.android.libraries.architecture.runCatchingUpdatingState
27-
import io.element.android.libraries.matrix.api.core.UserId
27+
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
2828
import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle
2929
import kotlinx.coroutines.CoroutineScope
3030
import kotlinx.coroutines.launch
3131

32-
class ResetKeyPasswordPresenter(
33-
private val userId: UserId,
32+
class ResetIdentityPasswordPresenter(
3433
private val identityPasswordResetHandle: IdentityPasswordResetHandle,
35-
) : Presenter<ResetKeyPasswordState> {
34+
private val dispatchers: CoroutineDispatchers,
35+
) : Presenter<ResetIdentityPasswordState> {
3636
@Composable
37-
override fun present(): ResetKeyPasswordState {
37+
override fun present(): ResetIdentityPasswordState {
3838
val coroutineScope = rememberCoroutineScope()
3939

4040
val resetAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
4141

42-
fun handleEvent(event: ResetKeyPasswordEvent) {
42+
fun handleEvent(event: ResetIdentityPasswordEvent) {
4343
when (event) {
44-
is ResetKeyPasswordEvent.Reset -> coroutineScope.reset(userId, event.password, resetAction)
45-
ResetKeyPasswordEvent.DismissError -> resetAction.value = AsyncAction.Uninitialized
44+
is ResetIdentityPasswordEvent.Reset -> coroutineScope.reset(event.password, resetAction)
45+
ResetIdentityPasswordEvent.DismissError -> resetAction.value = AsyncAction.Uninitialized
4646
}
4747
}
4848

49-
return ResetKeyPasswordState(
49+
return ResetIdentityPasswordState(
5050
resetAction = resetAction.value,
5151
eventSink = ::handleEvent
5252
)
5353
}
5454

55-
private fun CoroutineScope.reset(userId: UserId, password: String, action: MutableState<AsyncAction<Unit>>) = launch {
55+
private fun CoroutineScope.reset(password: String, action: MutableState<AsyncAction<Unit>>) = launch(dispatchers.io) {
5656
suspend {
57-
identityPasswordResetHandle.resetPassword(userId, password).getOrThrow()
57+
identityPasswordResetHandle.resetPassword(password).getOrThrow()
5858
}.runCatchingUpdatingState(action)
5959
}
6060
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package io.element.android.features.securebackup.impl.reset.password
1818

1919
import io.element.android.libraries.architecture.AsyncAction
2020

21-
data class ResetKeyPasswordState(
21+
data class ResetIdentityPasswordState(
2222
val resetAction: AsyncAction<Unit>,
23-
val eventSink: (ResetKeyPasswordEvent) -> Unit,
23+
val eventSink: (ResetIdentityPasswordEvent) -> Unit,
2424
)
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ import io.element.android.libraries.designsystem.theme.components.onTabOrEnterKe
4646
import io.element.android.libraries.ui.strings.CommonStrings
4747

4848
@Composable
49-
fun ResetKeyPasswordView(
50-
state: ResetKeyPasswordState,
49+
fun ResetIdentityPasswordView(
50+
state: ResetIdentityPasswordState,
5151
onBack: () -> Unit,
5252
modifier: Modifier = Modifier,
5353
) {
@@ -63,7 +63,7 @@ fun ResetKeyPasswordView(
6363
Button(
6464
modifier = Modifier.fillMaxWidth(),
6565
text = stringResource(CommonStrings.action_reset_identity),
66-
onClick = { state.eventSink(ResetKeyPasswordEvent.Reset(passwordState.value)) },
66+
onClick = { state.eventSink(ResetIdentityPasswordEvent.Reset(passwordState.value)) },
6767
destructive = true,
6868
)
6969
}
@@ -74,7 +74,7 @@ fun ResetKeyPasswordView(
7474
} else if (state.resetAction.isFailure()) {
7575
ErrorDialog(
7676
content = stringResource(CommonStrings.error_unknown),
77-
onDismiss = { state.eventSink(ResetKeyPasswordEvent.DismissError) }
77+
onDismiss = { state.eventSink(ResetIdentityPasswordEvent.DismissError) }
7878
)
7979
}
8080
}
@@ -107,10 +107,10 @@ private fun Content(textFieldState: MutableState<String>) {
107107

108108
@PreviewsDayNight
109109
@Composable
110-
internal fun ResetKeyPasswordViewPreview() {
110+
internal fun ResetIdentityPasswordViewPreview() {
111111
ElementPreview {
112-
ResetKeyPasswordView(
113-
state = ResetKeyPasswordState(
112+
ResetIdentityPasswordView(
113+
state = ResetIdentityPasswordState(
114114
resetAction = AsyncAction.Uninitialized,
115115
eventSink = {}
116116
),
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package io.element.android.features.securebackup.impl.reset.root
1818

19-
sealed interface ResetKeyRootEvent {
20-
data object Continue : ResetKeyRootEvent
21-
data object DismissDialog : ResetKeyRootEvent
19+
sealed interface ResetIdentityRootEvent {
20+
data object Continue : ResetIdentityRootEvent
21+
data object DismissDialog : ResetIdentityRootEvent
2222
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ import io.element.android.anvilannotations.ContributesNode
2727
import io.element.android.libraries.di.SessionScope
2828

2929
@ContributesNode(SessionScope::class)
30-
class ResetKeyRootNode @AssistedInject constructor(
30+
class ResetIdentityRootNode @AssistedInject constructor(
3131
@Assisted buildContext: BuildContext,
3232
@Assisted plugins: List<Plugin>,
3333
) : Node(buildContext, plugins = plugins) {
3434
interface Callback : Plugin {
3535
fun onContinue()
3636
}
3737

38-
private val presenter = ResetKeyRootPresenter()
38+
private val presenter = ResetIdentityRootPresenter()
3939
private val callback: Callback = plugins.filterIsInstance<Callback>().first()
4040

4141
@Composable
4242
override fun View(modifier: Modifier) {
4343
val state = presenter.present()
44-
ResetKeyRootView(
44+
ResetIdentityRootView(
4545
state = state,
4646
onContinue = callback::onContinue,
4747
onBack = ::navigateUp,
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ import androidx.compose.runtime.remember
2323
import androidx.compose.runtime.setValue
2424
import io.element.android.libraries.architecture.Presenter
2525

26-
class ResetKeyRootPresenter : Presenter<ResetKeyRootState> {
26+
class ResetIdentityRootPresenter : Presenter<ResetIdentityRootState> {
2727
@Composable
28-
override fun present(): ResetKeyRootState {
28+
override fun present(): ResetIdentityRootState {
2929
var displayConfirmDialog by remember { mutableStateOf(false) }
3030

31-
fun handleEvent(event: ResetKeyRootEvent) {
31+
fun handleEvent(event: ResetIdentityRootEvent) {
3232
displayConfirmDialog = when (event) {
33-
ResetKeyRootEvent.Continue -> true
34-
ResetKeyRootEvent.DismissDialog -> false
33+
ResetIdentityRootEvent.Continue -> true
34+
ResetIdentityRootEvent.DismissDialog -> false
3535
}
3636
}
3737

38-
return ResetKeyRootState(
38+
return ResetIdentityRootState(
3939
displayConfirmationDialog = displayConfirmDialog,
4040
eventSink = ::handleEvent
4141
)

0 commit comments

Comments
 (0)