commit 70fb25dd20510509c0603d579e78822fb8278923 parent 63d556f30e3aa8cc551b1c24aba31cec1f9f1116 Author: Marcin KoziĆski <mkozinski@mozilla.com> Date: Fri, 17 Oct 2025 11:56:39 +0000 Bug 1986398 - Add fallback behavior when the custom review prompt is not shown without any errors r=android-reviewers,twhite Differential Revision: https://phabricator.services.mozilla.com/D263691 Diffstat:
3 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt @@ -42,27 +42,39 @@ class PlayStoreReviewPromptController( */ suspend fun tryPromptReview( activity: Activity, + onNotDisplayed: () -> Unit = {}, onError: () -> Unit = {}, ) { logger.info("tryPromptReview in progress...") - val reviewInfoFlow = withContext(Dispatchers.IO) { manager.requestReviewFlow() } + val reviewInfoTask = withContext(Dispatchers.IO) { manager.requestReviewFlow() } - reviewInfoFlow.addOnCompleteListener(activity) { - val result = if (it.isSuccessful) { + reviewInfoTask.addOnCompleteListener(activity) { task -> + val result = if (task.isSuccessful) { logger.info("Review flow launched.") // Launch the in-app flow. - manager.launchReviewFlow(activity, it.result) + manager.launchReviewFlow(activity, task.result) - ReviewPromptAttemptResult.from(it.result.toString()) + ReviewPromptAttemptResult.from(task.result.toString()) } else { - // Launch the Play store flow. - val reviewErrorCode = - (it.exception as? ReviewException)?.errorCode ?: ERROR_CODE_UNEXPECTED - logger.warn("Failed to launch in-app review flow due to: $reviewErrorCode .") + Error + } - onError() + when (result) { + NotDisplayed -> { + logger.warn("In-app review flow reported as not displayed, even though there was no error.") - Error + onNotDisplayed() + } + + Error -> { + val reviewErrorCode = + (task.exception as? ReviewException)?.errorCode ?: ERROR_CODE_UNEXPECTED + logger.warn("Failed to launch in-app review flow due to: $reviewErrorCode.") + + onError() + } + + Displayed, Unknown -> {} } recordReviewPromptEvent( @@ -94,7 +106,7 @@ class PlayStoreReviewPromptController( newTab = true, from = BrowserDirection.FromGlobal, ) - logger.warn("Failed to launch play store review flow due to: $e .") + logger.warn("Failed to launch play store review flow due to: $e.") } logger.info("tryLaunchPlayStoreReview completed.") diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/CustomReviewPromptBottomSheetFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/CustomReviewPromptBottomSheetFragment.kt @@ -85,6 +85,7 @@ class CustomReviewPromptBottomSheetFragment : BottomSheetDialogFragment() { with(requireComponents.playStoreReviewPromptController) { tryPromptReview( activity = activity, + onNotDisplayed = { tryLaunchPlayStoreReview(activity) }, onError = { tryLaunchPlayStoreReview(activity) }, ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/PlayStoreReviewPromptControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/PlayStoreReviewPromptControllerTest.kt @@ -28,6 +28,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.ReviewPrompt import org.mozilla.fenix.components.ReviewPromptAttemptResult.Displayed +import org.mozilla.fenix.components.ReviewPromptAttemptResult.Error import org.mozilla.fenix.components.ReviewPromptAttemptResult.NotDisplayed import org.mozilla.fenix.components.ReviewPromptAttemptResult.Unknown import org.mozilla.fenix.helpers.FenixGleanTestRule @@ -142,6 +143,11 @@ class PlayStoreReviewPromptControllerTest { } @Test + fun reviewPromptDisplayStateError() { + testRecordReviewPromptEventRecordsTheExpectedData(Error, "error") + } + + @Test fun reviewPromptDisplayStateUnknown() { testRecordReviewPromptEventRecordsTheExpectedData(Unknown, "error") }