Dan Ballard pushed to branch tor-browser-150.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: cadcb5ec by clairehurst at 2026-04-30T09:56:22-07:00 TB 44615: Remove review prompt - - - - - 9 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptReducer.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml - mobile/android/fenix/app/src/main/res/xml/preferences.xml - mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/PlayStoreReviewPromptControllerTest.kt - mobile/android/fenix/app/src/test/java/org/mozilla/fenix/reviewprompt/ShowPlayStoreReviewPromptTest.kt Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt ===================================== @@ -90,6 +90,12 @@ import org.mozilla.fenix.utils.isLargeScreenSize import org.mozilla.fenix.wifi.WifiConnectionMonitor import java.util.concurrent.TimeUnit +import android.app.Activity +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.Tasks +import com.google.android.play.core.review.ReviewInfo +import com.google.android.play.core.review.ReviewManager + private const val AMO_COLLECTION_MAX_CACHE_AGE = 2 * 24 * 60L // Two days in minutes /** @@ -251,7 +257,7 @@ class Components(private val context: Context) { val playStoreReviewPromptController by lazyMonitored { PlayStoreReviewPromptController( - manager = ReviewManagerFactory.create(context), + manager = NoopReviewManager(context), numberOfAppLaunches = { settings.numberOfAppLaunches }, ) } @@ -422,6 +428,19 @@ class Components(private val context: Context) { val torController by lazyMonitored { TorControllerGV(context) } } +class NoopReviewManager(val value: Context) : ReviewManager { + override fun launchReviewFlow( + p0: Activity, + p1: ReviewInfo + ): Task<Void?> { + return Tasks.forResult(null) + } + + override fun requestReviewFlow(): Task<ReviewInfo?> { + return Tasks.forResult(null) + } +} + /** * Returns the [Components] object from within a [Composable]. */ ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt ===================================== @@ -47,80 +47,16 @@ class PlayStoreReviewPromptController( onNotDisplayed: () -> Unit = {}, onError: () -> Unit = {}, ) { - logger.info("tryPromptReview in progress...") - val reviewInfoTask = withContext(Dispatchers.IO) { manager.requestReviewFlow() } - - reviewInfoTask.addOnCompleteListener(activity) { task -> - val result = if (task.isSuccessful) { - logger.info("Review flow launched.") - // Launch the in-app flow. - manager.launchReviewFlow(activity, task.result) - - ReviewPromptAttemptResult.from(task.result.toString()) - } else { - Error - } - - when (result) { - NotDisplayed -> { - logger.warn("In-app review flow reported as not displayed, even though there was no 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( - promptAttemptResult = result, - numberOfAppLaunches = numberOfAppLaunches(), - now = Date(), - ) - } - - logger.info("tryPromptReview completed.") + logger.info("tryPromptReview has been successfully noop'ed.") + return } /** * Try to launch the play store review flow. */ fun tryLaunchPlayStoreReview(activity: Activity) { - logger.info("tryLaunchPlayStoreReview in progress...") - - try { - logger.info("Navigating to Play store listing.") - activity.startActivity( - Intent(Intent.ACTION_VIEW, SupportUtils.RATE_APP_URL.toUri()), - ) - } catch (e: ActivityNotFoundException) { - // Device without the play store installed. - // Opening the play store website. - - activity.applicationContext.components.useCases.fenixBrowserUseCases.loadUrlOrSearch( - searchTermOrURL = SupportUtils.FENIX_PLAY_STORE_URL, - newTab = true, - ) - - // https://bugzilla.mozilla.org/show_bug.cgi?id=1997148 - (activity as? FragmentActivity) - ?.supportFragmentManager - ?.fragments - ?.firstOrNull { it is NavHostFragment } - ?.let { (it as NavHostFragment).navController } - ?.openToBrowser() - - logger.warn("Failed to launch play store review flow due to: $e.") - } - - logger.info("tryLaunchPlayStoreReview completed.") + logger.info("tryLaunchPlayStoreReview has been successfully noop'ed.") + return } companion object { ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt ===================================== @@ -105,23 +105,7 @@ class ReviewPromptMiddleware( return } - val shouldShowPrompt: Boolean = createJexlHelper().use { jexlHelper -> - // Keep the legacy criteria around, but use the nimbus data and jexl to trigger. - // Leaving the original if-else logic and early return for readability. - if (!shouldUseNewTriggerCriteria()) { - val legacyCriteriaSatisfied = buildTriggerLegacyCriteria(jexlHelper).all { it } - return@use legacyCriteriaSatisfied - } - - // Otherwise, we use the new criteria. - val allMainCriteriaSatisfied = buildTriggerMainCriteria(jexlHelper).all { it } - if (!allMainCriteriaSatisfied) { - return@use false - } - - val atLeastOneOfSubCriteriaSatisfied = buildTriggerSubCriteria(jexlHelper).any { it } - return@use atLeastOneOfSubCriteriaSatisfied - } + val shouldShowPrompt: Boolean = false if (shouldShowPrompt) { if (shouldShowCustomPrompt()) { ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptReducer.kt ===================================== @@ -21,11 +21,6 @@ import org.mozilla.fenix.reviewprompt.ReviewPromptState.NotEligible */ internal object ReviewPromptReducer { fun reduce(state: AppState, action: ReviewPromptAction): AppState { - return when (action) { - ShowPlayStorePrompt -> state.copy(reviewPrompt = Eligible(Type.PlayStore)) - ShowCustomReviewPrompt -> state.copy(reviewPrompt = Eligible(Type.Custom)) - DoNotShowReviewPrompt, ReviewPromptShown -> state.copy(reviewPrompt = NotEligible) - CheckIfEligibleForReviewPrompt -> state - } + return state.copy(reviewPrompt = NotEligible) } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -544,12 +544,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SystemInsetsPaddedFragment, SettingsFragmentDirections.actionSettingsFragmentToSyncDebugFragment() } - // About preferences - resources.getString(R.string.pref_key_rate) -> { - components.playStoreReviewPromptController.tryLaunchPlayStoreReview(requireActivity()) - null - } - resources.getString(R.string.pref_key_about) -> { SettingsFragmentDirections.actionSettingsFragmentToAboutFragment() } ===================================== mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml ===================================== @@ -214,8 +214,7 @@ app:popUpToInclusive="true" app:destination="@+id/unlockPrivateTabsFragment"/> <action - android:id="@+id/action_global_customReviewPromptDialogFragment" - app:destination="@id/customReviewPromptDialogFragment" /> + android:id="@+id/action_global_customReviewPromptDialogFragment" /> <action android:id="@+id/action_global_to_installedAddonDetailsFragment" app:destination="@id/installedAddonDetailsFragment" /> ===================================== mobile/android/fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -289,10 +289,6 @@ android:title="@string/preferences_category_about" app:iconSpaceReserved="false" android:layout="@layout/preference_category_no_icon_style"> - <androidx.preference.Preference - android:key="@string/pref_key_rate" - app:iconSpaceReserved="false" - android:title="@string/preferences_rate" /> <androidx.preference.Preference android:key="@string/pref_key_about" ===================================== mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/PlayStoreReviewPromptControllerTest.kt ===================================== @@ -59,7 +59,7 @@ class PlayStoreReviewPromptControllerTest { launch { controller.tryPromptReview(activity) - assertTrue(reviewManager.promptHasBeenRequested) + assertTrue(!reviewManager.promptHasBeenRequested) } } } @@ -102,7 +102,7 @@ class PlayStoreReviewPromptControllerTest { onError = { onErrorRan = true }, ) - assertTrue(onErrorRan) + assertTrue(!onErrorRan) } } } ===================================== mobile/android/fenix/app/src/test/java/org/mozilla/fenix/reviewprompt/ShowPlayStoreReviewPromptTest.kt ===================================== @@ -155,7 +155,7 @@ class ShowPlayStoreReviewPromptTest { feature.start() testDispatcher.scheduler.advanceUntilIdle() - coVerify(exactly = 1) { + coVerify(exactly = 0) { promptController.tryPromptReview(mockActivity) } captureMiddleware.assertLastAction(ReviewPromptShown::class) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/cadcb5ec... -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/cadcb5ec... You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
participants (1)
-
Dan Ballard (@dan)