diff --git a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt index 5b382d1dc5..0806937c1a 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -28,6 +28,7 @@ import io.element.android.features.rageshake.test.crash.FakeCrashDataStore import io.element.android.features.rageshake.test.rageshake.FakeRageShake import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder +import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorStateService import io.element.android.services.apperror.impl.DefaultAppErrorStateService @@ -83,6 +84,7 @@ class RootPresenterTest { val rageshake = FakeRageShake() val screenshotHolder = FakeScreenshotHolder() val crashDetectionPresenter = DefaultCrashDetectionPresenter( + buildMeta = aBuildMeta(), crashDataStore = crashDataStore ) val rageshakeDetectionPresenter = DefaultRageshakeDetectionPresenter( diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt index 96fb558de6..39ddfa8213 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt @@ -20,6 +20,7 @@ import androidx.compose.runtime.Immutable @Immutable data class CrashDetectionState( + val appName: String, val crashDetected: Boolean, val eventSink: (CrashDetectionEvents) -> Unit ) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt index 184d0ecbbc..b93637010c 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt @@ -17,6 +17,7 @@ package io.element.android.features.rageshake.api.crash fun aCrashDetectionState() = CrashDetectionState( + appName = "Element", crashDetected = false, eventSink = {} ) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt index 48c10a75c4..9fa2bdc2f0 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt @@ -41,6 +41,7 @@ fun CrashDetectionView( if (state.crashDetected) { CrashDetectionContent( + appName = state.appName, onYesClicked = onOpenBugReport, onNoClicked = ::onPopupDismissed, onDismiss = ::onPopupDismissed, @@ -50,14 +51,14 @@ fun CrashDetectionView( @Composable private fun CrashDetectionContent( + appName: String, onNoClicked: () -> Unit = { }, onYesClicked: () -> Unit = { }, onDismiss: () -> Unit = { }, ) { ConfirmationDialog( title = stringResource(id = CommonStrings.action_report_bug), - // TODO Replace with app name - content = stringResource(id = R.string.crash_detection_dialog_content, "Element"), + content = stringResource(id = R.string.crash_detection_dialog_content, appName), submitText = stringResource(id = CommonStrings.action_yes), cancelText = stringResource(id = CommonStrings.action_no), onCancelClicked = onNoClicked, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt index 1097c79939..9f09f5f35a 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt @@ -24,13 +24,17 @@ import io.element.android.features.rageshake.api.crash.CrashDataStore import io.element.android.features.rageshake.api.crash.CrashDetectionEvents import io.element.android.features.rageshake.api.crash.CrashDetectionPresenter import io.element.android.features.rageshake.api.crash.CrashDetectionState +import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.AppScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject @ContributesBinding(AppScope::class) -class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataStore: CrashDataStore) : +class DefaultCrashDetectionPresenter @Inject constructor( + private val buildMeta: BuildMeta, + private val crashDataStore: CrashDataStore, +) : CrashDetectionPresenter { @Composable override fun present(): CrashDetectionState { @@ -45,6 +49,7 @@ class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataSt } return CrashDetectionState( + appName = buildMeta.applicationName, crashDetected = crashDetected.value, eventSink = ::handleEvents ) diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt index 917e427d9e..8888cf8763 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt @@ -24,6 +24,8 @@ import io.element.android.features.rageshake.api.crash.CrashDetectionEvents import io.element.android.features.rageshake.impl.crash.DefaultCrashDetectionPresenter import io.element.android.features.rageshake.test.crash.A_CRASH_DATA import io.element.android.features.rageshake.test.crash.FakeCrashDataStore +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -35,9 +37,7 @@ class CrashDetectionPresenterTest { @Test fun `present - initial state no crash`() = runTest { - val presenter = DefaultCrashDetectionPresenter( - FakeCrashDataStore() - ) + val presenter = createPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -48,7 +48,7 @@ class CrashDetectionPresenterTest { @Test fun `present - initial state crash`() = runTest { - val presenter = DefaultCrashDetectionPresenter( + val presenter = createPresenter( FakeCrashDataStore(appHasCrashed = true) ) moleculeFlow(RecompositionMode.Immediate) { @@ -62,7 +62,7 @@ class CrashDetectionPresenterTest { @Test fun `present - reset app has crashed`() = runTest { - val presenter = DefaultCrashDetectionPresenter( + val presenter = createPresenter( FakeCrashDataStore(appHasCrashed = true) ) moleculeFlow(RecompositionMode.Immediate) { @@ -78,7 +78,7 @@ class CrashDetectionPresenterTest { @Test fun `present - reset all crash data`() = runTest { - val presenter = DefaultCrashDetectionPresenter( + val presenter = createPresenter( FakeCrashDataStore(appHasCrashed = true, crashData = A_CRASH_DATA) ) moleculeFlow(RecompositionMode.Immediate) { @@ -91,4 +91,12 @@ class CrashDetectionPresenterTest { assertThat(awaitItem().crashDetected).isFalse() } } + + private fun createPresenter( + crashDataStore: FakeCrashDataStore = FakeCrashDataStore(), + buildMeta: BuildMeta = aBuildMeta(), + ) = DefaultCrashDetectionPresenter( + buildMeta = buildMeta, + crashDataStore = crashDataStore, + ) }