Skip to content

Commit ecbfaf8

Browse files
Bug 1992079 - Keep legacy review prompt behavior if Nimbus flag for custom review prompt disabled r=android-reviewers,twhite
Differential Revision: https://phabricator.services.mozilla.com/D267197
1 parent c4856b0 commit ecbfaf8

4 files changed

Lines changed: 69 additions & 6 deletions

File tree

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ class Components(private val context: Context) {
290290
SetupChecklistTelemetryMiddleware(),
291291
ReviewPromptMiddleware(
292292
isReviewPromptFeatureEnabled = { settings.customReviewPromptFeatureEnabled },
293+
numberOfAppLaunches = { settings.numberOfAppLaunches },
294+
isDefaultBrowser = { settings.isDefaultBrowser },
293295
isTelemetryEnabled = { settings.isTelemetryEnabled },
294296
createJexlHelper = nimbus::createJexlHelper,
295297
nimbusEventStore = nimbus.events,

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ private const val REVIEW_PROMPT_SHOWN_NIMBUS_EVENT_ID = "review_prompt_shown"
2626
* [Middleware] evaluating the triggers to show a review prompt.
2727
*
2828
* @param isReviewPromptFeatureEnabled If returns false disables the entire feature and prompt will never be shown.
29+
* @param numberOfAppLaunches Returns number of app launches.
30+
* @param isDefaultBrowser Returns true if app is set as the default system browser.
2931
* @param isTelemetryEnabled Returns true if the user allows sending technical and interaction telemetry.
3032
* @param createJexlHelper Returns a helper for evaluating JEXL expressions.
3133
* @param buildTriggerMainCriteria Builds a sequence of trigger's main criteria that all need to be true.
@@ -35,21 +37,20 @@ private const val REVIEW_PROMPT_SHOWN_NIMBUS_EVENT_ID = "review_prompt_shown"
3537
*/
3638
class ReviewPromptMiddleware(
3739
private val isReviewPromptFeatureEnabled: () -> Boolean,
40+
private val numberOfAppLaunches: () -> Int,
41+
private val isDefaultBrowser: () -> Boolean,
3842
private val isTelemetryEnabled: () -> Boolean,
3943
private val createJexlHelper: () -> NimbusMessagingHelperInterface,
4044
private val buildTriggerMainCriteria: (NimbusMessagingHelperInterface) -> Sequence<Boolean> =
41-
TiggerBuilder.mainCriteria(isReviewPromptFeatureEnabled),
45+
TiggerBuilder::mainCriteria,
4246
private val buildTriggerSubCriteria: (NimbusMessagingHelperInterface) -> Sequence<Boolean> =
4347
TiggerBuilder::subCriteria,
4448
private val nimbusEventStore: NimbusEventStore,
4549
) : Middleware<AppState, AppAction> {
4650

4751
private object TiggerBuilder {
48-
fun mainCriteria(
49-
isReviewPromptEnabled: () -> Boolean,
50-
): (NimbusMessagingHelperInterface) -> Sequence<Boolean> = { jexlHelper ->
51-
sequence {
52-
yield(isReviewPromptEnabled())
52+
fun mainCriteria(jexlHelper: NimbusMessagingHelperInterface): Sequence<Boolean> {
53+
return sequence {
5354
yield(hasNotBeenPromptedLastFourMonths(jexlHelper))
5455
yield(usedAppOnAtLeastFourOfLastSevenDays(jexlHelper))
5556
}
@@ -90,6 +91,16 @@ class ReviewPromptMiddleware(
9091
return
9192
}
9293

94+
if (!isReviewPromptFeatureEnabled()) {
95+
// Keep the simpler legacy behavior.
96+
if (legacyReviewPromptTrigger(numberOfAppLaunches, isDefaultBrowser)) {
97+
context.dispatch(ShowPlayStorePrompt)
98+
} else {
99+
context.dispatch(DoNotShowReviewPrompt)
100+
}
101+
return
102+
}
103+
93104
createJexlHelper().use { jexlHelper ->
94105
val allMainCriteriaSatisfied = buildTriggerMainCriteria(jexlHelper).all { it }
95106
if (!allMainCriteriaSatisfied) {
@@ -158,3 +169,17 @@ internal fun usedAppOnAtLeastFourOfLastSevenDays(
158169
): Boolean {
159170
return jexlHelper.evalJexlSafe("'app_opened'|eventCountNonZero('Days', 7) >= 4")
160171
}
172+
173+
private const val NUMBER_OF_LAUNCHES_REQUIRED = 5
174+
175+
/**
176+
* Matches logic from ReviewPromptController.shouldShowPrompt, which has been deleted.
177+
* Kept so we can fall back to it in case the custom review prompt is disabled with a kill-switch.
178+
*/
179+
@VisibleForTesting
180+
internal fun legacyReviewPromptTrigger(
181+
numberOfAppLaunches: () -> Int,
182+
isDefaultBrowser: () -> Boolean,
183+
): Boolean {
184+
return isDefaultBrowser() && numberOfAppLaunches() >= NUMBER_OF_LAUNCHES_REQUIRED
185+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
package org.mozilla.fenix.reviewprompt
6+
7+
import org.junit.Assert.assertFalse
8+
import org.junit.Assert.assertTrue
9+
import org.junit.Test
10+
11+
class LegacyReviewPromptTriggerTest {
12+
13+
private var numberOfAppLaunches = 5
14+
private var isDefaultBrowser = true
15+
16+
@Test
17+
fun `WHEN app is the default browser AND was launched at least 5 times THEN legacy trigger is satisfied`() {
18+
assertTrue(legacyReviewPromptTrigger({ numberOfAppLaunches }, { isDefaultBrowser }))
19+
}
20+
21+
@Test
22+
fun `WHEN app isn't the default browser THEN legacy trigger is not satisfied`() {
23+
isDefaultBrowser = false
24+
25+
assertFalse(legacyReviewPromptTrigger({ numberOfAppLaunches }, { isDefaultBrowser }))
26+
}
27+
28+
@Test
29+
fun `WHEN app was launched less than 5 times THEN legacy trigger is not satisfied`() {
30+
numberOfAppLaunches = 4
31+
32+
assertFalse(legacyReviewPromptTrigger({ numberOfAppLaunches }, { isDefaultBrowser }))
33+
}
34+
}

mobile/android/fenix/app/src/test/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddlewareTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class ReviewPromptMiddlewareTest {
2929
middlewares = listOf(
3030
ReviewPromptMiddleware(
3131
isReviewPromptFeatureEnabled = { true },
32+
numberOfAppLaunches = { 5 },
33+
isDefaultBrowser = { true },
3234
isTelemetryEnabled = { isTelemetryEnabled },
3335
createJexlHelper = {
3436
object : NimbusMessagingHelperInterface {

0 commit comments

Comments
 (0)