Loading mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt +20 −1 Original line number Diff line number Diff line Loading @@ -110,6 +110,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 /** Loading Loading @@ -274,7 +280,7 @@ class Components(private val context: Context) { val playStoreReviewPromptController by lazyMonitored { PlayStoreReviewPromptController( manager = ReviewManagerFactory.create(context), manager = NoopReviewManager(context), numberOfAppLaunches = { settings.numberOfAppLaunches }, ) } Loading Loading @@ -523,6 +529,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]. */ Loading mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt +4 −56 Original line number Diff line number Diff line Loading @@ -43,46 +43,8 @@ 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 } /** Loading @@ -92,22 +54,8 @@ class PlayStoreReviewPromptController( activity: Activity, openInNewTab: (url: String) -> Unit, ) { 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. openInNewTab(SupportUtils.FENIX_PLAY_STORE_URL) 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 { Loading mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt +1 −17 Original line number Diff line number Diff line Loading @@ -112,23 +112,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()) { Loading mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptReducer.kt +1 −6 Original line number Diff line number Diff line Loading @@ -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 +0 −6 Original line number Diff line number Diff line Loading @@ -566,12 +566,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SystemInsetsPaddedFragment, SettingsFragmentDirections.actionSettingsFragmentToSyncDebugFragment() } // About preferences resources.getString(R.string.pref_key_rate) -> { components.playStoreReviewPromptController.tryLaunchPlayStoreReview(requireActivity(), ::openInNewTab) null } resources.getString(R.string.pref_key_about) -> { SettingsFragmentDirections.actionSettingsFragmentToAboutFragment() } Loading Loading
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt +20 −1 Original line number Diff line number Diff line Loading @@ -110,6 +110,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 /** Loading Loading @@ -274,7 +280,7 @@ class Components(private val context: Context) { val playStoreReviewPromptController by lazyMonitored { PlayStoreReviewPromptController( manager = ReviewManagerFactory.create(context), manager = NoopReviewManager(context), numberOfAppLaunches = { settings.numberOfAppLaunches }, ) } Loading Loading @@ -523,6 +529,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]. */ Loading
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/PlayStoreReviewPromptController.kt +4 −56 Original line number Diff line number Diff line Loading @@ -43,46 +43,8 @@ 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 } /** Loading @@ -92,22 +54,8 @@ class PlayStoreReviewPromptController( activity: Activity, openInNewTab: (url: String) -> Unit, ) { 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. openInNewTab(SupportUtils.FENIX_PLAY_STORE_URL) 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 { Loading
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt +1 −17 Original line number Diff line number Diff line Loading @@ -112,23 +112,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()) { Loading
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptReducer.kt +1 −6 Original line number Diff line number Diff line Loading @@ -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 +0 −6 Original line number Diff line number Diff line Loading @@ -566,12 +566,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SystemInsetsPaddedFragment, SettingsFragmentDirections.actionSettingsFragmentToSyncDebugFragment() } // About preferences resources.getString(R.string.pref_key_rate) -> { components.playStoreReviewPromptController.tryLaunchPlayStoreReview(requireActivity(), ::openInNewTab) null } resources.getString(R.string.pref_key_about) -> { SettingsFragmentDirections.actionSettingsFragmentToAboutFragment() } Loading