Use appName from BuildMeta in the crash detection dialog.
This commit is contained in:
parent
9a5e0cdcb3
commit
8f3bb607da
6 changed files with 27 additions and 9 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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 = {}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue