8000 Experiment with enabling prompted Fireproofing by default (#1097) · wertgit/Android@a712b09 · GitHub
[go: up one dir, main page]

Skip to content

Commit a712b09

Browse files
authored
Experiment with enabling prompted Fireproofing by default (duckduckgo#1097)
* Introduce control group and variants for experiment * dialog to disable login detection * enable login detection if variant present * be able to store event in database * Introduce new pixels when asking users to disable login detection * only ask to disable login detection the first time user dismisses twice fireproof prompt * when pixel sent, add param to know if user tried fire button * notify dismiss when dialog canceled by back button or user taps outside it * decouple Fireproog dialogs logic from browsertabviewmodel * Add interface to FireproofDialogEventHandler to test it inside BrowserTabViewModel
1 parent 8f46aa7 commit a712b09

File tree

21 files changed

+660
-54
lines changed

21 files changed

+660
-54
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.OpenInNewTab
4646
import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector
4747
import com.duckduckgo.app.browser.downloader.FileDownloader
4848
import com.duckduckgo.app.browser.favicon.FaviconManager
49+
import com.duckduckgo.app.browser.logindetection.FireproofDialogsEventHandler
4950
import com.duckduckgo.app.browser.logindetection.LoginDetected
5051
import com.duckduckgo.app.browser.logindetection.NavigationAwareLoginDetector
5152
import com.duckduckgo.app.browser.logindetection.NavigationEvent
@@ -233,6 +234,9 @@ class BrowserTabViewModelTest {
233234
@Mock
234235
private lateinit var geoLocationPermissions: GeoLocationPermissions
235236

237+
@Mock
238+
private lateinit var fireproofDialogsEventHandler: FireproofDialogsEventHandler
239+
236240
private val lazyFaviconManager = Lazy { mockFaviconManager }
237241

238242
private lateinit var mockAutoCompleteApi: AutoCompleteApi
@@ -254,6 +258,8 @@ class BrowserTabViewModelTest {
254258

255259
private val loginEventLiveData = MutableLiveData<LoginDetected>()
256260

261+
private val fireproofDialogsEventHandlerLiveData = MutableLiveData<FireproofDialogsEventHandler.Event>()
262+
257263
private val dismissedCtaDaoChannel = Channel<List<DismissedCta>>()
258264

259265
@Before
@@ -266,6 +272,7 @@ class BrowserTabViewModelTest {
266272
locationPermissionsDao = db.locationPermissionsDao()
267273

268274
mockAutoCompleteApi = AutoCompleteApi(mockAutoCompleteService, mockBookmarksDao)
275+
val fireproofWebsiteRepository = FireproofWebsiteRepository(fireproofWebsiteDao, coroutineRule.testDispatcherProvider, lazyFaviconManager)
269276

270277
whenever(mockDismissedCtaDao.dismissedCtas()).thenReturn(dismissedCtaDaoChannel.consumeAsFlow())
271278
whenever(mockTabRepository.flowTabs).thenReturn(flowOf(emptyList()))
@@ -297,6 +304,7 @@ class BrowserTabViewModelTest {
297304
whenever(mockPrivacyPractices.privacyPracticesFor(any())).thenReturn(PrivacyPractices.UNKNOWN)
298305
whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
299306
whenever(mockUserWhitelistDao.contains(anyString())).thenReturn(false)
307+
whenever(fireproofDialogsEventHandler.event).thenReturn(fireproofDialogsEventHandlerLiveData)
300308

301309
testee = BrowserTabViewModel(
302310
statisticsUpdater = mockStatisticsUpdater,
@@ -318,7 +326,7 @@ class BrowserTabViewModelTest {
318326
searchCountDao = mockSearchCountDao,
319327
pixel = mockPixel,
320328
dispatchers = coroutineRule.testDispatcherProvider,
321-
fireproofWebsiteRepository = FireproofWebsiteRepository(fireproofWebsiteDao, coroutineRule.testDispatcherProvider, lazyFaviconManager),
329+
fireproofWebsiteRepository = fireproofWebsiteRepository,
322330
locationPermissionsRepository = LocationPermissionsRepository(
323331
locationPermissionsDao,
324332
lazyFaviconManager,
@@ -331,7 +339,8 @@ class BrowserTabViewModelTest {
331339
useOurAppDetector = UseOurAppDetector(mockUserEventsStore),
332340
variantManager = mockVariantManager,
333341
fileDownloader = mockFileDownloader,
334-
globalPrivacyControl = GlobalPrivacyControlManager(mockSettingsStore)
342+
globalPrivacyControl = GlobalPrivacyControlManager(mockSettingsStore),
343+
fireproofDialogsEventHandler = fireproofDialogsEventHandler
335344
)
336345

337346
testee.loadData("abc", null, false)
@@ -2093,24 +2102,28 @@ class BrowserTabViewModelTest {
20932102
}
20942103

20952104
@Test
2096-
fun whenUserFireproofsWebsiteFromLoginDialogThenShowConfirmationIsIssuedWithExpectedDomain() {
2097-
loadUrl("http://mobile.example.com/", isBrowserShowing = true)
2105+
fun whenUserFireproofsWebsiteFromLoginDialogThenShowConfirmationIsIssuedWithExpectedDomain() = coroutineRule.runBlocking {
2106+
whenever(fireproofDialogsEventHandler.onUserConfirmedFireproofDialog(anyString())).doAnswer {
2107+
val domain = it.arguments.first() as String
2108+
fireproofDialogsEventHandlerLiveData.postValue(FireproofDialogsEventHandler.Event.FireproofWebSiteSuccess(FireproofWebsiteEntity(domain)))
2109+
}
2110+
20982111
testee.onUserConfirmedFireproofDialog("login.example.com")
2112+
20992113
assertCommandIssued<Command.ShowFireproofWebSiteConfirmation> {
21002114
assertEquals("login.example.com", this.fireproofWebsiteEntity.domain)
21012115
}
21022116
}
21032117

21042118
@Test
2105-
fun whenUserFireproofsWebsiteFromLoginDialogThenPixelSent() {
2106-
testee.onUserConfirmedFireproofDialog("login.example.com")
2107-
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_LOGIN_ADDED)
2108-
}
2119+
fun whenAskToDisableLoginDetectionEventReceivedThenAskUserToDisableLoginDetection() = coroutineRule.runBlocking {
2120+
whenever(fireproofDialogsEventHandler.onUserDismissedFireproofLoginDialog()).doAnswer {
2121+
fireproofDialogsEventHandlerLiveData.postValue(FireproofDialogsEventHandler.Event.AskToDisableLoginDetection)
2122+
}
21092123

2110-
@Test
2111-
fun whenUserDismissesFireproofWebsiteLoginDialogThenPixelSent() {
21122124
testee.onUserDismissedFireproofLoginDialog()
2113-
verify(mockPixel).fire(Pixel.PixelName.FIREPROOF_WEBSITE_LOGIN_DISMISS)
2125+
2126+
assertCommandIssued<Command.AskToDisableLoginDetection>()
21142127
}
21152128

21162129
@Test

0 commit comments

Comments
 (0)
0