From edb8f62c81aba7fa269cc3a0edd9e8c6178e5e83 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 10:45:26 +0000 Subject: [PATCH 01/14] Moved statistics package to its own module --- app/build.gradle | 2 + settings.gradle | 1 + statistics/.gitignore | 1 + statistics/build.gradle | 86 +++++++++++++++++++ statistics/consumer-rules.pro | 0 statistics/proguard-rules.pro | 21 +++++ statistics/src/main/AndroidManifest.xml | 21 +++++ .../app/statistics/AtbInitializer.kt | 0 .../app/statistics/VariantManager.kt | 0 .../app/statistics/WeightedRandomizer.kt | 0 .../statistics/api/OfflinePixelScheduler.kt | 0 .../app/statistics/api/OfflinePixelSender.kt | 0 .../app/statistics/api/PixelSender.kt | 0 .../app/statistics/api/PixelService.kt | 0 .../app/statistics/api/StatisticsRequester.kt | 0 .../app/statistics/api/StatisticsService.kt | 0 .../duckduckgo/app/statistics/model/Atb.kt | 0 .../app/statistics/model/PixelEntity.kt | 0 .../app/statistics/pixels/ExceptionPixel.kt | 0 .../duckduckgo/app/statistics/pixels/Pixel.kt | 0 .../store/OfflinePixelCountDataStore.kt | 0 .../app/statistics/store/PendingPixelDao.kt | 0 .../statistics/store/StatisticsDataStore.kt | 0 .../store/StatisticsSharedPreferences.kt | 0 versions.properties | 2 +- 25 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 statistics/.gitignore create mode 100644 statistics/build.gradle create mode 100644 statistics/consumer-rules.pro create mode 100644 statistics/proguard-rules.pro create mode 100644 statistics/src/main/AndroidManifest.xml rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/WeightedRandomizer.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelSender.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/PixelSender.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/StatisticsRequester.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/model/Atb.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/pixels/ExceptionPixel.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/store/OfflinePixelCountDataStore.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/store/PendingPixelDao.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/store/StatisticsDataStore.kt (100%) rename {app => statistics}/src/main/java/com/duckduckgo/app/statistics/store/StatisticsSharedPreferences.kt (100%) diff --git a/app/build.gradle b/app/build.gradle index 94a012305303..6825f53e7dda 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,6 +96,8 @@ android { } dependencies { + implementation project(path: ':statistics') + implementation AndroidX.legacy.supportV4 debugImplementation Square.leakCanary.android diff --git a/settings.gradle b/settings.gradle index 3d174542ef5d..398468ea92f3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,4 @@ buildscript { RefreshVersionsSetup.bootstrap(settings) include ':app' +include ':statistics' diff --git a/statistics/.gitignore b/statistics/.gitignore new file mode 100644 index 000000000000..42afabfd2abe --- /dev/null +++ b/statistics/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/statistics/build.gradle b/statistics/build.gradle new file mode 100644 index 000000000000..803ba1d2f7d6 --- /dev/null +++ b/statistics/build.gradle @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-kapt' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation Kotlin.stdlib.jdk7 + implementation KotlinX.coroutines.core + implementation KotlinX.coroutines.android + + implementation "io.reactivex.rxjava2:rxjava:_" + implementation "io.reactivex.rxjava2:rxandroid:_" + + implementation Square.retrofit2.retrofit + implementation Square.retrofit2.converter.moshi + implementation Square.retrofit2.adapter.rxJava2 + implementation Square.retrofit2.converter.scalars + + // Room + implementation AndroidX.room.runtime + implementation AndroidX.room.rxJava2 + kapt AndroidX.room.compiler + testImplementation AndroidX.room.testing + androidTestImplementation AndroidX.room.testing + + // WorkManager + implementation AndroidX.work.runtimeKtx + androidTestImplementation AndroidX.work.testing + implementation AndroidX.work.rxJava2 + + implementation JakeWharton.timber + + implementation AndroidX.core.ktx + + // Play Store referrer library + implementation("com.android.installreferrer:installreferrer:_") + + testImplementation 'junit:junit:4.+' +} \ No newline at end of file diff --git a/statistics/consumer-rules.pro b/statistics/consumer-rules.pro new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/statistics/proguard-rules.pro b/statistics/proguard-rules.pro new file mode 100644 index 000000000000..481bb4348141 --- /dev/null +++ b/statistics/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/statistics/src/main/AndroidManifest.xml b/statistics/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..836aa5773a18 --- /dev/null +++ b/statistics/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/WeightedRandomizer.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/WeightedRandomizer.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/WeightedRandomizer.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/WeightedRandomizer.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelSender.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelSender.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelSender.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelSender.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/PixelSender.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelSender.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/PixelSender.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelSender.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/StatisticsRequester.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsRequester.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/StatisticsRequester.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsRequester.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/model/Atb.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/model/Atb.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/model/Atb.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/model/Atb.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/pixels/ExceptionPixel.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/pixels/ExceptionPixel.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/pixels/ExceptionPixel.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/pixels/ExceptionPixel.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/pixels/Pixel.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/store/OfflinePixelCountDataStore.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/store/OfflinePixelCountDataStore.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/store/OfflinePixelCountDataStore.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/store/OfflinePixelCountDataStore.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/store/PendingPixelDao.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/store/PendingPixelDao.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/store/PendingPixelDao.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/store/PendingPixelDao.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/store/StatisticsDataStore.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/store/StatisticsDataStore.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/store/StatisticsDataStore.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/store/StatisticsDataStore.kt diff --git a/app/src/main/java/com/duckduckgo/app/statistics/store/StatisticsSharedPreferences.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/store/StatisticsSharedPreferences.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/statistics/store/StatisticsSharedPreferences.kt rename to statistics/src/main/java/com/duckduckgo/app/statistics/store/StatisticsSharedPreferences.kt diff --git a/versions.properties b/versions.properties index 5406f4d1d2af..19e0bb34d168 100644 --- a/versions.properties +++ b/versions.properties @@ -29,7 +29,7 @@ version.com.nhaarman.mockitokotlin2..mockito-kotlin=2.1.0 version.google.android.material=1.2.1 version.google.dagger=2.27 version.io.reactivex.rxjava2..rxandroid=2.0.2 -version.io.reactivex.rxjava2..rxjava=2.1.10 +version.io.reactivex.rxjava2..rxjava=2.2.9 version.kotlin=1.4.10 version.kotlinx.coroutines=1.3.5 version.leakcanary=2.5 From 834452f07df1eb39ae2184ca2245067908c21df7 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 10:57:04 +0000 Subject: [PATCH 02/14] Added dagger as implementation to use Inject annotations --- statistics/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/statistics/build.gradle b/statistics/build.gradle index 803ba1d2f7d6..3351d1a5564d 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -63,6 +63,8 @@ dependencies { implementation Square.retrofit2.adapter.rxJava2 implementation Square.retrofit2.converter.scalars + implementation Google.dagger + // Room implementation AndroidX.room.runtime implementation AndroidX.room.rxJava2 From 2b703f86daff2c9dd0869d35a979600b72534195 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 11:24:34 +0000 Subject: [PATCH 03/14] Added common gradle module and moved WorkerInjectorPlugin to it --- app/build.gradle | 1 + common/.gitignore | 1 + common/build.gradle | 63 +++++++++++++++++++ common/consumer-rules.pro | 0 common/proguard-rules.pro | 21 +++++++ common/src/main/AndroidManifest.xml | 21 +++++++ .../app/global/plugins/PluginPoint.kt | 0 .../plugins/worker/WorkerInjectorPlugin.kt | 0 settings.gradle | 1 + statistics/build.gradle | 1 + 10 files changed, 109 insertions(+) create mode 100644 common/.gitignore create mode 100644 common/build.gradle create mode 100644 common/consumer-rules.pro create mode 100644 common/proguard-rules.pro create mode 100644 common/src/main/AndroidManifest.xml rename {app => common}/src/main/java/com/duckduckgo/app/global/plugins/PluginPoint.kt (100%) rename {app => common}/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerInjectorPlugin.kt (100%) diff --git a/app/build.gradle b/app/build.gradle index 6825f53e7dda..c8f8672535d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,7 @@ android { dependencies { implementation project(path: ':statistics') + implementation project(path: ':common') implementation AndroidX.legacy.supportV4 debugImplementation Square.leakCanary.android diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 000000000000..42afabfd2abe --- /dev/null +++ b/common/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 000000000000..fa081d03a4ac --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation Kotlin.stdlib.jdk7 + implementation KotlinX.coroutines.core + implementation KotlinX.coroutines.android + + implementation AndroidX.work.runtimeKtx + + implementation Google.dagger + + implementation JakeWharton.timber + + testImplementation 'junit:junit:4.+' +} \ No newline at end of file diff --git a/common/consumer-rules.pro b/common/consumer-rules.pro new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/common/proguard-rules.pro b/common/proguard-rules.pro new file mode 100644 index 000000000000..481bb4348141 --- /dev/null +++ b/common/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..bfc9cdaf83c7 --- /dev/null +++ b/common/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/global/plugins/PluginPoint.kt b/common/src/main/java/com/duckduckgo/app/global/plugins/PluginPoint.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/plugins/PluginPoint.kt rename to common/src/main/java/com/duckduckgo/app/global/plugins/PluginPoint.kt diff --git a/app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerInjectorPlugin.kt b/common/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerInjectorPlugin.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerInjectorPlugin.kt rename to common/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerInjectorPlugin.kt diff --git a/settings.gradle b/settings.gradle index 398468ea92f3..f3b9f4b2e302 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,3 +9,4 @@ RefreshVersionsSetup.bootstrap(settings) include ':app' include ':statistics' +include ':common' diff --git a/statistics/build.gradle b/statistics/build.gradle index 3351d1a5564d..13b23ae49119 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -50,6 +50,7 @@ android { } dependencies { + implementation project(path: ':common') implementation Kotlin.stdlib.jdk7 implementation KotlinX.coroutines.core From 94b84412ee6d3f82bed12b26bb66ffa023db3daf Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 21:09:20 +0000 Subject: [PATCH 04/14] Moved AppUrl to common module and fix pixel service and entity --- .../src/main/java/com/duckduckgo/app/global/AppUrl.kt | 0 .../java/com/duckduckgo/app/statistics/api/PixelService.kt | 2 +- .../com/duckduckgo/app/statistics/api/StatisticsService.kt | 2 +- .../java/com/duckduckgo/app/statistics/model/PixelEntity.kt | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) rename {app => common}/src/main/java/com/duckduckgo/app/global/AppUrl.kt (100%) diff --git a/app/src/main/java/com/duckduckgo/app/global/AppUrl.kt b/common/src/main/java/com/duckduckgo/app/global/AppUrl.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/AppUrl.kt rename to common/src/main/java/com/duckduckgo/app/global/AppUrl.kt diff --git a/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt index fa439e37f269..b1c348121235 100644 --- a/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt +++ b/statistics/src/main/java/com/duckduckgo/app/statistics/api/PixelService.kt @@ -16,8 +16,8 @@ package com.duckduckgo.app.statistics.api -import com.duckduckgo.app.browser.BuildConfig import com.duckduckgo.app.global.AppUrl +import com.duckduckgo.app.global.BuildConfig import io.reactivex.Completable import retrofit2.http.GET import retrofit2.http.Path diff --git a/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt index 8103c4d1b9ff..4a834cda782f 100644 --- a/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt +++ b/statistics/src/main/java/com/duckduckgo/app/statistics/api/StatisticsService.kt @@ -16,8 +16,8 @@ package com.duckduckgo.app.statistics.api -import com.duckduckgo.app.browser.BuildConfig import com.duckduckgo.app.global.AppUrl.ParamKey +import com.duckduckgo.app.statistics.BuildConfig import com.duckduckgo.app.statistics.model.Atb import io.reactivex.Observable import okhttp3.ResponseBody diff --git a/statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt index 2be0361c7ee0..b7109bd30984 100644 --- a/statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt +++ b/statistics/src/main/java/com/duckduckgo/app/statistics/model/PixelEntity.kt @@ -19,8 +19,8 @@ package com.duckduckgo.app.statistics.model import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.TypeConverter -import com.duckduckgo.app.di.JsonModule import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi import com.squareup.moshi.Types @Entity(tableName = "pixel_store") @@ -46,7 +46,7 @@ class QueryParamsTypeConverter { class Adapters { companion object { - private val moshi = JsonModule().moshi() + private val moshi = Moshi.Builder().build() private val mapStringStringType = Types.newParameterizedType(Map::class.java, String::class.java, String::class.java) val queryParamsAdapter: JsonAdapter> = moshi.adapter(mapStringStringType) } From ff43cc451158613fb34bd0fed31cdcbd48c180c7 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 11:42:49 +0000 Subject: [PATCH 05/14] Moved Device.kt to common module and fix VERSION_NAME access --- .../java/com/duckduckgo/app/global/device/Device.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) rename {app => common}/src/main/java/com/duckduckgo/app/global/device/Device.kt (86%) diff --git a/app/src/main/java/com/duckduckgo/app/global/device/Device.kt b/common/src/main/java/com/duckduckgo/app/global/device/Device.kt similarity index 86% rename from app/src/main/java/com/duckduckgo/app/global/device/Device.kt rename to common/src/main/java/com/duckduckgo/app/global/device/Device.kt index 5e6684982d28..de00cf0f0bd5 100644 --- a/app/src/main/java/com/duckduckgo/app/global/device/Device.kt +++ b/common/src/main/java/com/duckduckgo/app/global/device/Device.kt @@ -19,9 +19,7 @@ package com.duckduckgo.app.global.device import android.content.Context import android.telephony.TelephonyManager import android.util.TypedValue -import com.duckduckgo.app.browser.BuildConfig import java.util.* -import javax.inject.Inject interface DeviceInfo { @@ -41,11 +39,16 @@ interface DeviceInfo { fun formFactor(): FormFactor } -class ContextDeviceInfo @Inject constructor(private val context: Context) : DeviceInfo { +class ContextDeviceInfo(private val context: Context) : DeviceInfo { - override val appVersion = BuildConfig.VERSION_NAME + override val appVersion by lazy { + val info = context.packageManager.getPackageInfo(context.packageName, 0) + info.versionName.orEmpty() + } - override val majorAppVersion = appVersion.split(".").first() + override val majorAppVersion by lazy { + appVersion.split(".").first() + } override val language: String by lazy { Locale.getDefault().language From 4ad8b0ed462b5bfb0e5f7417138f5f9c3ab24045 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 20:52:29 +0000 Subject: [PATCH 06/14] Moved exception package to common module --- common/build.gradle | 8 ++++++++ .../duckduckgo/app/global/exception/ExceptionExtension.kt | 0 .../app/global/exception/RootExceptionFinder.kt | 0 .../app/global/exception/UncaughtExceptionDao.kt | 0 .../app/global/exception/UncaughtExceptionEntity.kt | 0 .../app/global/exception/UncaughtExceptionRepository.kt | 0 6 files changed, 8 insertions(+) rename {app => common}/src/main/java/com/duckduckgo/app/global/exception/ExceptionExtension.kt (100%) rename {app => common}/src/main/java/com/duckduckgo/app/global/exception/RootExceptionFinder.kt (100%) rename {app => common}/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionDao.kt (100%) rename {app => common}/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt (100%) rename {app => common}/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt (100%) diff --git a/common/build.gradle b/common/build.gradle index fa081d03a4ac..f0413e87a6ba 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -17,6 +17,7 @@ plugins { id 'com.android.library' id 'kotlin-android' + id 'kotlin-kapt' } android { @@ -59,5 +60,12 @@ dependencies { implementation JakeWharton.timber + // Room + implementation AndroidX.room.runtime + implementation AndroidX.room.rxJava2 + kapt AndroidX.room.compiler + testImplementation AndroidX.room.testing + androidTestImplementation AndroidX.room.testing + testImplementation 'junit:junit:4.+' } \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/ExceptionExtension.kt b/common/src/main/java/com/duckduckgo/app/global/exception/ExceptionExtension.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/exception/ExceptionExtension.kt rename to common/src/main/java/com/duckduckgo/app/global/exception/ExceptionExtension.kt diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/RootExceptionFinder.kt b/common/src/main/java/com/duckduckgo/app/global/exception/RootExceptionFinder.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/exception/RootExceptionFinder.kt rename to common/src/main/java/com/duckduckgo/app/global/exception/RootExceptionFinder.kt diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionDao.kt b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionDao.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionDao.kt rename to common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionDao.kt diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt rename to common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt similarity index 100% rename from app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt rename to common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt From 718a96a0c91cd515fd628915abdc907592238434 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 20:58:17 +0000 Subject: [PATCH 07/14] Removed default Build.VERSION_NAME from UncaughtExceptionEntity --- .../app/global/exception/UncaughtExceptionModule.kt | 6 ++++-- .../app/global/exception/UncaughtExceptionEntity.kt | 5 ++--- .../app/global/exception/UncaughtExceptionRepository.kt | 9 +++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionModule.kt b/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionModule.kt index 459adeedf991..01ba134b1900 100644 --- a/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionModule.kt +++ b/app/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionModule.kt @@ -18,6 +18,7 @@ package com.duckduckgo.app.global.exception import com.duckduckgo.app.global.AlertingUncaughtExceptionHandler import com.duckduckgo.app.global.DispatcherProvider +import com.duckduckgo.app.global.device.DeviceInfo import com.duckduckgo.app.statistics.store.OfflinePixelCountDataStore import dagger.Module import dagger.Provides @@ -30,9 +31,10 @@ class UncaughtExceptionModule { @Singleton fun uncaughtWebViewExceptionRepository( uncaughtExceptionDao: UncaughtExceptionDao, - rootExceptionFinder: RootExceptionFinder + rootExceptionFinder: RootExceptionFinder, + deviceInfo: DeviceInfo ): UncaughtExceptionRepository { - return UncaughtExceptionRepositoryDb(uncaughtExceptionDao, rootExceptionFinder) + return UncaughtExceptionRepositoryDb(uncaughtExceptionDao, rootExceptionFinder, deviceInfo) } @Provides diff --git a/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt index 74cfad88881d..e6dd98377d5e 100644 --- a/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt +++ b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionEntity.kt @@ -18,7 +18,6 @@ package com.duckduckgo.app.global.exception import androidx.room.Entity import androidx.room.PrimaryKey -import com.duckduckgo.app.browser.BuildConfig import java.text.SimpleDateFormat import java.util.* @@ -27,8 +26,8 @@ data class UncaughtExceptionEntity( @PrimaryKey(autoGenerate = true) val id: Long = 0, val exceptionSource: UncaughtExceptionSource, val message: String, - val timestamp: Long = System.currentTimeMillis(), - val version: String = BuildConfig.VERSION_NAME + val version: String, + val timestamp: Long = System.currentTimeMillis() ) { fun formattedTimestamp(): String = formatter.format(Date(timestamp)) diff --git a/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt index 28d3af2c4a6e..1de88b50e74a 100644 --- a/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt +++ b/common/src/main/java/com/duckduckgo/app/global/exception/UncaughtExceptionRepository.kt @@ -16,6 +16,7 @@ package com.duckduckgo.app.global.exception +import com.duckduckgo.app.global.device.DeviceInfo import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber @@ -28,7 +29,8 @@ interface UncaughtExceptionRepository { class UncaughtExceptionRepositoryDb( private val uncaughtExceptionDao: UncaughtExceptionDao, - private val rootExceptionFinder: RootExceptionFinder + private val rootExceptionFinder: RootExceptionFinder, + private val deviceInfo: DeviceInfo ) : UncaughtExceptionRepository { private var lastSeenException: Throwable? = null @@ -42,7 +44,10 @@ class UncaughtExceptionRepositoryDb( Timber.e(e, "Uncaught exception - $exceptionSource") val rootCause = rootExceptionFinder.findRootException(e) - val exceptionEntity = UncaughtExceptionEntity(message = rootCause.extractExceptionCause(), exceptionSource = exceptionSource) + val exceptionEntity = UncaughtExceptionEntity( + message = rootCause.extractExceptionCause(), + exceptionSource = exceptionSource, + version = deviceInfo.appVersion) uncaughtExceptionDao.add(exceptionEntity) lastSeenException = e From dd1409df18808f23e87b1e795beacfa1cd4c4e38 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Sat, 13 Feb 2021 22:09:24 +0000 Subject: [PATCH 08/14] Fixed the AppInstallationReferrerStateListener<>AtbInitializer dependency --- app/build.gradle | 3 -- .../app/statistics/AtbInitializerTest.kt | 8 ++--- .../app/di/PlayStoreReferralModule.kt | 20 ++++++------- .../com/duckduckgo/app/di/StatisticsModule.kt | 6 ++-- .../app/global/DuckDuckGoApplication.kt | 2 +- .../AppInstallationReferrerStateListener.kt | 12 +++++++- statistics/build.gradle | 3 ++ .../app/statistics/AtbInitializer.kt | 30 ++++++++++++++----- 8 files changed, 54 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c8f8672535d4..cd3a62afa7ea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -177,9 +177,6 @@ dependencies { // Lottie implementation "com.airbnb.android:lottie:_" - // Apache commons - implementation "org.apache.commons:commons-math3:_" - // Play Store referrer library implementation("com.android.installreferrer:installreferrer:_") diff --git a/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt b/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt index 188a7cd3f3dc..b400f054c809 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt @@ -42,7 +42,7 @@ class AtbInitializerTest { appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx") testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) - testee.initializeAfterReferrerAvailable() + testee.initialize() verify(statisticsUpdater).initializeAtb() } @@ -53,7 +53,7 @@ class AtbInitializerTest { appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx", mockDelayMs = 1000L) testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) - testee.initializeAfterReferrerAvailable() + testee.initialize() verify(statisticsUpdater).initializeAtb() } @@ -64,7 +64,7 @@ class AtbInitializerTest { appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx", mockDelayMs = Long.MAX_VALUE) testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) - testee.initializeAfterReferrerAvailable() + testee.initialize() verify(statisticsUpdater).initializeAtb() } @@ -74,7 +74,7 @@ class AtbInitializerTest { configureAlreadyInitialized() testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) - testee.initializeAfterReferrerAvailable() + testee.initialize() verify(statisticsUpdater).refreshAppRetentionAtb() } diff --git a/app/src/main/java/com/duckduckgo/app/di/PlayStoreReferralModule.kt b/app/src/main/java/com/duckduckgo/app/di/PlayStoreReferralModule.kt index c9f3ad6cf340..4002939d9f0f 100644 --- a/app/src/main/java/com/duckduckgo/app/di/PlayStoreReferralModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/PlayStoreReferralModule.kt @@ -17,11 +17,11 @@ package com.duckduckgo.app.di import android.content.Context -import android.content.pm.PackageManager import com.duckduckgo.app.referral.* -import com.duckduckgo.app.statistics.VariantManager +import com.duckduckgo.app.statistics.AtbInitializerListener import dagger.Module import dagger.Provides +import dagger.multibindings.IntoSet import javax.inject.Singleton @Module @@ -35,14 +35,14 @@ class PlayStoreReferralModule { @Provides @Singleton fun appInstallationReferrerStateListener( - context: Context, - packageManager: PackageManager, - appInstallationReferrerParser: AppInstallationReferrerParser, - appReferrerDataStore: AppReferrerDataStore, - variantManager: VariantManager - ): AppInstallationReferrerStateListener { - return PlayStoreAppReferrerStateListener(context, packageManager, appInstallationReferrerParser, appReferrerDataStore, variantManager) - } + playStoreAppReferrerStateListener: PlayStoreAppReferrerStateListener + ): AppInstallationReferrerStateListener = playStoreAppReferrerStateListener + + @Provides + @IntoSet + fun providedReferrerAtbInitializerListener( + playStoreAppReferrerStateListener: PlayStoreAppReferrerStateListener + ): AtbInitializerListener = playStoreAppReferrerStateListener @Provides @Singleton diff --git a/app/src/main/java/com/duckduckgo/app/di/StatisticsModule.kt b/app/src/main/java/com/duckduckgo/app/di/StatisticsModule.kt index f11a6e0825dc..59b97725d86b 100644 --- a/app/src/main/java/com/duckduckgo/app/di/StatisticsModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/StatisticsModule.kt @@ -21,8 +21,8 @@ import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.device.ContextDeviceInfo import com.duckduckgo.app.global.device.DeviceInfo import com.duckduckgo.app.global.exception.UncaughtExceptionRepository -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.statistics.AtbInitializer +import com.duckduckgo.app.statistics.AtbInitializerListener import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.api.* import com.duckduckgo.app.statistics.pixels.RxBasedPixel @@ -86,9 +86,9 @@ class StatisticsModule { fun atbInitializer( statisticsDataStore: StatisticsDataStore, statisticsUpdater: StatisticsUpdater, - appReferrerStateListener: AppInstallationReferrerStateListener + listeners: Set<@JvmSuppressWildcards AtbInitializerListener> ): AtbInitializer { - return AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + return AtbInitializer(statisticsDataStore, statisticsUpdater, listeners) } @Singleton diff --git a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt index 21444cc81a98..a4a2ef94ef7b 100644 --- a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt @@ -329,7 +329,7 @@ open class DuckDuckGoApplication : HasAndroidInjector, Application(), LifecycleO notificationRegistrar.updateStatus() GlobalScope.launch { workScheduler.scheduleWork() - atbInitializer.initializeAfterReferrerAvailable() + atbInitializer.initialize() } } diff --git a/app/src/main/java/com/duckduckgo/app/referral/AppInstallationReferrerStateListener.kt b/app/src/main/java/com/duckduckgo/app/referral/AppInstallationReferrerStateListener.kt index 7f16c0cfb6d6..9603b26025a6 100644 --- a/app/src/main/java/com/duckduckgo/app/referral/AppInstallationReferrerStateListener.kt +++ b/app/src/main/java/com/duckduckgo/app/referral/AppInstallationReferrerStateListener.kt @@ -25,12 +25,15 @@ import com.android.installreferrer.api.InstallReferrerClient.InstallReferrerResp import com.android.installreferrer.api.InstallReferrerStateListener import com.duckduckgo.app.playstore.PlayStoreAndroidUtils.Companion.PLAY_STORE_PACKAGE import com.duckduckgo.app.playstore.PlayStoreAndroidUtils.Companion.PLAY_STORE_REFERRAL_SERVICE +import com.duckduckgo.app.referral.AppInstallationReferrerStateListener.Companion.MAX_REFERRER_WAIT_TIME_MS import com.duckduckgo.app.referral.ParseFailureReason.* import com.duckduckgo.app.referral.ParsedReferrerResult.* +import com.duckduckgo.app.statistics.AtbInitializerListener import com.duckduckgo.app.statistics.VariantManager import kotlinx.coroutines.delay import timber.log.Timber import javax.inject.Inject +import javax.inject.Singleton interface AppInstallationReferrerStateListener { @@ -43,13 +46,14 @@ interface AppInstallationReferrerStateListener { } +@Singleton class PlayStoreAppReferrerStateListener @Inject constructor( val context: Context, private val packageManager: PackageManager, private val appInstallationReferrerParser: AppInstallationReferrerParser, private val appReferrerDataStore: AppReferrerDataStore, private val variantManager: VariantManager -) : InstallReferrerStateListener, AppInstallationReferrerStateListener { +) : InstallReferrerStateListener, AppInstallationReferrerStateListener, AtbInitializerListener { private val referralClient = InstallReferrerClient.newBuilder(context).build() private var initialisationStartTime: Long = 0 @@ -182,4 +186,10 @@ class PlayStoreAppReferrerStateListener @Inject constructor( override fun onInstallReferrerServiceDisconnected() { Timber.i("Referrer: ServiceDisconnected") } + + override suspend fun beforeAtbInit() { + waitForReferrerCode() + } + + override fun beforeAtbInitTimeoutMillis(): Long = MAX_REFERRER_WAIT_TIME_MS } diff --git a/statistics/build.gradle b/statistics/build.gradle index 13b23ae49119..01f1dbeb1a33 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -82,6 +82,9 @@ dependencies { implementation AndroidX.core.ktx + // Apache commons + implementation "org.apache.commons:commons-math3:_" + // Play Store referrer library implementation("com.android.installreferrer:installreferrer:_") diff --git a/statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt index 1124cba974b8..4bbaa15cef12 100644 --- a/statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt +++ b/statistics/src/main/java/com/duckduckgo/app/statistics/AtbInitializer.kt @@ -16,27 +16,41 @@ package com.duckduckgo.app.statistics -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener.Companion.MAX_REFERRER_WAIT_TIME_MS import com.duckduckgo.app.statistics.api.StatisticsUpdater import com.duckduckgo.app.statistics.store.StatisticsDataStore import kotlinx.coroutines.withTimeoutOrNull +interface AtbInitializerListener { + + /** + * This method will be called before initializing the ATB + */ + suspend fun beforeAtbInit() + + /** + * @return the timeout in milliseconds after which [beforeAtbInit] + * will be stopped + */ + fun beforeAtbInitTimeoutMillis(): Long +} + class AtbInitializer( private val statisticsDataStore: StatisticsDataStore, private val statisticsUpdater: StatisticsUpdater, - private val appReferrerStateListener: AppInstallationReferrerStateListener + private val listeners: Set ) { - suspend fun initializeAfterReferrerAvailable() { - withTimeoutOrNull(MAX_REFERRER_WAIT_TIME_MS) { - appReferrerStateListener.waitForReferrerCode() + suspend fun initialize() { + listeners.forEach { + withTimeoutOrNull(it.beforeAtbInitTimeoutMillis()) { + it.beforeAtbInit() + } } - initialize() + initializeAtb() } - private fun initialize() { + private fun initializeAtb() { if (statisticsDataStore.hasInstallationStatistics) { statisticsUpdater.refreshAppRetentionAtb() } else { From 24016e72e33ea9243f5ebe13ad601872d33767f4 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Mon, 15 Feb 2021 21:17:23 +0000 Subject: [PATCH 09/14] Fixed tests --- .../1.json | 58 +++++++++++++++++++ .../duckduckgo/app/di/StubStatisticsModule.kt | 6 +- .../exception/UncaughtExceptionDaoTest.kt | 10 ++-- .../StubAppReferrerFoundStateListener.kt | 14 ++++- .../app/statistics/AtbInitializerTest.kt | 11 ++-- .../statistics/api/OfflinePixelSenderTest.kt | 2 +- .../app/statistics/api/RxPixelSenderTest.kt | 20 ++++++- 7 files changed, 102 insertions(+), 19 deletions(-) create mode 100644 app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json diff --git a/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json b/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json new file mode 100644 index 000000000000..da408abd9a6c --- /dev/null +++ b/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json @@ -0,0 +1,58 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "a44eac9c2f80556efd776f2147007cf3", + "entities": [ + { + "tableName": "pixel_store", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `pixelName` TEXT NOT NULL, `atb` TEXT NOT NULL, `additionalQueryParams` TEXT NOT NULL, `encodedQueryParams` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pixelName", + "columnName": "pixelName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "atb", + "columnName": "atb", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "additionalQueryParams", + "columnName": "additionalQueryParams", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "encodedQueryParams", + "columnName": "encodedQueryParams", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a44eac9c2f80556efd776f2147007cf3')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt b/app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt index 2253d2d24bd4..79d9af5bc4b7 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt @@ -19,8 +19,8 @@ package com.duckduckgo.app.di import android.content.Context import com.duckduckgo.app.global.device.ContextDeviceInfo import com.duckduckgo.app.global.device.DeviceInfo -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.statistics.AtbInitializer +import com.duckduckgo.app.statistics.AtbInitializerListener import com.duckduckgo.app.statistics.api.PixelSender import com.duckduckgo.app.statistics.api.StatisticsService import com.duckduckgo.app.statistics.api.StatisticsUpdater @@ -84,9 +84,9 @@ class StubStatisticsModule { fun atbInitializer( statisticsDataStore: StatisticsDataStore, statisticsUpdater: StatisticsUpdater, - appReferrerStateListener: AppInstallationReferrerStateListener + listeners: Set<@JvmSuppressWildcards AtbInitializerListener> ): AtbInitializer { - return AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + return AtbInitializer(statisticsDataStore, statisticsUpdater, listeners) } @Provides diff --git a/app/src/androidTest/java/com/duckduckgo/app/global/exception/UncaughtExceptionDaoTest.kt b/app/src/androidTest/java/com/duckduckgo/app/global/exception/UncaughtExceptionDaoTest.kt index c38e4ddb37e0..8420ad6e45c0 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/global/exception/UncaughtExceptionDaoTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/global/exception/UncaughtExceptionDaoTest.kt @@ -77,9 +77,9 @@ class UncaughtExceptionDaoTest { @Test fun whenSeveralExceptionExistAndOneDeletedThenCorrectEntryIsRemoved() { - val exception1 = UncaughtExceptionEntity(id = 1, exceptionSource = GLOBAL, message = "foo1") - val exception2 = UncaughtExceptionEntity(id = 2, exceptionSource = ON_PROGRESS_CHANGED, message = "foo2") - val exception3 = UncaughtExceptionEntity(id = 3, exceptionSource = ON_PAGE_STARTED, message = "foo3") + val exception1 = UncaughtExceptionEntity(id = 1, exceptionSource = GLOBAL, message = "foo1", "version") + val exception2 = UncaughtExceptionEntity(id = 2, exceptionSource = ON_PROGRESS_CHANGED, message = "foo2", "version") + val exception3 = UncaughtExceptionEntity(id = 3, exceptionSource = ON_PAGE_STARTED, message = "foo3", "version") dao.add(exception1) dao.add(exception2) dao.add(exception3) @@ -102,7 +102,7 @@ class UncaughtExceptionDaoTest { @Test fun whenExceptionRetrievedFromDatabaseThenAllDetailsRestored() { - val exception = UncaughtExceptionEntity(id = 1, exceptionSource = GLOBAL, message = "foo") + val exception = UncaughtExceptionEntity(id = 1, exceptionSource = GLOBAL, message = "foo", "version") dao.add(exception) val list = dao.all() assertEquals(1, list.size) @@ -116,5 +116,5 @@ class UncaughtExceptionDaoTest { } private fun anUncaughtExceptionEntity(id: Long? = null) = - UncaughtExceptionEntity(id = id ?: 0, exceptionSource = GLOBAL, message = "foo") + UncaughtExceptionEntity(id = id ?: 0, exceptionSource = GLOBAL, message = "foo", "version") } diff --git a/app/src/androidTest/java/com/duckduckgo/app/referral/StubAppReferrerFoundStateListener.kt b/app/src/androidTest/java/com/duckduckgo/app/referral/StubAppReferrerFoundStateListener.kt index dc7dc804e4ae..1e0cbe4debec 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/referral/StubAppReferrerFoundStateListener.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/referral/StubAppReferrerFoundStateListener.kt @@ -16,9 +16,13 @@ package com.duckduckgo.app.referral +import com.duckduckgo.app.statistics.AtbInitializerListener import kotlinx.coroutines.delay -class StubAppReferrerFoundStateListener(private val referrer: String, private val mockDelayMs: Long = 0) : AppInstallationReferrerStateListener { +class StubAppReferrerFoundStateListener( + private val referrer: String, + private val mockDelayMs: Long = 0 +) : AppInstallationReferrerStateListener, AtbInitializerListener { override suspend fun waitForReferrerCode(): ParsedReferrerResult { if (mockDelayMs > 0) delay(mockDelayMs) @@ -27,4 +31,12 @@ class StubAppReferrerFoundStateListener(private val referrer: String, private va override fun initialiseReferralRetrieval() { } + + override suspend fun beforeAtbInit() { + waitForReferrerCode() + } + + override fun beforeAtbInitTimeoutMillis(): Long { + return mockDelayMs + } } diff --git a/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt b/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt index b400f054c809..52783716bc72 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/statistics/AtbInitializerTest.kt @@ -16,7 +16,6 @@ package com.duckduckgo.app.statistics -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.referral.StubAppReferrerFoundStateListener import com.duckduckgo.app.statistics.api.StatisticsUpdater import com.duckduckgo.app.statistics.store.StatisticsDataStore @@ -34,13 +33,13 @@ class AtbInitializerTest { private val statisticsDataStore: StatisticsDataStore = mock() private val statisticsUpdater: StatisticsUpdater = mock() - private lateinit var appReferrerStateListener: AppInstallationReferrerStateListener + private lateinit var appReferrerStateListener: AtbInitializerListener @Test fun whenReferrerInformationInstantlyAvailableThenAtbInitialized() = runBlockingTest { whenever(statisticsDataStore.hasInstallationStatistics).thenReturn(false) appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx") - testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + testee = AtbInitializer(statisticsDataStore, statisticsUpdater, setOf(appReferrerStateListener)) testee.initialize() @@ -51,7 +50,7 @@ class AtbInitializerTest { fun whenReferrerInformationQuicklyAvailableThenAtbInitialized() = runBlockingTest { whenever(statisticsDataStore.hasInstallationStatistics).thenReturn(false) appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx", mockDelayMs = 1000L) - testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + testee = AtbInitializer(statisticsDataStore, statisticsUpdater, setOf(appReferrerStateListener)) testee.initialize() @@ -62,7 +61,7 @@ class AtbInitializerTest { fun whenReferrerInformationTimesOutThenAtbInitialized() = runBlockingTest { whenever(statisticsDataStore.hasInstallationStatistics).thenReturn(false) appReferrerStateListener = StubAppReferrerFoundStateListener(referrer = "xx", mockDelayMs = Long.MAX_VALUE) - testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + testee = AtbInitializer(statisticsDataStore, statisticsUpdater, setOf(appReferrerStateListener)) testee.initialize() @@ -72,7 +71,7 @@ class AtbInitializerTest { @Test fun whenAlreadyInitializedThenRefreshCalled() = runBlockingTest { configureAlreadyInitialized() - testee = AtbInitializer(statisticsDataStore, statisticsUpdater, appReferrerStateListener) + testee = AtbInitializer(statisticsDataStore, statisticsUpdater, setOf(appReferrerStateListener)) testee.initialize() verify(statisticsUpdater).refreshAppRetentionAtb() diff --git a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/OfflinePixelSenderTest.kt b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/OfflinePixelSenderTest.kt index 45466f1f7e11..4aaad5f918e2 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/OfflinePixelSenderTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/OfflinePixelSenderTest.kt @@ -52,7 +52,7 @@ class OfflinePixelSenderTest { @Before fun before() { - val exceptionEntity = UncaughtExceptionEntity(1, UncaughtExceptionSource.GLOBAL, "test", 1588167165000, "version") + val exceptionEntity = UncaughtExceptionEntity(1, UncaughtExceptionSource.GLOBAL, "test", "version", 1588167165000) runBlocking { whenever(mockPixel.sendPixel(any(), any(), any())).thenReturn(Completable.complete()) diff --git a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt index 5feadfe7325e..871101095387 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt @@ -17,15 +17,18 @@ package com.duckduckgo.app.statistics.api import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.room.Database import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverters import androidx.test.platform.app.InstrumentationRegistry import com.duckduckgo.app.InstantSchedulersRule -import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.device.DeviceInfo import com.duckduckgo.app.statistics.Variant import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.model.Atb import com.duckduckgo.app.statistics.model.PixelEntity +import com.duckduckgo.app.statistics.model.QueryParamsTypeConverter import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.PRIVACY_DASHBOARD_OPENED import com.duckduckgo.app.statistics.store.PendingPixelDao import com.duckduckgo.app.statistics.store.StatisticsDataStore @@ -40,6 +43,17 @@ import org.junit.Test import org.mockito.Mock import java.util.concurrent.TimeoutException +@Database( + entities = [PixelEntity::class], + version = 1 +) +@TypeConverters( + QueryParamsTypeConverter::class +) +abstract class TestDatabase : RoomDatabase() { + abstract fun pixelDao(): PendingPixelDao +} + class RxPixelSenderTest { @get:Rule @@ -62,13 +76,13 @@ class RxPixelSenderTest { @Mock val mockDeviceInfo: DeviceInfo = mock() - private lateinit var db: AppDatabase + private lateinit var db: TestDatabase private lateinit var pendingPixelDao: PendingPixelDao private lateinit var testee: RxPixelSender @Before fun before() { - db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, AppDatabase::class.java) + db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, TestDatabase::class.java) .allowMainThreadQueries() .build() pendingPixelDao = db.pixelDao() From 522542da950c40eb09d69e75b94ae1bc10ace213 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Tue, 16 Feb 2021 10:45:49 +0000 Subject: [PATCH 10/14] Added test runner to common and statistics manifest --- common/build.gradle | 2 ++ common/src/main/AndroidManifest.xml | 6 ++++++ statistics/build.gradle | 2 ++ statistics/src/main/AndroidManifest.xml | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/common/build.gradle b/common/build.gradle index f0413e87a6ba..f689605343b1 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -68,4 +68,6 @@ dependencies { androidTestImplementation AndroidX.room.testing testImplementation 'junit:junit:4.+' + androidTestImplementation AndroidX.test.runner + androidTestImplementation AndroidX.test.rules } \ No newline at end of file diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml index bfc9cdaf83c7..918e07788559 100644 --- a/common/src/main/AndroidManifest.xml +++ b/common/src/main/AndroidManifest.xml @@ -18,4 +18,10 @@ + + \ No newline at end of file diff --git a/statistics/build.gradle b/statistics/build.gradle index 01f1dbeb1a33..43ed06d8d51f 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -89,4 +89,6 @@ dependencies { implementation("com.android.installreferrer:installreferrer:_") testImplementation 'junit:junit:4.+' + androidTestImplementation AndroidX.test.runner + androidTestImplementation AndroidX.test.rules } \ No newline at end of file diff --git a/statistics/src/main/AndroidManifest.xml b/statistics/src/main/AndroidManifest.xml index 836aa5773a18..2057e8751c5e 100644 --- a/statistics/src/main/AndroidManifest.xml +++ b/statistics/src/main/AndroidManifest.xml @@ -17,5 +17,11 @@ + + \ No newline at end of file From 26709d01932ffbe7bf8c2b696894c1a07ebd746e Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Tue, 16 Feb 2021 11:23:27 +0000 Subject: [PATCH 11/14] Added dummy tests for CI --- .../duckduckgo/app/global/DummyTestForCI.kt | 28 +++++++++++++++++++ .../app/statistics/DummyTestForCI.kt | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 common/src/androidTest/java/com/duckduckgo/app/global/DummyTestForCI.kt create mode 100644 statistics/src/androidTest/java/com/duckduckgo/app/statistics/DummyTestForCI.kt diff --git a/common/src/androidTest/java/com/duckduckgo/app/global/DummyTestForCI.kt b/common/src/androidTest/java/com/duckduckgo/app/global/DummyTestForCI.kt new file mode 100644 index 000000000000..2ce75947b354 --- /dev/null +++ b/common/src/androidTest/java/com/duckduckgo/app/global/DummyTestForCI.kt @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.global + +import org.junit.Assert.assertTrue +import org.junit.Test + +class DummyTestForCI { + + @Test + fun dummyAlwaysPasses() { + assertTrue(true) + } +} \ No newline at end of file diff --git a/statistics/src/androidTest/java/com/duckduckgo/app/statistics/DummyTestForCI.kt b/statistics/src/androidTest/java/com/duckduckgo/app/statistics/DummyTestForCI.kt new file mode 100644 index 000000000000..5826ddbd18da --- /dev/null +++ b/statistics/src/androidTest/java/com/duckduckgo/app/statistics/DummyTestForCI.kt @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.statistics + +import org.junit.Assert.assertTrue +import org.junit.Test + +class DummyTestForCI { + + @Test + fun dummyAlwaysPasses() { + assertTrue(true) + } +} \ No newline at end of file From d38c6f9a75ae2c8785c5f807d87637aabb007770 Mon Sep 17 00:00:00 2001 From: David Gonzalez Date: Wed, 17 Feb 2021 10:34:46 +0100 Subject: [PATCH 12/14] added jUnit to refreshVersions --- common/build.gradle | 2 +- statistics/build.gradle | 2 +- versions.properties | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index f689605343b1..eb3c81b395e9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -67,7 +67,7 @@ dependencies { testImplementation AndroidX.room.testing androidTestImplementation AndroidX.room.testing - testImplementation 'junit:junit:4.+' + testImplementation Testing.junit4 androidTestImplementation AndroidX.test.runner androidTestImplementation AndroidX.test.rules } \ No newline at end of file diff --git a/statistics/build.gradle b/statistics/build.gradle index 43ed06d8d51f..753d4e9ba793 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -88,7 +88,7 @@ dependencies { // Play Store referrer library implementation("com.android.installreferrer:installreferrer:_") - testImplementation 'junit:junit:4.+' + testImplementation Testing.junit4 androidTestImplementation AndroidX.test.runner androidTestImplementation AndroidX.test.rules } \ No newline at end of file diff --git a/versions.properties b/versions.properties index 19e0bb34d168..667a62f8af21 100644 --- a/versions.properties +++ b/versions.properties @@ -22,7 +22,6 @@ version.com.android.installreferrer..installreferrer=1.1.2 version.com.github.bumptech.glide..compiler=4.11.0 version.com.github.bumptech.glide..glide=4.11.0 version.com.github.bumptech.glide..okhttp3-integration=4.11.0 -version.com.jakewharton.retrofit..retrofit2-kotlin-coroutines-adapter=0.9.2 version.com.jakewharton.rxrelay2..rxrelay=2.0.0 version.com.jakewharton.timber..timber=4.7.1 version.com.nhaarman.mockitokotlin2..mockito-kotlin=2.1.0 @@ -38,4 +37,5 @@ version.org.apache.commons..commons-math3=3.6.1 version.org.jetbrains.anko..anko-commons=0.10.4 version.org.jetbrains.anko..anko-design=0.10.4 version.org.mockito..mockito-android=3.4.6 -version.retrofit2=2.8.1 \ No newline at end of file +version.retrofit2=2.8.1 +version.junit.junit=4.13.2 From d89fb413d71536b66f0821bc54c86b695b0546ce Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 17 Feb 2021 09:19:52 +0000 Subject: [PATCH 13/14] Reverted change in RxPixelSenderTest as it stayed in the :app module --- .../1.json | 58 ------------------- .../app/statistics/api/RxPixelSenderTest.kt | 20 +------ 2 files changed, 3 insertions(+), 75 deletions(-) delete mode 100644 app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json diff --git a/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json b/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json deleted file mode 100644 index da408abd9a6c..000000000000 --- a/app/schemas/com.duckduckgo.app.statistics.api.TestDatabase/1.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 1, - "identityHash": "a44eac9c2f80556efd776f2147007cf3", - "entities": [ - { - "tableName": "pixel_store", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `pixelName` TEXT NOT NULL, `atb` TEXT NOT NULL, `additionalQueryParams` TEXT NOT NULL, `encodedQueryParams` TEXT NOT NULL)", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "pixelName", - "columnName": "pixelName", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "atb", - "columnName": "atb", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "additionalQueryParams", - "columnName": "additionalQueryParams", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "encodedQueryParams", - "columnName": "encodedQueryParams", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "id" - ], - "autoGenerate": true - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a44eac9c2f80556efd776f2147007cf3')" - ] - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt index 871101095387..5feadfe7325e 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/statistics/api/RxPixelSenderTest.kt @@ -17,18 +17,15 @@ package com.duckduckgo.app.statistics.api import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.room.Database import androidx.room.Room -import androidx.room.RoomDatabase -import androidx.room.TypeConverters import androidx.test.platform.app.InstrumentationRegistry import com.duckduckgo.app.InstantSchedulersRule +import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.device.DeviceInfo import com.duckduckgo.app.statistics.Variant import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.model.Atb import com.duckduckgo.app.statistics.model.PixelEntity -import com.duckduckgo.app.statistics.model.QueryParamsTypeConverter import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.PRIVACY_DASHBOARD_OPENED import com.duckduckgo.app.statistics.store.PendingPixelDao import com.duckduckgo.app.statistics.store.StatisticsDataStore @@ -43,17 +40,6 @@ import org.junit.Test import org.mockito.Mock import java.util.concurrent.TimeoutException -@Database( - entities = [PixelEntity::class], - version = 1 -) -@TypeConverters( - QueryParamsTypeConverter::class -) -abstract class TestDatabase : RoomDatabase() { - abstract fun pixelDao(): PendingPixelDao -} - class RxPixelSenderTest { @get:Rule @@ -76,13 +62,13 @@ class RxPixelSenderTest { @Mock val mockDeviceInfo: DeviceInfo = mock() - private lateinit var db: TestDatabase + private lateinit var db: AppDatabase private lateinit var pendingPixelDao: PendingPixelDao private lateinit var testee: RxPixelSender @Before fun before() { - db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, TestDatabase::class.java) + db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, AppDatabase::class.java) .allowMainThreadQueries() .build() pendingPixelDao = db.pixelDao() From c41dada74a47e23dc5160a3e3e14c487f7990d30 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 17 Feb 2021 09:32:42 +0000 Subject: [PATCH 14/14] Changed compileSdkVersion and targetSdkVersion to 29 in :common and :statistics and extracted common lib gradle config --- app/build.gradle | 6 ++--- build.gradle | 5 ++++ common/build.gradle | 29 +---------------------- gradle/android-library.gradle | 44 +++++++++++++++++++++++++++++++++++ statistics/build.gradle | 29 +---------------------- 5 files changed, 54 insertions(+), 59 deletions(-) create mode 100644 gradle/android-library.gradle diff --git a/app/build.gradle b/app/build.gradle index cd3a62afa7ea..5a3bb8c9559e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,12 +11,12 @@ ext { } android { - compileSdkVersion 29 + compileSdkVersion compile_sdk ndkVersion '21.0.6113669' defaultConfig { applicationId "com.duckduckgo.mobile.android" - minSdkVersion 21 - targetSdkVersion 29 + minSdkVersion min_sdk + targetSdkVersion target_sdk versionCode buildVersionCode() versionName buildVersionName() testInstrumentationRunner "com.duckduckgo.app.TestRunner" diff --git a/build.gradle b/build.gradle index 2fa567565fac..a78ca9fe0184 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,11 @@ buildscript { ext.kotlin_version = '1.4.10' ext.spotless = "5.7.0" + ext.min_sdk = 21 + ext.target_sdk = 29 + ext.compile_sdk = 29 + ext.tools_build_version = "30.0.3" + repositories { google() jcenter() diff --git a/common/build.gradle b/common/build.gradle index eb3c81b395e9..1a4227eb19e6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -20,34 +20,7 @@ plugins { id 'kotlin-kapt' } -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} +apply from: "$rootProject.projectDir/gradle/android-library.gradle" dependencies { implementation Kotlin.stdlib.jdk7 diff --git a/gradle/android-library.gradle b/gradle/android-library.gradle new file mode 100644 index 000000000000..5efab3c5bdfb --- /dev/null +++ b/gradle/android-library.gradle @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +android { + compileSdkVersion compile_sdk + buildToolsVersion tools_build_version + + defaultConfig { + minSdkVersion min_sdk + targetSdkVersion target_sdk + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} diff --git a/statistics/build.gradle b/statistics/build.gradle index 753d4e9ba793..4495d9ccbad2 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -20,34 +20,7 @@ plugins { id 'kotlin-kapt' } -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} +apply from: "$rootProject.projectDir/gradle/android-library.gradle" dependencies { implementation project(path: ':common')