Skip to content

Commit 9276124

Browse files
committed
Merge branch 'release/5.78.0' into main
2 parents 5d447e0 + 4a944ca commit 9276124

File tree

192 files changed

+4809
-1360
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

192 files changed

+4809
-1360
lines changed

app/build.gradle

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ apply plugin: 'com.android.application'
33
apply plugin: 'kotlin-android'
44
apply plugin: 'kotlin-android-extensions'
55
apply plugin: 'kotlin-kapt'
6+
apply plugin: 'com.squareup.anvil'
67
apply from: '../versioning.gradle'
78
apply from: "$rootDir/spotless.gradle"
89

@@ -11,15 +12,15 @@ ext {
1112
}
1213

1314
android {
14-
compileSdkVersion 29
15+
compileSdkVersion compile_sdk
1516
ndkVersion '21.0.6113669'
1617
defaultConfig {
1718
applicationId "com.duckduckgo.mobile.android"
18-
minSdkVersion 21
19-
targetSdkVersion 29
19+
minSdkVersion min_sdk
20+
targetSdkVersion target_sdk
2021
versionCode buildVersionCode()
2122
versionName buildVersionName()
22-
testInstrumentationRunner "com.duckduckgo.app.TestRunner"
23+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2324
archivesBaseName = "duckduckgo-$versionName"
2425
vectorDrawables.useSupportLibrary = true
2526

@@ -62,6 +63,22 @@ android {
6263
]
6364
}
6465
}
66+
flavorDimensions "store"
67+
productFlavors {
68+
fdroid{
69+
dimension "store"
70+
}
71+
play{
72+
dimension "store"
73+
}
74+
}
75+
variantFilter { variant ->
76+
def names = variant.flavors*.name
77+
if (names.contains("fdroid") && variant.buildType.name == "debug") {
78+
// We only need the F-Droid release version
79+
setIgnore(true)
80+
}
81+
}
6582
externalNativeBuild {
6683

6784
cmake {
@@ -96,6 +113,10 @@ android {
96113
}
97114

98115
dependencies {
116+
implementation project(path: ':statistics')
117+
implementation project(path: ':common')
118+
implementation project(path: ':di')
119+
99120
implementation AndroidX.legacy.supportV4
100121
debugImplementation Square.leakCanary.android
101122

@@ -161,10 +182,7 @@ dependencies {
161182
implementation AndroidX.work.rxJava2
162183

163184
// Dagger
164-
kapt Google.dagger.android.processor
165185
kapt Google.dagger.compiler
166-
kaptAndroidTest "com.google.dagger:dagger-android-processor:_"
167-
kaptAndroidTest "com.google.dagger:dagger-compiler:_"
168186

169187
// Glide
170188
implementation "com.github.bumptech.glide:glide:_"
@@ -174,11 +192,8 @@ dependencies {
174192
// Lottie
175193
implementation "com.airbnb.android:lottie:_"
176194

177-
// Apache commons
178-
implementation "org.apache.commons:commons-math3:_"
179-
180195
// Play Store referrer library
181-
implementation("com.android.installreferrer:installreferrer:_")
196+
playImplementation("com.android.installreferrer:installreferrer:_")
182197

183198
// Testing dependencies
184199
androidTestImplementation AndroidX.test.runner

app/src/androidTest/java/com/duckduckgo/app/TestApplication.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/androidTest/java/com/duckduckgo/app/TestExtensions.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import androidx.annotation.UiThread
2020
import androidx.lifecycle.LiveData
2121
import androidx.lifecycle.Observer
2222
import androidx.test.platform.app.InstrumentationRegistry
23-
import com.duckduckgo.app.di.TestAppComponent
23+
import com.duckduckgo.app.di.AppComponent
24+
import com.duckduckgo.app.global.DuckDuckGoApplication
2425
import java.util.concurrent.CountDownLatch
2526
import java.util.concurrent.TimeUnit
2627

@@ -38,10 +39,10 @@ fun <T> LiveData<T>.blockingObserve(): T? {
3839
return value
3940
}
4041

41-
fun getApp(): TestApplication {
42-
return InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as TestApplication
42+
fun getApp(): DuckDuckGoApplication {
43+
return InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as DuckDuckGoApplication
4344
}
4445

45-
fun getDaggerComponent(): TestAppComponent {
46-
return getApp().daggerAppComponent as TestAppComponent
46+
fun getDaggerComponent(): AppComponent {
47+
return getApp().daggerAppComponent as AppComponent
4748
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package com.duckduckgo.app.browser
1919
import android.content.Context
2020
import android.webkit.WebStorage
2121
import android.webkit.WebView
22-
import android.webkit.WebViewDatabase
2322
import androidx.test.platform.app.InstrumentationRegistry
2423
import com.duckduckgo.app.browser.httpauth.WebViewHttpAuthStore
2524
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
@@ -40,7 +39,6 @@ class WebViewDataManagerTest {
4039
private val mockStorage: WebStorage = mock()
4140
private val context = InstrumentationRegistry.getInstrumentation().targetContext
4241
private val mockFileDeleter: FileDeleter = mock()
43-
private val mockWebViewDatabase: WebViewDatabase = mock()
4442
private val mockWebViewHttpAuthStore: WebViewHttpAuthStore = mock()
4543
private val testee = WebViewDataManager(context, WebViewSessionInMemoryStorage(), mockCookieManager, mockFileDeleter, mockWebViewHttpAuthStore)
4644

@@ -89,6 +87,15 @@ class WebViewDataManagerTest {
8987
}
9088
}
9189

90+
@Test
91+
fun whenDataClearedThenHttpAuthDatabaseCleaned() = runBlocking<Unit> {
92+
withContext(Dispatchers.Main) {
93+
val webView = TestWebView(context)
94+
testee.clearData(webView, mockStorage)
95+
verify(mockWebViewHttpAuthStore).cleanHttpAuthDatabase()
96+
}
97+
}
98+
9299
@Test
93100
fun whenDataClearedThenWebViewCookiesRemoved() = runBlocking<Unit> {
94101
withContext(Dispatchers.Main) {

app/src/androidTest/java/com/duckduckgo/app/browser/httpauth/WebViewHttpAuthStoreTest.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@ package com.duckduckgo.app.browser.httpauth
1919
import android.webkit.WebView
2020
import android.webkit.WebViewDatabase
2121
import androidx.test.filters.SdkSuppress
22+
import androidx.test.platform.app.InstrumentationRegistry
2223
import com.duckduckgo.app.CoroutineTestRule
24+
import com.duckduckgo.app.fire.AuthDatabaseLocator
25+
import com.duckduckgo.app.fire.DatabaseCleaner
26+
import com.duckduckgo.app.runBlocking
2327
import com.nhaarman.mockitokotlin2.mock
28+
import com.nhaarman.mockitokotlin2.never
2429
import com.nhaarman.mockitokotlin2.verify
2530
import com.nhaarman.mockitokotlin2.whenever
2631
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -32,13 +37,15 @@ import org.junit.Test
3237
class WebViewHttpAuthStoreTest {
3338

3439
@get:Rule
35-
@Suppress("unused")
3640
val coroutineRule = CoroutineTestRule()
3741

42+
private val context = InstrumentationRegistry.getInstrumentation().targetContext
3843
private val webViewDatabase: WebViewDatabase = mock()
44+
private val mockDatabaseCleaner: DatabaseCleaner = mock()
3945
private val webView: WebView = mock()
46+
private val databaseLocator = AuthDatabaseLocator(context)
4047

41-
private val webViewHttpAuthStore = RealWebViewHttpAuthStore(webViewDatabase)
48+
private val webViewHttpAuthStore = RealWebViewHttpAuthStore(webViewDatabase, mockDatabaseCleaner, databaseLocator, coroutineRule.testDispatcherProvider)
4249

4350
@Test
4451
@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.O)
@@ -89,4 +96,31 @@ class WebViewHttpAuthStoreTest {
8996

9097
assertEquals(WebViewHttpAuthCredentials("name", "pass"), credentials)
9198
}
99+
100+
@Test
101+
fun whenCleanHttpAuthDatabaseThenCleanDatabaseCalled() = coroutineRule.runBlocking {
102+
webViewHttpAuthStore.cleanHttpAuthDatabase()
103+
verify(mockDatabaseCleaner).cleanDatabase(databaseLocator.getDatabasePath())
104+
}
105+
106+
@Test
107+
@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.LOLLIPOP, maxSdkVersion = android.os.Build.VERSION_CODES.O_MR1)
108+
fun whenAppCreatedAndApiBetween21And27ThenJournalModeChangedToDelete() = coroutineRule.runBlocking {
109+
webViewHttpAuthStore.onAppCreated()
110+
verify(mockDatabaseCleaner).changeJournalModeToDelete(databaseLocator.getDatabasePath())
111+
}
112+
113+
@Test
114+
@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.Q)
115+
fun whenAppCreatedAndApiGreaterThan28ThenJournalModeChangedToDelete() = coroutineRule.runBlocking {
116+
webViewHttpAuthStore.onAppCreated()
117+
verify(mockDatabaseCleaner).changeJournalModeToDelete(databaseLocator.getDatabasePath())
118+
}
119+
120+
@Test
121+
@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.P, maxSdkVersion = android.os.Build.VERSION_CODES.P)
122+
fun whenAppCreatedAndApiIs28ThenJournalModeChangedToDeleteNotCalled() = coroutineRule.runBlocking {
123+
webViewHttpAuthStore.onAppCreated()
124+
verify(mockDatabaseCleaner, never()).changeJournalModeToDelete(databaseLocator.getDatabasePath())
125+
}
92126
}

app/src/androidTest/java/com/duckduckgo/app/di/StubAppConfigurationDownloadModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@
1717
package com.duckduckgo.app.di
1818

1919
import com.duckduckgo.app.job.ConfigurationDownloader
20+
import com.duckduckgo.di.scopes.AppObjectGraph
21+
import com.squareup.anvil.annotations.ContributesTo
2022
import dagger.Module
2123
import dagger.Provides
2224
import io.reactivex.Completable
2325

2426
@Module
27+
@ContributesTo(
28+
scope = AppObjectGraph::class,
29+
replaces = [AppConfigurationDownloaderModule::class]
30+
)
2531
class StubAppConfigurationDownloadModule {
2632

2733
@Provides

app/src/androidTest/java/com/duckduckgo/app/di/StubDatabaseModule.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,23 @@ package com.duckduckgo.app.di
1919
import android.content.Context
2020
import android.webkit.WebViewDatabase
2121
import androidx.room.Room
22+
import com.duckduckgo.app.CoroutineTestRule
2223
import com.duckduckgo.app.browser.httpauth.RealWebViewHttpAuthStore
2324
import com.duckduckgo.app.browser.httpauth.WebViewHttpAuthStore
25+
import com.duckduckgo.app.fire.DatabaseCleanerHelper
26+
import com.duckduckgo.app.fire.AuthDatabaseLocator
2427
import com.duckduckgo.app.global.db.AppDatabase
28+
import com.duckduckgo.di.scopes.AppObjectGraph
29+
import com.squareup.anvil.annotations.ContributesTo
2530
import dagger.Module
2631
import dagger.Provides
2732
import javax.inject.Singleton
2833

2934
@Module(includes = [DaoModule::class])
35+
@ContributesTo(
36+
scope = AppObjectGraph::class,
37+
replaces = [DatabaseModule::class]
38+
)
3039
class StubDatabaseModule {
3140

3241
@Provides
@@ -40,8 +49,8 @@ class StubDatabaseModule {
4049
@Provides
4150
@Singleton
4251
fun provideWebViewHttpAuthStore(
43-
context: Context,
52+
context: Context
4453
): WebViewHttpAuthStore {
45-
return RealWebViewHttpAuthStore(WebViewDatabase.getInstance(context))
54+
return RealWebViewHttpAuthStore(WebViewDatabase.getInstance(context), DatabaseCleanerHelper(), AuthDatabaseLocator(context), CoroutineTestRule().testDispatcherProvider)
4655
}
4756
}

app/src/androidTest/java/com/duckduckgo/app/di/StubJobSchedulerModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,17 @@ import com.duckduckgo.app.job.AndroidWorkScheduler
2525
import com.duckduckgo.app.job.JobCleaner
2626
import com.duckduckgo.app.job.WorkScheduler
2727
import com.duckduckgo.app.notification.AndroidNotificationScheduler
28+
import com.duckduckgo.di.scopes.AppObjectGraph
29+
import com.squareup.anvil.annotations.ContributesTo
2830
import dagger.Module
2931
import dagger.Provides
3032
import javax.inject.Singleton
3133

3234
@Module
35+
@ContributesTo(
36+
scope = AppObjectGraph::class,
37+
replaces = [JobsModule::class]
38+
)
3339
class StubJobSchedulerModule {
3440

3541
@Singleton

app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,26 @@ package com.duckduckgo.app.di
1919
import android.content.Context
2020
import com.duckduckgo.app.global.device.ContextDeviceInfo
2121
import com.duckduckgo.app.global.device.DeviceInfo
22-
import com.duckduckgo.app.referral.AppInstallationReferrerStateListener
2322
import com.duckduckgo.app.statistics.AtbInitializer
23+
import com.duckduckgo.app.statistics.AtbInitializerListener
2424
import com.duckduckgo.app.statistics.api.PixelSender
2525
import com.duckduckgo.app.statistics.api.StatisticsService
2626
import com.duckduckgo.app.statistics.api.StatisticsUpdater
2727
import com.duckduckgo.app.statistics.pixels.Pixel
2828
import com.duckduckgo.app.statistics.store.StatisticsDataStore
29+
import com.duckduckgo.di.scopes.AppObjectGraph
30+
import com.squareup.anvil.annotations.ContributesTo
2931
import dagger.Module
3032
import dagger.Provides
3133
import io.reactivex.Completable
3234
import retrofit2.Retrofit
3335
import javax.inject.Singleton
3436

3537
@Module
38+
@ContributesTo(
39+
scope = AppObjectGraph::class,
40+
replaces = [StatisticsModule::class]
41+
)
3642
class StubStatisticsModule {
3743

3844
@Provides
@@ -84,9 +90,9 @@ class StubStatisticsModule {
8490
fun atbInitializer(
8591
statisticsDataStore: StatisticsDataStore,
8692
statisticsUpdater: StatisticsUpdater,
87-
appReferrerStateListener: AppInstallationReferrerStateListener
93+
listeners: Set<@JvmSuppressWildcards AtbInitializerListener>
8894
): AtbInitializer {
89-
return AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener)
95+
return AtbInitializer(statisticsDataStore, statisticsUpdater, listeners)
9096
}
9197

9298
@Provides

0 commit comments

Comments
 (0)