tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit c75b32977802a4899ce4fd3bef58d677c39a4656
parent c21e42d057f26995f1672875a6e0db62471c0f91
Author: Segun Famisa <sfamisa@mozilla.com>
Date:   Thu,  4 Dec 2025 10:50:25 +0000

Bug 2003897 - Add telemetry for credit card editor actions r=android-reviewers,fmasalha

This patch introduces Glean telemetry for user interactions within the credit card editor.

Metrics are now recorded for the following actions:
- `CreditCards.saved`: When a new credit card is successfully saved.
- `CreditCards.modified`: When an existing credit card is updated.
- `CreditCards.deleted`: When a credit card is deleted.

Differential Revision: https://phabricator.services.mozilla.com/D274981

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorMiddleware.kt | 5+++++
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorStoreTest.kt | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorMiddleware.kt @@ -17,6 +17,8 @@ import mozilla.components.concept.storage.UpdatableCreditCardFields import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext import mozilla.components.support.utils.creditCardIIN +import mozilla.telemetry.glean.private.NoExtras +import org.mozilla.fenix.GleanMetrics.CreditCards import org.mozilla.fenix.settings.creditcards.last4Digits import org.mozilla.fenix.settings.creditcards.ui.CreditCardEditorAction.DeleteDialogAction @@ -69,6 +71,7 @@ internal class CreditCardEditorMiddleware( withContext(mainDispatcher) { navigateBack() } + CreditCards.deleted.add() } } @@ -114,6 +117,7 @@ internal class CreditCardEditorMiddleware( withContext(mainDispatcher) { navigateBack() } + CreditCards.modified.record(NoExtras()) } } @@ -133,6 +137,7 @@ internal class CreditCardEditorMiddleware( withContext(mainDispatcher) { navigateBack() } + CreditCards.saved.add() } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorStoreTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorStoreTest.kt @@ -13,20 +13,28 @@ import mozilla.components.concept.storage.CreditCardNumber import mozilla.components.concept.storage.CreditCardsAddressesStorage import mozilla.components.concept.storage.NewCreditCardFields import mozilla.components.concept.storage.UpdatableCreditCardFields +import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.utils.CreditCardNetworkType import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.CreditCards +import org.mozilla.fenix.helpers.FenixGleanTestRule @RunWith(AndroidJUnit4::class) class CreditCardEditorStoreTest { @get:Rule val coroutinesTestRule = MainCoroutineRule() + + @get:Rule + val gleanTestRule = FenixGleanTestRule(testContext) + private val creditCardsStorage = FakeCreditCardsStorage() private val calendarDataProvider = FakeCalendarDataProvider( expectedMonths = listOf("January", "February", "March"), @@ -300,6 +308,58 @@ class CreditCardEditorStoreTest { ) } + @Test + fun `WHEN a card is deleted, then a telemetry event is sent`() = runTest { + val store = makeStore( + state = createState(guid = "card-id"), + ) + + store.dispatch(CreditCardEditorAction.DeleteDialogAction.Confirm) + + // verify that the event is sent + assertNotNull(CreditCards.deleted.testGetValue()) + } + + @Test + fun `WHEN a card is saved, THEN a telemetry event is sent`() = runTest { + val store = makeStore( + state = createState( + nameOnCard = "Jane Doe", + cardNumber = "5555444433331111", + expiryYears = listOf("2025", "2026", "2027"), + selectedExpiryYearIndex = 1, + expiryMonths = listOf("January", "February", "March"), + selectedExpiryMonthIndex = 0, + ), + ) + + store.dispatch(CreditCardEditorAction.Save) + + // verify that the event is sent + assertNotNull(CreditCards.saved.testGetValue()) + } + + @Test + fun `WHEN a card is updated, THEN a telemetry event is sent`() = runTest { + val store = makeStore( + state = createState( + guid = "1234", + inEditMode = true, + nameOnCard = "Jane Doe", + cardNumber = "5555444433331111", + expiryYears = listOf("2025", "2026", "2027"), + selectedExpiryYearIndex = 1, + expiryMonths = listOf("January", "February", "March"), + selectedExpiryMonthIndex = 0, + ), + ) + + store.dispatch(CreditCardEditorAction.Save) + + // verify that the event is sent + assertNotNull(CreditCards.modified.testGetValue()) + } + private fun makeStore( state: CreditCardEditorState = createState(), monthsProvider: CalendarDataProvider = calendarDataProvider,