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:
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,