Skip to content

Commit eef4527

Browse files
authored
Merge pull request #5370 from element-hq/feature/bma/bugReportFlowNode
Introduce BugReportFlowNode, and remove NavTarget.ViewLogs from RootFlowNode
2 parents 786b68d + 6355feb commit eef4527

File tree

8 files changed

+121
-43
lines changed

8 files changed

+121
-43
lines changed

appnav/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ dependencies {
4343

4444
implementation(projects.features.ftue.api)
4545
implementation(projects.features.share.api)
46-
implementation(projects.features.viewfolder.api)
4746

4847
implementation(projects.services.apperror.impl)
4948
implementation(projects.services.appnavstate.api)

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

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import io.element.android.features.login.api.accesscontrol.AccountProviderAccess
3939
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
4040
import io.element.android.features.rageshake.api.reporter.BugReporter
4141
import io.element.android.features.signedout.api.SignedOutEntryPoint
42-
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
4342
import io.element.android.libraries.architecture.BackstackView
4443
import io.element.android.libraries.architecture.BaseFlowNode
4544
import io.element.android.libraries.architecture.createNode
@@ -71,7 +70,6 @@ class RootFlowNode(
7170
private val matrixSessionCache: MatrixSessionCache,
7271
private val presenter: RootPresenter,
7372
private val bugReportEntryPoint: BugReportEntryPoint,
74-
private val viewFolderEntryPoint: ViewFolderEntryPoint,
7573
private val signedOutEntryPoint: SignedOutEntryPoint,
7674
private val intentResolver: IntentResolver,
7775
private val oidcActionFlow: OidcActionFlow,
@@ -200,11 +198,6 @@ class RootFlowNode(
200198

201199
@Parcelize
202200
data object BugReport : NavTarget
203-
204-
@Parcelize
205-
data class ViewLogs(
206-
val rootPath: String,
207-
) : NavTarget
208201
}
209202

210203
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@@ -244,31 +237,12 @@ class RootFlowNode(
244237
NavTarget.SplashScreen -> splashNode(buildContext)
245238
NavTarget.BugReport -> {
246239
val callback = object : BugReportEntryPoint.Callback {
247-
override fun onBugReportSent() {
248-
backstack.pop()
249-
}
250-
251-
override fun onViewLogs(basePath: String) {
252-
backstack.push(NavTarget.ViewLogs(rootPath = basePath))
253-
}
254-
}
255-
bugReportEntryPoint
256-
.nodeBuilder(this, buildContext)
257-
.callback(callback)
258-
.build()
259-
}
260-
is NavTarget.ViewLogs -> {
261-
val callback = object : ViewFolderEntryPoint.Callback {
262240
override fun onDone() {
263241
backstack.pop()
264242
}
265243
}
266-
val params = ViewFolderEntryPoint.Params(
267-
rootPath = navTarget.rootPath,
268-
)
269-
viewFolderEntryPoint
244+
bugReportEntryPoint
270245
.nodeBuilder(this, buildContext)
271-
.params(params)
272246
.callback(callback)
273247
.build()
274248
}

features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/bugreport/BugReportEntryPoint.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ interface BugReportEntryPoint : FeatureEntryPoint {
2121
}
2222

2323
interface Callback : Plugin {
24-
fun onBugReportSent()
25-
fun onViewLogs(basePath: String)
24+
fun onDone()
2625
}
2726
}

features/rageshake/impl/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ setupDependencyInjection()
2828
dependencies {
2929
implementation(projects.appconfig)
3030
implementation(projects.features.enterprise.api)
31+
implementation(projects.features.viewfolder.api)
3132
implementation(projects.services.toolbox.api)
3233
implementation(projects.libraries.androidutils)
3334
implementation(projects.libraries.core)
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.features.rageshake.impl.bugreport
9+
10+
import android.os.Parcelable
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.ui.Modifier
13+
import com.bumble.appyx.core.modality.BuildContext
14+
import com.bumble.appyx.core.node.Node
15+
import com.bumble.appyx.core.plugin.Plugin
16+
import com.bumble.appyx.core.plugin.plugins
17+
import com.bumble.appyx.navmodel.backstack.BackStack
18+
import com.bumble.appyx.navmodel.backstack.operation.pop
19+
import com.bumble.appyx.navmodel.backstack.operation.push
20+
import dev.zacsweers.metro.AppScope
21+
import dev.zacsweers.metro.Assisted
22+
import dev.zacsweers.metro.Inject
23+
import io.element.android.annotations.ContributesNode
24+
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
25+
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
26+
import io.element.android.libraries.architecture.BackstackView
27+
import io.element.android.libraries.architecture.BaseFlowNode
28+
import io.element.android.libraries.architecture.createNode
29+
import kotlinx.parcelize.Parcelize
30+
31+
@ContributesNode(AppScope::class)
32+
@Inject
33+
class BugReportFlowNode(
34+
@Assisted val buildContext: BuildContext,
35+
@Assisted plugins: List<Plugin>,
36+
private val viewFolderEntryPoint: ViewFolderEntryPoint,
37+
) : BaseFlowNode<BugReportFlowNode.NavTarget>(
38+
backstack = BackStack(
39+
initialElement = NavTarget.Root,
40+
savedStateMap = buildContext.savedStateMap,
41+
),
42+
buildContext = buildContext,
43+
plugins = plugins
44+
) {
45+
private fun onDone() {
46+
plugins<BugReportEntryPoint.Callback>().forEach { it.onDone() }
47+
}
48+
49+
sealed interface NavTarget : Parcelable {
50+
@Parcelize
51+
data object Root : NavTarget
52+
53+
@Parcelize
54+
data class ViewLogs(
55+
val rootPath: String,
56+
) : NavTarget
57+
}
58+
59+
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
60+
return when (navTarget) {
61+
NavTarget.Root -> {
62+
val callback = object : BugReportNode.Callback {
63+
override fun onDone() {
64+
this@BugReportFlowNode.onDone()
65+
}
66+
67+
override fun onViewLogs(basePath: String) {
68+
backstack.push(NavTarget.ViewLogs(rootPath = basePath))
69+
}
70+
}
71+
createNode<BugReportNode>(buildContext, listOf(callback))
72+
}
73+
is NavTarget.ViewLogs -> {
74+
val callback = object : ViewFolderEntryPoint.Callback {
75+
override fun onDone() {
76+
backstack.pop()
77+
}
78+
}
79+
val params = ViewFolderEntryPoint.Params(
80+
rootPath = navTarget.rootPath,
81+
)
82+
viewFolderEntryPoint
83+
.nodeBuilder(this, buildContext)
84+
.params(params)
85+
.callback(callback)
86+
.build()
87+
}
88+
}
89+
}
90+
91+
@Composable
92+
override fun View(modifier: Modifier) {
93+
BackstackView()
94+
}
95+
}

features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportNode.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import dev.zacsweers.metro.AppScope
1818
import dev.zacsweers.metro.Assisted
1919
import dev.zacsweers.metro.Inject
2020
import io.element.android.annotations.ContributesNode
21-
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
2221
import io.element.android.features.rageshake.api.reporter.BugReporter
2322
import io.element.android.libraries.androidutils.system.toast
2423
import io.element.android.libraries.ui.strings.CommonStrings
@@ -31,8 +30,17 @@ class BugReportNode(
3130
private val presenter: BugReportPresenter,
3231
private val bugReporter: BugReporter,
3332
) : Node(buildContext, plugins = plugins) {
33+
interface Callback : Plugin {
34+
fun onDone()
35+
fun onViewLogs(basePath: String)
36+
}
37+
3438
private fun onViewLogs(basePath: String) {
35-
plugins<BugReportEntryPoint.Callback>().forEach { it.onViewLogs(basePath) }
39+
plugins<Callback>().forEach { it.onViewLogs(basePath) }
40+
}
41+
42+
private fun onDone() {
43+
plugins<Callback>().forEach { it.onDone() }
3644
}
3745

3846
@Composable
@@ -54,8 +62,4 @@ class BugReportNode(
5462
}
5563
)
5664
}
57-
58-
private fun onDone() {
59-
plugins<BugReportEntryPoint.Callback>().forEach { it.onBugReportSent() }
60-
}
6165
}

features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPoint.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class DefaultBugReportEntryPoint : BugReportEntryPoint {
2929
}
3030

3131
override fun build(): Node {
32-
return parentNode.createNode<BugReportNode>(buildContext, plugins)
32+
return parentNode.createNode<BugReportFlowNode>(buildContext, plugins)
3333
}
3434
}
3535
}

features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/DefaultBugReportEntryPointTest.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ package io.element.android.features.rageshake.impl.bugreport
99

1010
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
1111
import com.bumble.appyx.core.modality.BuildContext
12+
import com.bumble.appyx.core.node.Node
13+
import com.bumble.appyx.testing.junit4.util.MainDispatcherRule
1214
import com.google.common.truth.Truth.assertThat
1315
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
16+
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
1417
import io.element.android.tests.testutils.lambda.lambdaError
1518
import io.element.android.tests.testutils.node.TestParentNode
1619
import kotlinx.coroutines.test.runTest
@@ -21,25 +24,28 @@ class DefaultBugReportEntryPointTest {
2124
@get:Rule
2225
val instantTaskExecutorRule = InstantTaskExecutorRule()
2326

27+
@get:Rule
28+
val mainDispatcherRule = MainDispatcherRule()
29+
2430
@Test
2531
fun `test node builder`() = runTest {
2632
val entryPoint = DefaultBugReportEntryPoint()
2733
val parentNode = TestParentNode.create { buildContext, plugins ->
28-
BugReportNode(
34+
BugReportFlowNode(
2935
buildContext = buildContext,
3036
plugins = plugins,
31-
presenter = createPresenter(),
32-
bugReporter = FakeBugReporter(),
37+
viewFolderEntryPoint = object : ViewFolderEntryPoint {
38+
override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError()
39+
},
3340
)
3441
}
3542
val callback = object : BugReportEntryPoint.Callback {
36-
override fun onBugReportSent() = lambdaError()
37-
override fun onViewLogs(basePath: String) = lambdaError()
43+
override fun onDone() = lambdaError()
3844
}
3945
val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null))
4046
.callback(callback)
4147
.build()
42-
assertThat(result).isInstanceOf(BugReportNode::class.java)
48+
assertThat(result).isInstanceOf(BugReportFlowNode::class.java)
4349
assertThat(result.plugins).contains(callback)
4450
}
4551
}

0 commit comments

Comments
 (0)