Skip to content

Commit 7d93c9b

Browse files
committed
Multi accounts - handle click on push history for not current account.
1 parent 2bdee54 commit 7d93c9b

File tree

10 files changed

+56
-26
lines changed

10 files changed

+56
-26
lines changed

appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ import io.element.android.libraries.matrix.api.core.EventId
7575
import io.element.android.libraries.matrix.api.core.MAIN_SPACE
7676
import io.element.android.libraries.matrix.api.core.RoomId
7777
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
78-
import io.element.android.libraries.matrix.api.core.SessionId
7978
import io.element.android.libraries.matrix.api.core.UserId
8079
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
8180
import io.element.android.libraries.matrix.api.permalink.PermalinkData
@@ -412,11 +411,7 @@ class LoggedInFlowNode(
412411
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.NotificationSettings))
413412
}
414413

415-
override fun navigateTo(sessionId: SessionId, roomId: RoomId, eventId: EventId) {
416-
// We do not check the sessionId, but it will have to be done at some point (multi account)
417-
if (sessionId != matrixClient.sessionId) {
418-
Timber.e("SessionId mismatch, expected ${matrixClient.sessionId} but got $sessionId")
419-
}
414+
override fun navigateTo(roomId: RoomId, eventId: EventId) {
420415
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Messages(eventId)))
421416
}
422417
}

features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import io.element.android.libraries.architecture.FeatureEntryPoint
1515
import io.element.android.libraries.architecture.NodeInputs
1616
import io.element.android.libraries.matrix.api.core.EventId
1717
import io.element.android.libraries.matrix.api.core.RoomId
18-
import io.element.android.libraries.matrix.api.core.SessionId
1918
import kotlinx.parcelize.Parcelize
2019

2120
interface PreferencesEntryPoint : FeatureEntryPoint {
@@ -45,6 +44,6 @@ interface PreferencesEntryPoint : FeatureEntryPoint {
4544
fun onOpenBugReport()
4645
fun onSecureBackupClick()
4746
fun onOpenRoomNotificationSettings(roomId: RoomId)
48-
fun navigateTo(sessionId: SessionId, roomId: RoomId, eventId: EventId)
47+
fun navigateTo(roomId: RoomId, eventId: EventId)
4948
}
5049
}

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/PreferencesFlowNode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,8 @@ class PreferencesFlowNode(
226226
}
227227
}
228228

229-
override fun onItemClick(sessionId: SessionId, roomId: RoomId, eventId: EventId) {
230-
plugins<PreferencesEntryPoint.Callback>().forEach { it.navigateTo(sessionId, roomId, eventId) }
229+
override fun navigateTo(roomId: RoomId, eventId: EventId) {
230+
plugins<PreferencesEntryPoint.Callback>().forEach { it.navigateTo(roomId, eventId) }
231231
}
232232
})
233233
.build()

libraries/troubleshoot/api/src/main/kotlin/io/element/android/libraries/troubleshoot/api/PushHistoryEntryPoint.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.bumble.appyx.core.plugin.Plugin
1313
import io.element.android.libraries.architecture.FeatureEntryPoint
1414
import io.element.android.libraries.matrix.api.core.EventId
1515
import io.element.android.libraries.matrix.api.core.RoomId
16-
import io.element.android.libraries.matrix.api.core.SessionId
1716

1817
interface PushHistoryEntryPoint : FeatureEntryPoint {
1918
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
@@ -25,6 +24,6 @@ interface PushHistoryEntryPoint : FeatureEntryPoint {
2524

2625
interface Callback : Plugin {
2726
fun onDone()
28-
fun onItemClick(sessionId: SessionId, roomId: RoomId, eventId: EventId)
27+
fun navigateTo(roomId: RoomId, eventId: EventId)
2928
}
3029
}

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryEvents.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@
77

88
package io.element.android.libraries.troubleshoot.impl.history
99

10+
import io.element.android.libraries.matrix.api.core.EventId
11+
import io.element.android.libraries.matrix.api.core.RoomId
12+
import io.element.android.libraries.matrix.api.core.SessionId
13+
1014
sealed interface PushHistoryEvents {
1115
data class SetShowOnlyErrors(val showOnlyErrors: Boolean) : PushHistoryEvents
1216
data class Reset(val requiresConfirmation: Boolean) : PushHistoryEvents
17+
data class NavigateTo(val sessionId: SessionId, val roomId: RoomId, val eventId: EventId): PushHistoryEvents
1318
data object ClearDialog : PushHistoryEvents
1419
}

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryNode.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import io.element.android.anvilannotations.ContributesNode
2020
import io.element.android.libraries.di.SessionScope
2121
import io.element.android.libraries.matrix.api.core.EventId
2222
import io.element.android.libraries.matrix.api.core.RoomId
23-
import io.element.android.libraries.matrix.api.core.SessionId
2423
import io.element.android.libraries.troubleshoot.api.PushHistoryEntryPoint
2524
import io.element.android.services.analytics.api.ScreenTracker
2625

@@ -29,29 +28,30 @@ import io.element.android.services.analytics.api.ScreenTracker
2928
class PushHistoryNode(
3029
@Assisted buildContext: BuildContext,
3130
@Assisted plugins: List<Plugin>,
32-
private val presenter: PushHistoryPresenter,
31+
presenterFactory: PushHistoryPresenter.Factory,
3332
private val screenTracker: ScreenTracker,
34-
) : Node(buildContext, plugins = plugins) {
33+
) : Node(buildContext, plugins = plugins), PushHistoryNavigator {
3534
private fun onDone() {
3635
plugins<PushHistoryEntryPoint.Callback>().forEach {
3736
it.onDone()
3837
}
3938
}
4039

41-
private fun onItemClick(sessionId: SessionId, roomId: RoomId, eventId: EventId) {
40+
override fun navigateTo(roomId: RoomId, eventId: EventId) {
4241
plugins<PushHistoryEntryPoint.Callback>().forEach {
43-
it.onItemClick(sessionId, roomId, eventId)
42+
it.navigateTo(roomId, eventId)
4443
}
4544
}
4645

46+
private val presenter = presenterFactory.create(this)
47+
4748
@Composable
4849
override fun View(modifier: Modifier) {
4950
screenTracker.TrackScreen(MobileScreen.ScreenName.NotificationTroubleshoot)
5051
val state = presenter.present()
5152
PushHistoryView(
5253
state = state,
5354
onBackClick = ::onDone,
54-
onItemClick = ::onItemClick,
5555
modifier = modifier,
5656
)
5757
}

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryPresenter.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,36 @@ import androidx.compose.runtime.mutableStateOf
1414
import androidx.compose.runtime.remember
1515
import androidx.compose.runtime.rememberCoroutineScope
1616
import androidx.compose.runtime.setValue
17+
import dev.zacsweers.metro.Assisted
18+
import dev.zacsweers.metro.AssistedFactory
1719
import dev.zacsweers.metro.Inject
1820
import io.element.android.libraries.architecture.AsyncAction
1921
import io.element.android.libraries.architecture.Presenter
22+
import io.element.android.libraries.matrix.api.MatrixClient
23+
import io.element.android.libraries.matrix.api.core.EventId
24+
import io.element.android.libraries.matrix.api.core.RoomId
2025
import io.element.android.libraries.push.api.PushService
2126
import kotlinx.collections.immutable.toImmutableList
2227
import kotlinx.coroutines.flow.map
2328
import kotlinx.coroutines.launch
2429

30+
interface PushHistoryNavigator {
31+
fun navigateTo(roomId: RoomId, eventId: EventId)
32+
}
33+
2534
@Inject
2635
class PushHistoryPresenter(
36+
@Assisted private val pushHistoryNavigator: PushHistoryNavigator,
2737
private val pushService: PushService,
38+
matrixClient: MatrixClient,
2839
) : Presenter<PushHistoryState> {
40+
@AssistedFactory
41+
interface Factory {
42+
fun create(pushHistoryNavigator: PushHistoryNavigator): PushHistoryPresenter
43+
}
44+
45+
private val sessionId = matrixClient.sessionId
46+
2947
@Composable
3048
override fun present(): PushHistoryState {
3149
val coroutineScope = rememberCoroutineScope()
@@ -41,6 +59,7 @@ class PushHistoryPresenter(
4159
}
4260
}.collectAsState(emptyList())
4361
var resetAction: AsyncAction<Unit> by remember { mutableStateOf(AsyncAction.Uninitialized) }
62+
var showNotSameAccountError by remember { mutableStateOf(false) }
4463

4564
fun handleEvents(event: PushHistoryEvents) {
4665
when (event) {
@@ -60,6 +79,14 @@ class PushHistoryPresenter(
6079
}
6180
PushHistoryEvents.ClearDialog -> {
6281
resetAction = AsyncAction.Uninitialized
82+
showNotSameAccountError = false
83+
}
84+
is PushHistoryEvents.NavigateTo -> {
85+
if (event.sessionId != sessionId) {
86+
showNotSameAccountError = true
87+
} else {
88+
pushHistoryNavigator.navigateTo(event.roomId, event.eventId)
89+
}
6390
}
6491
}
6592
}
@@ -69,6 +96,7 @@ class PushHistoryPresenter(
6996
pushHistoryItems = pushHistory.toImmutableList(),
7097
showOnlyErrors = showOnlyErrors,
7198
resetAction = resetAction,
99+
showNotSameAccountError = showNotSameAccountError,
72100
eventSink = ::handleEvents
73101
)
74102
}

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ data class PushHistoryState(
1616
val pushHistoryItems: ImmutableList<PushHistoryItem>,
1717
val showOnlyErrors: Boolean,
1818
val resetAction: AsyncAction<Unit>,
19+
val showNotSameAccountError: Boolean,
1920
val eventSink: (PushHistoryEvents) -> Unit,
2021
)

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryStateProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ fun aPushHistoryState(
4848
pushHistoryItems: List<PushHistoryItem> = emptyList(),
4949
showOnlyErrors: Boolean = false,
5050
resetAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
51+
showNotSameAccountError: Boolean = false,
5152
eventSink: (PushHistoryEvents) -> Unit = {},
5253
) = PushHistoryState(
5354
pushCounter = pushCounter,
5455
pushHistoryItems = pushHistoryItems.toImmutableList(),
5556
showOnlyErrors = showOnlyErrors,
5657
resetAction = resetAction,
58+
showNotSameAccountError = showNotSameAccountError,
5759
eventSink = eventSink,
5860
)
5961

libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
3737
import io.element.android.libraries.designsystem.components.async.AsyncActionView
3838
import io.element.android.libraries.designsystem.components.button.BackButton
3939
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
40+
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
4041
import io.element.android.libraries.designsystem.components.list.ListItemContent
4142
import io.element.android.libraries.designsystem.preview.ElementPreview
4243
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -48,9 +49,6 @@ import io.element.android.libraries.designsystem.theme.components.ListItem
4849
import io.element.android.libraries.designsystem.theme.components.Scaffold
4950
import io.element.android.libraries.designsystem.theme.components.Text
5051
import io.element.android.libraries.designsystem.theme.components.TopAppBar
51-
import io.element.android.libraries.matrix.api.core.EventId
52-
import io.element.android.libraries.matrix.api.core.RoomId
53-
import io.element.android.libraries.matrix.api.core.SessionId
5452
import io.element.android.libraries.push.api.history.PushHistoryItem
5553
import io.element.android.libraries.troubleshoot.impl.R
5654
import io.element.android.libraries.ui.strings.CommonStrings
@@ -60,7 +58,6 @@ import io.element.android.libraries.ui.strings.CommonStrings
6058
fun PushHistoryView(
6159
state: PushHistoryState,
6260
onBackClick: () -> Unit,
63-
onItemClick: (SessionId, RoomId, EventId) -> Unit,
6461
modifier: Modifier = Modifier,
6562
) {
6663
var showMenu by remember { mutableStateOf(false) }
@@ -123,7 +120,6 @@ fun PushHistoryView(
123120
.padding(padding)
124121
.consumeWindowInsets(padding),
125122
state = state,
126-
onItemClick = onItemClick,
127123
)
128124
}
129125

@@ -142,12 +138,18 @@ fun PushHistoryView(
142138
},
143139
onErrorDismiss = {},
144140
)
141+
142+
if (state.showNotSameAccountError) {
143+
ErrorDialog(
144+
content = "Please switch account first to navigate to the event.",
145+
onSubmit = { state.eventSink(PushHistoryEvents.ClearDialog) }
146+
)
147+
}
145148
}
146149

147150
@Composable
148151
private fun PushHistoryContent(
149152
state: PushHistoryState,
150-
onItemClick: (SessionId, RoomId, EventId) -> Unit,
151153
modifier: Modifier = Modifier,
152154
) {
153155
Column(
@@ -173,7 +175,7 @@ private fun PushHistoryContent(
173175
val roomId = pushHistory.roomId
174176
val eventId = pushHistory.eventId
175177
if (sessionId != null && roomId != null && eventId != null) {
176-
onItemClick(sessionId, roomId, eventId)
178+
state.eventSink(PushHistoryEvents.NavigateTo(sessionId, roomId, eventId))
177179
}
178180
}
179181
)
@@ -271,6 +273,5 @@ internal fun PushHistoryViewPreview(
271273
PushHistoryView(
272274
state = state,
273275
onBackClick = {},
274-
onItemClick = { _, _, _ -> },
275276
)
276277
}

0 commit comments

Comments
 (0)