@@ -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 */
3638class 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+ }
0 commit comments