Skip to content

Commit ab83106

Browse files
committed
Migrate to use send() extension function
1 parent ba49089 commit ab83106

13 files changed

Lines changed: 109 additions & 742 deletions

File tree

app-tracking-protection/vpn-impl/src/main/java/com/duckduckgo/mobile/android/vpn/pixels/DeviceShieldPixels.kt

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.duckduckgo.app.statistics.pixels.Pixel
2323
import com.duckduckgo.common.utils.DispatcherProvider
2424
import com.duckduckgo.data.store.api.SharedPreferencesProvider
2525
import com.duckduckgo.di.scopes.AppScope
26+
import com.duckduckgo.feature.toggles.api.send
2627
import com.duckduckgo.mobile.android.vpn.feature.AppTpTDSPixelsPlugin
2728
import com.duckduckgo.mobile.android.vpn.feature.didFailToDownloadTDS
2829
import com.duckduckgo.mobile.android.vpn.feature.getDisabledProtectionForApp
@@ -673,18 +674,14 @@ class RealDeviceShieldPixels @Inject constructor(
673674
override fun didChooseToDisableTrackingProtectionFromDialog() {
674675
firePixel(DeviceShieldPixelNames.ATP_DID_CHOOSE_DISABLE_TRACKING_PROTECTION_DIALOG)
675676
appCoroutineScope.launch(dispatcherProvider.io()) {
676-
appTpTDSPixelsPlugin.getSelectedDisableProtection()?.getPixelDefinitions()?.forEach {
677-
firePixel(it.pixelName, it.params)
678-
}
677+
appTpTDSPixelsPlugin.getSelectedDisableProtection()?.send()
679678
}
680679
}
681680

682681
override fun didChooseToDisableOneAppFromDialog() {
683682
firePixel(DeviceShieldPixelNames.ATP_DID_CHOOSE_DISABLE_ONE_APP_PROTECTION_DIALOG)
684683
appCoroutineScope.launch(dispatcherProvider.io()) {
685-
appTpTDSPixelsPlugin.getSelectedDisableAppProtection()?.getPixelDefinitions()?.forEach {
686-
firePixel(it.pixelName, it.params)
687-
}
684+
appTpTDSPixelsPlugin.getSelectedDisableAppProtection()?.send()
688685
}
689686
}
690687

@@ -769,12 +766,8 @@ class RealDeviceShieldPixels @Inject constructor(
769766
override fun didDisableAppProtectionFromDetail() {
770767
firePixel(DeviceShieldPixelNames.ATP_DID_DISABLE_APP_PROTECTION_FROM_DETAIL)
771768
appCoroutineScope.launch(dispatcherProvider.io()) {
772-
appTpTDSPixelsPlugin.getProtectionDisabledAppFromDetail()?.getPixelDefinitions()?.forEach {
773-
firePixel(it.pixelName, it.params)
774-
}
775-
appTpTDSPixelsPlugin.getDisabledProtectionForApp()?.getPixelDefinitions()?.forEach {
776-
firePixel(it.pixelName, it.params)
777-
}
769+
appTpTDSPixelsPlugin.getProtectionDisabledAppFromDetail()?.send()
770+
appTpTDSPixelsPlugin.getDisabledProtectionForApp()?.send()
778771
}
779772
}
780773

@@ -785,12 +778,8 @@ class RealDeviceShieldPixels @Inject constructor(
785778
override fun didDisableAppProtectionFromApps() {
786779
firePixel(DeviceShieldPixelNames.ATP_DID_DISABLE_APP_PROTECTION_FROM_ALL)
787780
appCoroutineScope.launch(dispatcherProvider.io()) {
788-
appTpTDSPixelsPlugin.getProtectionDisabledAppFromAll()?.getPixelDefinitions()?.forEach {
789-
firePixel(it.pixelName, it.params)
790-
}
791-
appTpTDSPixelsPlugin.getDisabledProtectionForApp()?.getPixelDefinitions()?.forEach {
792-
firePixel(it.pixelName, it.params)
793-
}
781+
appTpTDSPixelsPlugin.getProtectionDisabledAppFromAll()?.send()
782+
appTpTDSPixelsPlugin.getDisabledProtectionForApp()?.send()
794783
}
795784
}
796785

@@ -804,9 +793,7 @@ class RealDeviceShieldPixels @Inject constructor(
804793
tryToFireDailyPixel(DeviceShieldPixelNames.ATP_DID_CHOOSE_REMOVE_TRACKING_PROTECTION_DIALOG_DAILY)
805794
firePixel(DeviceShieldPixelNames.ATP_DID_CHOOSE_REMOVE_TRACKING_PROTECTION_DIALOG)
806795
appCoroutineScope.launch(dispatcherProvider.io()) {
807-
appTpTDSPixelsPlugin.getSelectedRemoveAppTP()?.getPixelDefinitions()?.forEach {
808-
firePixel(it.pixelName, it.params)
809-
}
796+
appTpTDSPixelsPlugin.getSelectedRemoveAppTP()?.send()
810797
}
811798
}
812799

@@ -968,9 +955,7 @@ class RealDeviceShieldPixels @Inject constructor(
968955
),
969956
)
970957
appCoroutineScope.launch(dispatcherProvider.io()) {
971-
appTpTDSPixelsPlugin.didFailToDownloadTDS()?.getPixelDefinitions()?.forEach {
972-
firePixel(it.pixelName, it.params)
973-
}
958+
appTpTDSPixelsPlugin.didFailToDownloadTDS()?.send()
974959
}
975960
}
976961

app/src/main/java/com/duckduckgo/app/browser/refreshpixels/RefreshPixelSender.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.duckduckgo.app.trackerdetection.blocklist.get3XRefresh
2727
import com.duckduckgo.brokensite.api.RefreshPattern
2828
import com.duckduckgo.common.utils.DispatcherProvider
2929
import com.duckduckgo.di.scopes.AppScope
30+
import com.duckduckgo.feature.toggles.api.send
3031
import com.squareup.anvil.annotations.ContributesBinding
3132
import dagger.SingleInstanceIn
3233
import kotlinx.coroutines.CoroutineScope
@@ -70,17 +71,13 @@ class DuckDuckGoRefreshPixelSender @Inject constructor(
7071
patternsDetected.forEach { detectedPattern ->
7172
when (detectedPattern) {
7273
RefreshPattern.TWICE_IN_12_SECONDS -> {
73-
blockListPixelsPlugin.get2XRefresh()?.getPixelDefinitions()?.forEach {
74-
pixel.fire(it.pixelName, it.params)
75-
}
74+
blockListPixelsPlugin.get2XRefresh()?.send()
7675
pixel.fire(AppPixelName.RELOAD_TWICE_WITHIN_12_SECONDS)
7776
}
7877

7978
RefreshPattern.THRICE_IN_20_SECONDS -> {
8079
pixel.fire(AppPixelName.RELOAD_THREE_TIMES_WITHIN_20_SECONDS)
81-
blockListPixelsPlugin.get3XRefresh()?.getPixelDefinitions()?.forEach {
82-
pixel.fire(it.pixelName, it.params)
83-
}
80+
blockListPixelsPlugin.get3XRefresh()?.send()
8481
}
8582
else -> logcat(WARN) { "Unknown refresh pattern: $detectedPattern, no pixels fired" }
8683
}

app/src/main/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListPrivacyTogglePlugin.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.duckduckgo.app.trackerdetection.blocklist
1818

19-
import com.duckduckgo.app.statistics.pixels.Pixel
2019
import com.duckduckgo.di.scopes.AppScope
20+
import com.duckduckgo.feature.toggles.api.send
2121
import com.duckduckgo.privacy.dashboard.api.PrivacyProtectionTogglePlugin
2222
import com.duckduckgo.privacy.dashboard.api.PrivacyToggleOrigin
2323
import com.squareup.anvil.annotations.ContributesMultibinding
@@ -26,7 +26,6 @@ import javax.inject.Inject
2626
@ContributesMultibinding(AppScope::class)
2727
class BlockListPrivacyTogglePlugin @Inject constructor(
2828
private val blockListPixelsPlugin: BlockListPixelsPlugin,
29-
private val pixel: Pixel,
3029
) : PrivacyProtectionTogglePlugin {
3130

3231
override suspend fun onToggleOn(origin: PrivacyToggleOrigin) {
@@ -35,9 +34,7 @@ class BlockListPrivacyTogglePlugin @Inject constructor(
3534

3635
override suspend fun onToggleOff(origin: PrivacyToggleOrigin) {
3736
if (origin == PrivacyToggleOrigin.DASHBOARD) {
38-
blockListPixelsPlugin.getPrivacyToggleUsed()?.getPixelDefinitions()?.forEach {
39-
pixel.fire(it.pixelName, it.params)
40-
}
37+
blockListPixelsPlugin.getPrivacyToggleUsed()?.send()
4138
}
4239
}
4340
}

app/src/test/java/com/duckduckgo/app/browser/refreshpixels/RefreshPixelSenderTest.kt

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ import com.duckduckgo.app.trackerdetection.blocklist.BlockList.Cohorts.TREATMENT
1010
import com.duckduckgo.app.trackerdetection.blocklist.BlockListPixelsPlugin
1111
import com.duckduckgo.app.trackerdetection.blocklist.FakeFeatureTogglesInventory
1212
import com.duckduckgo.app.trackerdetection.blocklist.TestBlockListFeature
13-
import com.duckduckgo.app.trackerdetection.blocklist.get2XRefresh
14-
import com.duckduckgo.app.trackerdetection.blocklist.get3XRefresh
1513
import com.duckduckgo.brokensite.api.RefreshPattern
1614
import com.duckduckgo.common.test.CoroutineTestRule
15+
import com.duckduckgo.feature.toggles.api.FakeMetricsPixelExtension
1716
import com.duckduckgo.feature.toggles.api.FakeToggleStore
1817
import com.duckduckgo.feature.toggles.api.FeatureToggles
1918
import com.duckduckgo.feature.toggles.api.FeatureTogglesInventory
@@ -22,13 +21,14 @@ import com.duckduckgo.feature.toggles.api.Toggle.State.Cohort
2221
import com.duckduckgo.feature.toggles.impl.RealFeatureTogglesInventory
2322
import com.squareup.moshi.Moshi
2423
import kotlinx.coroutines.test.runTest
24+
import org.junit.Assert.assertEquals
25+
import org.junit.Assert.assertTrue
2526
import org.junit.Before
2627
import org.junit.Rule
2728
import org.junit.Test
2829
import org.junit.runner.RunWith
2930
import org.mockito.Mockito.mock
3031
import org.mockito.Mockito.verify
31-
import org.mockito.kotlin.never
3232
import java.time.ZoneId
3333
import java.time.ZonedDateTime
3434

@@ -49,6 +49,7 @@ class RefreshPixelSenderTest {
4949
private val configAdapter = moshi.adapter(Config::class.java)
5050

5151
private val mockPixel: Pixel = mock()
52+
private val fakeMetricsPixelExtension = FakeMetricsPixelExtension()
5253
private lateinit var testBlockListFeature: TestBlockListFeature
5354
private lateinit var inventory: FeatureTogglesInventory
5455
private lateinit var blockListPixelsPlugin: BlockListPixelsPlugin
@@ -74,6 +75,8 @@ class RefreshPixelSenderTest {
7475
coroutineTestRule.testDispatcherProvider,
7576
)
7677

78+
fakeMetricsPixelExtension.register()
79+
7780
blockListPixelsPlugin = BlockListPixelsPlugin(inventory)
7881

7982
testee = DuckDuckGoRefreshPixelSender(
@@ -118,40 +121,33 @@ class RefreshPixelSenderTest {
118121
}
119122

120123
@Test
121-
fun whenRefreshedTwiceAndThriceAndAssignedToExperimentThen2XAnd3XRefreshPixelsFired() = runTest {
124+
fun whenRefreshedTwiceAndThriceAndAssignedToExperimentThen2XAnd3XRefreshPixelsSent() = runTest {
122125
assignToExperiment()
123126
val refreshPatterns = setOf(RefreshPattern.TWICE_IN_12_SECONDS, RefreshPattern.THRICE_IN_20_SECONDS)
124127
testee.onRefreshPatternDetected(refreshPatterns)
125128

126-
blockListPixelsPlugin.get2XRefresh()!!.getPixelDefinitions().forEach {
127-
verify(mockPixel).fire(it.pixelName, it.params)
128-
}
129-
blockListPixelsPlugin.get3XRefresh()!!.getPixelDefinitions().forEach {
130-
verify(mockPixel).fire(it.pixelName, it.params)
131-
}
129+
assertEquals(2, fakeMetricsPixelExtension.sentMetrics.size)
130+
assertTrue(fakeMetricsPixelExtension.sentMetrics.any { it.metric == "2xRefresh" })
131+
assertTrue(fakeMetricsPixelExtension.sentMetrics.any { it.metric == "3xRefresh" })
132132
verify(mockPixel).fire(AppPixelName.RELOAD_TWICE_WITHIN_12_SECONDS)
133133
verify(mockPixel).fire(AppPixelName.RELOAD_THREE_TIMES_WITHIN_20_SECONDS)
134134
}
135135

136136
@Test
137-
fun whenRefreshedTwiceAndNotAssignedToExperimentThenExperiment2XRefreshPixelsNotFired() = runTest {
137+
fun whenRefreshedTwiceAndNotAssignedToExperimentThenExperiment2XRefreshPixelsNotSent() = runTest {
138138
val refreshPatterns = setOf(RefreshPattern.TWICE_IN_12_SECONDS)
139139
testee.onRefreshPatternDetected(refreshPatterns)
140140

141-
blockListPixelsPlugin.get2XRefresh()?.getPixelDefinitions()?.forEach {
142-
verify(mockPixel, never()).fire(it.pixelName, it.params)
143-
}
141+
assertTrue(fakeMetricsPixelExtension.sentMetrics.isEmpty())
144142
verify(mockPixel).fire(AppPixelName.RELOAD_TWICE_WITHIN_12_SECONDS)
145143
}
146144

147145
@Test
148-
fun whenRefreshedThriceAndNotAssignedToExperimentThenExperiment3XRefreshPixelsNotFired() = runTest {
146+
fun whenRefreshedThriceAndNotAssignedToExperimentThenExperiment3XRefreshPixelsNotSent() = runTest {
149147
val refreshPatterns = setOf(RefreshPattern.THRICE_IN_20_SECONDS)
150148
testee.onRefreshPatternDetected(refreshPatterns)
151149

152-
blockListPixelsPlugin.get3XRefresh()?.getPixelDefinitions()?.forEach {
153-
verify(mockPixel, never()).fire(it.pixelName, it.params)
154-
}
150+
assertTrue(fakeMetricsPixelExtension.sentMetrics.isEmpty())
155151
verify(mockPixel).fire(AppPixelName.RELOAD_THREE_TIMES_WITHIN_20_SECONDS)
156152
}
157153

app/src/test/java/com/duckduckgo/app/trackerdetection/blocklist/BlockListPrivacyTogglePluginTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.duckduckgo.app.trackerdetection.blocklist
22

33
import android.annotation.SuppressLint
4-
import com.duckduckgo.app.statistics.pixels.Pixel
54
import com.duckduckgo.app.trackerdetection.blocklist.BlockList.Cohorts.TREATMENT
65
import com.duckduckgo.common.test.CoroutineTestRule
6+
import com.duckduckgo.feature.toggles.api.FakeMetricsPixelExtension
77
import com.duckduckgo.feature.toggles.api.FakeToggleStore
88
import com.duckduckgo.feature.toggles.api.FeatureToggles
99
import com.duckduckgo.feature.toggles.api.FeatureTogglesInventory
@@ -14,12 +14,11 @@ import com.duckduckgo.privacy.dashboard.api.PrivacyToggleOrigin.DASHBOARD
1414
import com.duckduckgo.privacy.dashboard.api.PrivacyToggleOrigin.MENU
1515
import com.squareup.moshi.Moshi
1616
import kotlinx.coroutines.test.runTest
17+
import org.junit.Assert.assertEquals
18+
import org.junit.Assert.assertTrue
1719
import org.junit.Before
1820
import org.junit.Rule
1921
import org.junit.Test
20-
import org.mockito.Mockito.verify
21-
import org.mockito.kotlin.mock
22-
import org.mockito.kotlin.verifyNoInteractions
2322
import java.time.ZoneId
2423
import java.time.ZonedDateTime
2524

@@ -38,7 +37,7 @@ class BlockListPrivacyTogglePluginTest {
3837
)
3938
private val configAdapter = moshi.adapter(Config::class.java)
4039

41-
private val pixel: Pixel = mock()
40+
private val fakeMetricsPixelExtension = FakeMetricsPixelExtension()
4241
private lateinit var testBlockListFeature: TestBlockListFeature
4342
private lateinit var inventory: FeatureTogglesInventory
4443
private lateinit var blockListPixelsPlugin: BlockListPixelsPlugin
@@ -63,30 +62,31 @@ class BlockListPrivacyTogglePluginTest {
6362
coroutineRule.testDispatcherProvider,
6463
)
6564

65+
fakeMetricsPixelExtension.register()
66+
6667
blockListPixelsPlugin = BlockListPixelsPlugin(inventory)
67-
blockListPrivacyTogglePlugin = BlockListPrivacyTogglePlugin(blockListPixelsPlugin, pixel)
68+
blockListPrivacyTogglePlugin = BlockListPrivacyTogglePlugin(blockListPixelsPlugin)
6869
}
6970

7071
@Test
71-
fun `when toggle is off and assigned to experiment and origin dashboard then send pixels`() = runTest {
72+
fun `when toggle is off and assigned to experiment and origin dashboard then send pixel`() = runTest {
7273
assignToExperiment()
7374

7475
blockListPrivacyTogglePlugin.onToggleOff(DASHBOARD)
7576

76-
blockListPixelsPlugin.getPrivacyToggleUsed()!!.getPixelDefinitions().forEach {
77-
verify(pixel).fire(it.pixelName, it.params)
78-
}
77+
assertEquals(1, fakeMetricsPixelExtension.sentMetrics.size)
78+
assertEquals("privacyToggleUsed", fakeMetricsPixelExtension.sentMetrics.first().metric)
7979
}
8080

8181
@Test
8282
fun `when toggle is off and assigned to experiment and origin is not dashboard then do not send pixels`() = runTest {
8383
assignToExperiment()
8484

8585
blockListPrivacyTogglePlugin.onToggleOff(MENU)
86-
verifyNoInteractions(pixel)
86+
assertTrue(fakeMetricsPixelExtension.sentMetrics.isEmpty())
8787

8888
blockListPrivacyTogglePlugin.onToggleOff(BREAKAGE_FORM)
89-
verifyNoInteractions(pixel)
89+
assertTrue(fakeMetricsPixelExtension.sentMetrics.isEmpty())
9090
}
9191

9292
private fun assignToExperiment() {

0 commit comments

Comments
 (0)