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
import io.element.android.features.rageshake.test.rageshake.FakeRageShake 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.rageshake.FakeRageshakeDataStore
import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder 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.AppErrorState
import io.element.android.services.apperror.api.AppErrorStateService import io.element.android.services.apperror.api.AppErrorStateService
import io.element.android.services.apperror.impl.DefaultAppErrorStateService import io.element.android.services.apperror.impl.DefaultAppErrorStateService
@ -83,6 +84,7 @@ class RootPresenterTest {
val rageshake = FakeRageShake() val rageshake = FakeRageShake()
val screenshotHolder = FakeScreenshotHolder() val screenshotHolder = FakeScreenshotHolder()
val crashDetectionPresenter = DefaultCrashDetectionPresenter( val crashDetectionPresenter = DefaultCrashDetectionPresenter(
buildMeta = aBuildMeta(),
crashDataStore = crashDataStore crashDataStore = crashDataStore
) )
val rageshakeDetectionPresenter = DefaultRageshakeDetectionPresenter( 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
@Immutable @Immutable
data class CrashDetectionState( data class CrashDetectionState(
val appName: String,
val crashDetected: Boolean, val crashDetected: Boolean,
val eventSink: (CrashDetectionEvents) -> Unit val eventSink: (CrashDetectionEvents) -> Unit
) )

1
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 package io.element.android.features.rageshake.api.crash
fun aCrashDetectionState() = CrashDetectionState( fun aCrashDetectionState() = CrashDetectionState(
appName = "Element",
crashDetected = false, crashDetected = false,
eventSink = {} eventSink = {}
) )

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

@ -41,6 +41,7 @@ fun CrashDetectionView(
if (state.crashDetected) { if (state.crashDetected) {
CrashDetectionContent( CrashDetectionContent(
appName = state.appName,
onYesClicked = onOpenBugReport, onYesClicked = onOpenBugReport,
onNoClicked = ::onPopupDismissed, onNoClicked = ::onPopupDismissed,
onDismiss = ::onPopupDismissed, onDismiss = ::onPopupDismissed,
@ -50,14 +51,14 @@ fun CrashDetectionView(
@Composable @Composable
private fun CrashDetectionContent( private fun CrashDetectionContent(
appName: String,
onNoClicked: () -> Unit = { }, onNoClicked: () -> Unit = { },
onYesClicked: () -> Unit = { }, onYesClicked: () -> Unit = { },
onDismiss: () -> Unit = { }, onDismiss: () -> Unit = { },
) { ) {
ConfirmationDialog( ConfirmationDialog(
title = stringResource(id = CommonStrings.action_report_bug), title = stringResource(id = CommonStrings.action_report_bug),
// TODO Replace with app name content = stringResource(id = R.string.crash_detection_dialog_content, appName),
content = stringResource(id = R.string.crash_detection_dialog_content, "Element"),
submitText = stringResource(id = CommonStrings.action_yes), submitText = stringResource(id = CommonStrings.action_yes),
cancelText = stringResource(id = CommonStrings.action_no), cancelText = stringResource(id = CommonStrings.action_no),
onCancelClicked = onNoClicked, 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
import io.element.android.features.rageshake.api.crash.CrashDetectionEvents 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.CrashDetectionPresenter
import io.element.android.features.rageshake.api.crash.CrashDetectionState 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 io.element.android.libraries.di.AppScope
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataStore: CrashDataStore) : class DefaultCrashDetectionPresenter @Inject constructor(
private val buildMeta: BuildMeta,
private val crashDataStore: CrashDataStore,
) :
CrashDetectionPresenter { CrashDetectionPresenter {
@Composable @Composable
override fun present(): CrashDetectionState { override fun present(): CrashDetectionState {
@ -45,6 +49,7 @@ class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataSt
} }
return CrashDetectionState( return CrashDetectionState(
appName = buildMeta.applicationName,
crashDetected = crashDetected.value, crashDetected = crashDetected.value,
eventSink = ::handleEvents 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
import io.element.android.features.rageshake.impl.crash.DefaultCrashDetectionPresenter 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.A_CRASH_DATA
import io.element.android.features.rageshake.test.crash.FakeCrashDataStore 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 io.element.android.tests.testutils.WarmUpRule
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Rule import org.junit.Rule
@ -35,9 +37,7 @@ class CrashDetectionPresenterTest {
@Test @Test
fun `present - initial state no crash`() = runTest { fun `present - initial state no crash`() = runTest {
val presenter = DefaultCrashDetectionPresenter( val presenter = createPresenter()
FakeCrashDataStore()
)
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
@ -48,7 +48,7 @@ class CrashDetectionPresenterTest {
@Test @Test
fun `present - initial state crash`() = runTest { fun `present - initial state crash`() = runTest {
val presenter = DefaultCrashDetectionPresenter( val presenter = createPresenter(
FakeCrashDataStore(appHasCrashed = true) FakeCrashDataStore(appHasCrashed = true)
) )
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
@ -62,7 +62,7 @@ class CrashDetectionPresenterTest {
@Test @Test
fun `present - reset app has crashed`() = runTest { fun `present - reset app has crashed`() = runTest {
val presenter = DefaultCrashDetectionPresenter( val presenter = createPresenter(
FakeCrashDataStore(appHasCrashed = true) FakeCrashDataStore(appHasCrashed = true)
) )
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
@ -78,7 +78,7 @@ class CrashDetectionPresenterTest {
@Test @Test
fun `present - reset all crash data`() = runTest { fun `present - reset all crash data`() = runTest {
val presenter = DefaultCrashDetectionPresenter( val presenter = createPresenter(
FakeCrashDataStore(appHasCrashed = true, crashData = A_CRASH_DATA) FakeCrashDataStore(appHasCrashed = true, crashData = A_CRASH_DATA)
) )
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
@ -91,4 +91,12 @@ class CrashDetectionPresenterTest {
assertThat(awaitItem().crashDetected).isFalse() assertThat(awaitItem().crashDetected).isFalse()
} }
} }
private fun createPresenter(
crashDataStore: FakeCrashDataStore = FakeCrashDataStore(),
buildMeta: BuildMeta = aBuildMeta(),
) = DefaultCrashDetectionPresenter(
buildMeta = buildMeta,
crashDataStore = crashDataStore,
)
} }

Loading…
Cancel
Save