Browse Source

Use appName from BuildMeta in the crash detection dialog.

pull/2360/head
Benoit Marty 8 months ago committed by Benoit Marty
parent
commit
0b3a0fd6a3
  1. 2
      appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt
  2. 1
      features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt
  3. 1
      features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt
  4. 5
      features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt
  5. 7
      features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt
  6. 20
      features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt

2
appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt

@ -28,6 +28,7 @@ import io.element.android.features.rageshake.test.crash.FakeCrashDataStore @@ -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 { @@ -83,6 +84,7 @@ class RootPresenterTest {
val rageshake = FakeRageShake()
val screenshotHolder = FakeScreenshotHolder()
val crashDetectionPresenter = DefaultCrashDetectionPresenter(
buildMeta = aBuildMeta(),
crashDataStore = crashDataStore
)
val rageshakeDetectionPresenter = DefaultRageshakeDetectionPresenter(

1
features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionState.kt

@ -20,6 +20,7 @@ import androidx.compose.runtime.Immutable @@ -20,6 +20,7 @@ import androidx.compose.runtime.Immutable
@Immutable
data class CrashDetectionState(
val appName: String,
val crashDetected: Boolean,
val eventSink: (CrashDetectionEvents) -> Unit
)

1
features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionStateProvider.kt

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package io.element.android.features.rageshake.api.crash
fun aCrashDetectionState() = CrashDetectionState(
appName = "Element",
crashDetected = false,
eventSink = {}
)

5
features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt

@ -41,6 +41,7 @@ fun CrashDetectionView( @@ -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( @@ -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,

7
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 @@ -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 @@ -45,6 +49,7 @@ class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataSt
}
return CrashDetectionState(
appName = buildMeta.applicationName,
crashDetected = crashDetected.value,
eventSink = ::handleEvents
)

20
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 @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -91,4 +91,12 @@ class CrashDetectionPresenterTest {
assertThat(awaitItem().crashDetected).isFalse()
}
}
private fun createPresenter(
crashDataStore: FakeCrashDataStore = FakeCrashDataStore(),
buildMeta: BuildMeta = aBuildMeta(),
) = DefaultCrashDetectionPresenter(
buildMeta = buildMeta,
crashDataStore = crashDataStore,
)
}

Loading…
Cancel
Save