commit 5302780bc645221c713a31954fee84e3a9071aa5
parent d4789cb490686e477365d554ccf18a49c50770e6
Author: t-p-white <towhite@mozilla.com>
Date: Wed, 15 Oct 2025 11:18:37 +0000
Bug 1991528 - Remove Nimbus advanced targeting for user clicks on the ToU bottom sheet's links and buttons. r=android-reviewers,gmalekpour
Essentially reverts the following patches:
- https://phabricator.services.mozilla.com/D260845
- https://phabricator.services.mozilla.com/D260822
Differential Revision: https://phabricator.services.mozilla.com/D268391
Diffstat:
8 files changed, 20 insertions(+), 118 deletions(-)
diff --git a/mobile/android/fenix/app/metrics.yaml b/mobile/android/fenix/app/metrics.yaml
@@ -12906,10 +12906,6 @@ nimbus_system:
type: boolean
no_shortcuts_or_stories_opt_outs:
type: boolean
- user_clicked_tou_prompt_link:
- type: boolean
- user_clicked_tou_prompt_remind_me_later:
- type: boolean
description: |
The Nimbus context object that is recorded to Glean
bugs:
@@ -12918,12 +12914,14 @@ nimbus_system:
- 'https://bugzilla.mozilla.org/show_bug.cgi?id=1970165'
- 'https://bugzilla.mozilla.org/show_bug.cgi?id=1981877'
- 'https://bugzilla.mozilla.org/show_bug.cgi?id=1984639'
+ - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1991528'
data_reviews:
- 'https://bugzilla.mozilla.org/show_bug.cgi?id=1898552#c3'
- 'https://phabricator.services.mozilla.com/D258942'
- 'https://phabricator.services.mozilla.com/D259407'
- 'https://phabricator.services.mozilla.com/D260845'
- 'https://phabricator.services.mozilla.com/D262139'
+ - 'https://phabricator.services.mozilla.com/D268391'
data_sensitivity:
- interaction
notification_emails:
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/experiments/RecordedNimbusContext.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/experiments/RecordedNimbusContext.kt
@@ -62,8 +62,6 @@ class RecordedNimbusContext(
val deviceModel: String = Build.MODEL,
val userAcceptedTou: Boolean,
val noShortcutsOrStoriesOptOuts: Boolean,
- val userClickedTouPromptLink: Boolean,
- val userClickedTouPromptRemindMeLater: Boolean,
) : RecordedContext {
/**
* [getEventQueries] is called by the Nimbus SDK Rust code to retrieve the map of event
@@ -104,8 +102,6 @@ class RecordedNimbusContext(
deviceModel = deviceModel,
userAcceptedTou = userAcceptedTou,
noShortcutsOrStoriesOptOuts = noShortcutsOrStoriesOptOuts,
- userClickedTouPromptLink = userClickedTouPromptLink,
- userClickedTouPromptRemindMeLater = userClickedTouPromptRemindMeLater,
),
)
Pings.nimbus.submit()
@@ -151,8 +147,6 @@ class RecordedNimbusContext(
"device_model" to deviceModel,
"user_accepted_tou" to userAcceptedTou,
"no_shortcuts_or_stories_opt_outs" to noShortcutsOrStoriesOptOuts,
- "user_clicked_tou_prompt_link" to userClickedTouPromptLink,
- "user_clicked_tou_prompt_remind_me_later" to userClickedTouPromptRemindMeLater,
),
)
return obj
@@ -200,8 +194,6 @@ class RecordedNimbusContext(
region = calculatedAttributes.region,
userAcceptedTou = settings.hasAcceptedTermsOfService,
noShortcutsOrStoriesOptOuts = settings.noShortcutsOrStoriesOptOuts(context),
- userClickedTouPromptLink = settings.hasClickedTermOfUsePromptLink,
- userClickedTouPromptRemindMeLater = settings.hasClickedTermOfUsePromptRemindMeLater,
)
}
@@ -258,8 +250,6 @@ class RecordedNimbusContext(
region = "US",
userAcceptedTou = true,
noShortcutsOrStoriesOptOuts = true,
- userClickedTouPromptLink = true,
- userClickedTouPromptRemindMeLater = true,
)
}
}
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddleware.kt
@@ -25,15 +25,9 @@ class TermsOfUsePromptPreferencesMiddleware(
repository.updateHasAcceptedTermsOfUsePreference()
is TermsOfUsePromptAction.OnRemindMeLaterClicked -> {
- repository.updateHasClickedTermOfUsePromptRemindMeLaterPreference()
repository.updateHasPostponedAcceptingTermsOfUsePreference()
}
- is TermsOfUsePromptAction.OnLearnMoreClicked,
- is TermsOfUsePromptAction.OnPrivacyNoticeClicked,
- is TermsOfUsePromptAction.OnTermsOfUseClicked,
- -> repository.updateHasClickedTermOfUsePromptLinkPreference()
-
is TermsOfUsePromptAction.OnPromptManuallyDismissed ->
repository.updateHasPostponedAcceptingTermsOfUsePreference()
@@ -42,6 +36,13 @@ class TermsOfUsePromptPreferencesMiddleware(
is TermsOfUsePromptAction.OnImpression ->
repository.incrementTermsOfUsePromptDisplayedCount()
+
+ // no-ops
+ is TermsOfUsePromptAction.OnLearnMoreClicked,
+ is TermsOfUsePromptAction.OnPrivacyNoticeClicked,
+ is TermsOfUsePromptAction.OnTermsOfUseClicked,
+ -> {
+ }
}
next(action)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt
@@ -31,16 +31,6 @@ interface TermsOfUsePromptRepository {
fun updateLastTermsOfUsePromptTimeInMillis(currentTimeInMillis: Long = System.currentTimeMillis())
/**
- * Updates the 'has clicked the term of use prompt link' preference to true.
- */
- fun updateHasClickedTermOfUsePromptLinkPreference()
-
- /**
- * Updates the 'has clicked the term of use prompt "remind me later" action' preference to true.
- */
- fun updateHasClickedTermOfUsePromptRemindMeLaterPreference()
-
- /**
* Increments the number of times the Terms of Use prompt has been displayed by 1.
*/
fun incrementTermsOfUsePromptDisplayedCount()
@@ -68,14 +58,6 @@ class DefaultTermsOfUsePromptRepository(
settings.lastTermsOfUsePromptTimeInMillis = currentTimeInMillis
}
- override fun updateHasClickedTermOfUsePromptLinkPreference() {
- settings.hasClickedTermOfUsePromptLink = true
- }
-
- override fun updateHasClickedTermOfUsePromptRemindMeLaterPreference() {
- settings.hasClickedTermOfUsePromptRemindMeLater = true
- }
-
override fun incrementTermsOfUsePromptDisplayedCount() {
settings.termsOfUsePromptDisplayedCount++
}
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
@@ -672,22 +672,6 @@ class Settings(private val appContext: Context) : PreferencesHolder {
)
/**
- * Used to determine users who have interacted with any links from the Terms of Use prompt.
- */
- var hasClickedTermOfUsePromptLink by booleanPreference(
- appContext.getPreferenceKey(R.string.pref_key_terms_clicked_link),
- default = false,
- )
-
- /**
- * Used to determine users who clicked the "remind me later" action.
- */
- var hasClickedTermOfUsePromptRemindMeLater by booleanPreference(
- appContext.getPreferenceKey(R.string.pref_key_terms_clicked_remind_me_later),
- default = false,
- )
-
- /**
* The daily usage ping is not normally tied to normal telemetry. We set the default value to
* [isTelemetryEnabled] because this setting was added in early 2025 and we want to make
* sure that users who upgrade and had telemetry disabled don't start sending the
diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml
@@ -90,8 +90,6 @@
<string name="pref_key_terms_last_prompt_time" translatable="false">pref_key_terms_last_prompt_time</string>
<string name="pref_key_terms_postponed" translatable="false">pref_key_terms_postponed</string>
<string name="pref_key_debug_terms_trigger_time" translatable="false">pref_key_debug_terms_trigger_time</string>
- <string name="pref_key_terms_clicked_link" translatable="false">pref_key_terms_clicked_link</string>
- <string name="pref_key_terms_clicked_remind_me_later" translatable="false">pref_key_terms_clicked_remind_me_later</string>
<string name="pref_key_should_show_marketing_onboarding" translatable="false">pref_key_should_show_marketing_onboarding</string>
<string name="pref_key_use_onboarding_redesign" translatable="false">pref_key_use_onboarding_redesign</string>
<string name="pref_key_crash_pull_never_show_again" translatable="false">pref_key_crash_pull_never_show_again</string>
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/experiments/RecordedNimbusContextTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/experiments/RecordedNimbusContextTest.kt
@@ -71,8 +71,6 @@ class RecordedNimbusContextTest {
put("device_model", Build.MODEL)
put("user_accepted_tou", true)
put("no_shortcuts_or_stories_opt_outs", true)
- put("user_clicked_tou_prompt_link", true)
- put("user_clicked_tou_prompt_remind_me_later", true)
},
contextAsJson,
)
@@ -117,8 +115,6 @@ class RecordedNimbusContextTest {
put("region", "US")
put("userAcceptedTou", true)
put("noShortcutsOrStoriesOptOuts", true)
- put("userClickedTouPromptLink", true)
- put("userClickedTouPromptRemindMeLater", true)
},
recordedValue?.jsonObject,
)
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddlewareTest.kt
@@ -48,8 +48,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest {
assertTrue(settings.hasAcceptedTermsOfService)
assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
assertEquals(0, settings.termsOfUsePromptDisplayedCount)
}
@@ -66,8 +64,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest {
assertFalse(settings.hasAcceptedTermsOfService)
assertTrue(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertTrue(settings.hasClickedTermOfUsePromptRemindMeLater)
assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
assertEquals(0, settings.termsOfUsePromptDisplayedCount)
}
@@ -84,8 +80,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest {
assertFalse(settings.hasAcceptedTermsOfService)
assertTrue(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
assertEquals(0, settings.termsOfUsePromptDisplayedCount)
}
@@ -102,90 +96,49 @@ class TermsOfUsePromptPreferencesMiddlewareTest {
assertFalse(settings.hasAcceptedTermsOfService)
assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
assertTrue(settings.lastTermsOfUsePromptTimeInMillis > 0)
assertEquals(0, settings.termsOfUsePromptDisplayedCount)
}
@Test
- fun `WHEN the OnLearnMoreClicked action is received THEN the expected preference is updated`() {
+ fun `WHEN the OnImpression action is received THEN the expected preference is updated`() {
assertAllPrefsDefault()
middleware.invoke(
context = context,
next = {},
- action = TermsOfUsePromptAction.OnLearnMoreClicked(Surface.HOMEPAGE_NEW_TAB),
+ action = TermsOfUsePromptAction.OnImpression(Surface.HOMEPAGE_NEW_TAB),
)
assertFalse(settings.hasAcceptedTermsOfService)
assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertTrue(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
- assertEquals(0, settings.termsOfUsePromptDisplayedCount)
+ assertEquals(1, settings.termsOfUsePromptDisplayedCount)
}
@Test
- fun `WHEN the OnPrivacyNoticeClicked action is received THEN the expected preference is updated`() {
- assertAllPrefsDefault()
-
- middleware.invoke(
- context = context,
- next = {},
- action = TermsOfUsePromptAction.OnPrivacyNoticeClicked(Surface.HOMEPAGE_NEW_TAB),
- )
-
- assertFalse(settings.hasAcceptedTermsOfService)
- assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertTrue(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
- assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
- assertEquals(0, settings.termsOfUsePromptDisplayedCount)
+ fun `WHEN action is noop THEN the repository settings are not updated`() {
+ assertNoOpAction(TermsOfUsePromptAction.OnLearnMoreClicked(Surface.HOMEPAGE_NEW_TAB))
+ assertNoOpAction(TermsOfUsePromptAction.OnPrivacyNoticeClicked(Surface.HOMEPAGE_NEW_TAB))
+ assertNoOpAction(TermsOfUsePromptAction.OnTermsOfUseClicked(Surface.HOMEPAGE_NEW_TAB))
}
- @Test
- fun `WHEN the OnTermsOfUseClicked action is received THEN the expected preference is updated`() {
- assertAllPrefsDefault()
-
- middleware.invoke(
- context = context,
- next = {},
- action = TermsOfUsePromptAction.OnTermsOfUseClicked(Surface.HOMEPAGE_NEW_TAB),
- )
-
+ private fun assertAllPrefsDefault() {
assertFalse(settings.hasAcceptedTermsOfService)
assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertTrue(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
assertEquals(0, settings.termsOfUsePromptDisplayedCount)
}
- @Test
- fun `WHEN the OnImpression action is received THEN the expected preference is updated`() {
+ private fun assertNoOpAction(action: TermsOfUsePromptAction) {
assertAllPrefsDefault()
middleware.invoke(
context = context,
next = {},
- action = TermsOfUsePromptAction.OnImpression(Surface.HOMEPAGE_NEW_TAB),
+ action = action,
)
- assertFalse(settings.hasAcceptedTermsOfService)
- assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
- assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
- assertEquals(1, settings.termsOfUsePromptDisplayedCount)
- }
-
- private fun assertAllPrefsDefault() {
- assertFalse(settings.hasAcceptedTermsOfService)
- assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(settings.hasClickedTermOfUsePromptLink)
- assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater)
- assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0)
- assertEquals(0, settings.termsOfUsePromptDisplayedCount)
+ assertAllPrefsDefault()
}
}