diff --git a/.github/workflows/ads-end-to-end.yml b/.github/workflows/ads-end-to-end.yml index 431deb92f033..238bc3a8d196 100644 --- a/.github/workflows/ads-end-to-end.yml +++ b/.github/workflows/ads-end-to-end.yml @@ -20,10 +20,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Create folder diff --git a/.github/workflows/build-debug-apk.yaml b/.github/workflows/build-debug-apk.yaml index 9eead01e0cc8..0218dfa3323a 100644 --- a/.github/workflows/build-debug-apk.yaml +++ b/.github/workflows/build-debug-apk.yaml @@ -23,10 +23,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go @@ -48,4 +48,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: pr-ddg-debug - path: pr-ddg-debug.apk \ No newline at end of file + path: pr-ddg-debug.apk diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e8920dfe1c4..4f9b753f56fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,10 +28,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Run Code Formatting Checks @@ -49,10 +49,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: JVM tests @@ -81,10 +81,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go @@ -123,10 +123,10 @@ jobs: with: force: true - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go diff --git a/.github/workflows/end-to-end.yml b/.github/workflows/end-to-end.yml index b12c235196c8..2fa85f7a3b7d 100644 --- a/.github/workflows/end-to-end.yml +++ b/.github/workflows/end-to-end.yml @@ -20,10 +20,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Create folder diff --git a/.github/workflows/external-css-tests.yml b/.github/workflows/external-css-tests.yml index 1d6ca640c8d2..f967097f70ed 100644 --- a/.github/workflows/external-css-tests.yml +++ b/.github/workflows/external-css-tests.yml @@ -40,10 +40,10 @@ jobs: working-directory: node_modules/@duckduckgo/content-scope-scripts run: npm run build - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Decode secret diff --git a/.github/workflows/external-ref-tests.yml b/.github/workflows/external-ref-tests.yml index 3a3868514dbc..f64f3697dc90 100644 --- a/.github/workflows/external-ref-tests.yml +++ b/.github/workflows/external-ref-tests.yml @@ -33,10 +33,10 @@ jobs: - name: Copy files run: copy-files-from-to - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: JVM tests @@ -79,10 +79,10 @@ jobs: - name: Copy files run: copy-files-from-to - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Decode secret diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 45fbbbeb642d..c0333f545576 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -20,10 +20,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Run Code Formatting Checks @@ -41,10 +41,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: JVM tests @@ -73,10 +73,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go @@ -115,10 +115,10 @@ jobs: with: force: true - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go diff --git a/.github/workflows/privacy-dashboard-end-to-end.yml b/.github/workflows/privacy-dashboard-end-to-end.yml index c7d54700c6d1..35402780124c 100644 --- a/.github/workflows/privacy-dashboard-end-to-end.yml +++ b/.github/workflows/privacy-dashboard-end-to-end.yml @@ -23,10 +23,10 @@ jobs: with: submodules: recursive - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Create folder diff --git a/.github/workflows/privacy.yml b/.github/workflows/privacy.yml index 60109ea92e0d..78e41a5dd0e5 100644 --- a/.github/workflows/privacy.yml +++ b/.github/workflows/privacy.yml @@ -28,10 +28,10 @@ jobs: with: force: true - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Set up Go diff --git a/.gitmodules b/.gitmodules index 2ba453434540..4c184ef79613 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,5 @@ [submodule "app/src/main/cpp/third-party/bloom_cpp"] - path = app/src/main/cpp/third-party/bloom_cpp + path = httpsupgrade/httpsupgrade-impl/src/main/cpp/bloom_cpp url = https://github.com/duckduckgo/bloom_cpp.git [submodule "submodules/privacy-grade"] path = submodules/privacy-grade diff --git a/ad-click/ad-click-api/build.gradle b/ad-click/ad-click-api/build.gradle index 547a793f5dda..7f6e3e3af7b2 100644 --- a/ad-click/ad-click-api/build.gradle +++ b/ad-click/ad-click-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/anvil/anvil-annotations/build.gradle b/anvil/anvil-annotations/build.gradle index 7691cabfea35..7b93cd374b8d 100644 --- a/anvil/anvil-annotations/build.gradle +++ b/anvil/anvil-annotations/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/anvil/anvil-compiler/build.gradle b/anvil/anvil-compiler/build.gradle index 41435f30d9af..5dd39f1d9f65 100644 --- a/anvil/anvil-compiler/build.gradle +++ b/anvil/anvil-compiler/build.gradle @@ -23,8 +23,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesRemoteFeatureCodeGenerator.kt b/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesRemoteFeatureCodeGenerator.kt index 4f1a85b805dd..f9fcdb1e44f3 100644 --- a/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesRemoteFeatureCodeGenerator.kt +++ b/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesRemoteFeatureCodeGenerator.kt @@ -866,7 +866,7 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator { return argumentAt("toggleStore", 5)?.value() } - private fun ClassReference.declaredFunctions(): List { + private fun ClassReference.declaredFunctions(): List { return functions .filter { it.name != "equals" } .filter { it.name != "hashCode" } diff --git a/app-build-config/app-build-config-api/build.gradle b/app-build-config/app-build-config-api/build.gradle index 87b4f6194104..1fbb5bf191d3 100644 --- a/app-build-config/app-build-config-api/build.gradle +++ b/app-build-config/app-build-config-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-fr/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-fr/strings-vpn.xml index 2987b402efcd..058b9fc68993 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-fr/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-fr/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Protection contre le suivi des applications Actualiser @@ -211,11 +211,11 @@ Dans - Tentative de suivi + Tentative de suivi Tentatives de suivi - Application + Application Applications Cette fonctionnalité est disponible en version bêta. Vous rencontrez un problème lié à une application ? Veuillez le signaler. diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-hr/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-hr/strings-vpn.xml index 3c606344bf76..1957d88f8b7b 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-hr/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-hr/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Zaštita od praćenja aplikacija Osvježi @@ -219,13 +219,13 @@ U - pokušaj praćenja + pokušaj praćenja pokušaja praćenja pokušaja praćenja pokušaja praćenja - aplikacija + aplikacija aplikacije aplikacija aplikacije diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-lt/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-lt/strings-vpn.xml index 142c4d1b6b64..6739d6e3b56d 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-lt/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-lt/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Programų sekimo apsauga Atnaujinti @@ -219,13 +219,13 @@ Per - Bandymas sekti + Bandymas sekti Bandymai sekti Bandymų sekti Bandymų sekti - Programa + Programa Programos Programų Programų diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-lv/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-lv/strings-vpn.xml index 800bbb7d61b5..0829fc33379d 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-lv/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-lv/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Lietotņu pretizsekošanas aizsardzība Atsvaidzināt @@ -215,13 +215,13 @@ Lietotņu skaits - izsekošanas mēģinājumu - izsekošanas mēģinājums + izsekošanas mēģinājumu + izsekošanas mēģinājums izsekošanas mēģinājumi - lietotnes - lietotne + lietotnes + lietotne lietotnes Šī funkcija ir beta versijā. Pamanīji problēmu ar kādu lietotni? Lūdzu, ziņo par to. diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-pt/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-pt/strings-vpn.xml index c52c98330b55..7e1db67d9c5f 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-pt/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-pt/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Proteção contra o rastreamento por aplicações Atualizar @@ -211,11 +211,11 @@ Em - Tentativa de rastreamento + Tentativa de rastreamento Tentativas de rastreamento - Aplicação + Aplicação Aplicações Esta funcionalidade está em versão beta. Detetaste algum problema com uma aplicação? Comunica o problema. diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-ru/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-ru/strings-vpn.xml index 273476282d33..043d352baaa3 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-ru/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-ru/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Блокировка отслеживания приложениями Обновить @@ -219,13 +219,13 @@ в - попытка отслеживания + попытка отслеживания попытки отслеживания попыток отслеживания попытки отслеживания - приложении + приложении приложениях приложениях приложения diff --git a/app-tracking-protection/vpn-impl/src/main/res/values-sl/strings-vpn.xml b/app-tracking-protection/vpn-impl/src/main/res/values-sl/strings-vpn.xml index 73d526e49fb7..d0a9372746f4 100644 --- a/app-tracking-protection/vpn-impl/src/main/res/values-sl/strings-vpn.xml +++ b/app-tracking-protection/vpn-impl/src/main/res/values-sl/strings-vpn.xml @@ -16,7 +16,7 @@ --> - + Zaščita pred sledenjem aplikacij Osveži @@ -219,14 +219,14 @@ Na spletni strani - Poskus sledenja - Poskusa sledenja + Poskus sledenja + Poskusa sledenja Poskusi sledenja Poskusi sledenja - Aplikacija - Aplikaciji + Aplikacija + Aplikaciji Aplikacije Aplikacij diff --git a/app-tracking-protection/vpn-store/src/test/java/com/duckduckgo/mobile/android/vpn/store/VpnDatabaseTest.kt b/app-tracking-protection/vpn-store/src/test/java/com/duckduckgo/mobile/android/vpn/store/VpnDatabaseTest.kt index 9a9310ae8d5a..4aac4971161b 100644 --- a/app-tracking-protection/vpn-store/src/test/java/com/duckduckgo/mobile/android/vpn/store/VpnDatabaseTest.kt +++ b/app-tracking-protection/vpn-store/src/test/java/com/duckduckgo/mobile/android/vpn/store/VpnDatabaseTest.kt @@ -34,7 +34,7 @@ class VpnDatabaseTest { @get:Rule val testHelper = - MigrationTestHelper(InstrumentationRegistry.getInstrumentation(), VpnDatabase::class.qualifiedName, FrameworkSQLiteOpenHelperFactory()) + MigrationTestHelper(InstrumentationRegistry.getInstrumentation(), VpnDatabase::class.qualifiedName!!, FrameworkSQLiteOpenHelperFactory()) @Test fun whenTestingAllMigrationsThenSucceeds() { diff --git a/app/build.gradle b/app/build.gradle index 265297870882..a46250739185 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,6 @@ ext { } android { - ndkVersion '21.4.7075529' defaultConfig { applicationId "com.duckduckgo.mobile.android" minSdk min_sdk @@ -58,8 +57,11 @@ android { viewBinding = true } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlin { + jvmToolchain(17) } signingConfigs { release @@ -102,12 +104,6 @@ android { setIgnore(true) } } - externalNativeBuild { - - cmake { - path "CMakeLists.txt" - } - } lint { abortOnError true ignoreTestSources false @@ -259,6 +255,10 @@ dependencies { implementation project(':element-hiding-impl') implementation project(':element-hiding-store') + implementation project(':httpsupgrade-api') + implementation project(':httpsupgrade-impl') + implementation project(':httpsupgrade-store') + implementation project(':sync-api') implementation project(':sync-impl') implementation project(':sync-store') diff --git a/app/schemas/com.duckduckgo.app.global.db.AppDatabase/49.json b/app/schemas/com.duckduckgo.app.global.db.AppDatabase/49.json new file mode 100644 index 000000000000..2d0c919d9999 --- /dev/null +++ b/app/schemas/com.duckduckgo.app.global.db.AppDatabase/49.json @@ -0,0 +1,985 @@ +{ + "formatVersion": 1, + "database": { + "version": 49, + "identityHash": "94c2d412eb4c7627396e5cd20c9dfe6a", + "entities": [ + { + "tableName": "tds_tracker", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, `defaultAction` TEXT NOT NULL, `ownerName` TEXT NOT NULL, `categories` TEXT NOT NULL, `rules` TEXT NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "defaultAction", + "columnName": "defaultAction", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "ownerName", + "columnName": "ownerName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "categories", + "columnName": "categories", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "rules", + "columnName": "rules", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tds_entity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `displayName` TEXT NOT NULL, `prevalence` REAL NOT NULL, PRIMARY KEY(`name`))", + "fields": [ + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "displayName", + "columnName": "displayName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "prevalence", + "columnName": "prevalence", + "affinity": "REAL", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "name" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tds_domain_entity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, `entityName` TEXT NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entityName", + "columnName": "entityName", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tds_cname_entity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`cloakedHostName` TEXT NOT NULL, `uncloakedHostName` TEXT NOT NULL, PRIMARY KEY(`cloakedHostName`))", + "fields": [ + { + "fieldPath": "cloakedHostName", + "columnName": "cloakedHostName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uncloakedHostName", + "columnName": "uncloakedHostName", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "cloakedHostName" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "user_whitelist", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "network_leaderboard", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`networkName` TEXT NOT NULL, `count` INTEGER NOT NULL, PRIMARY KEY(`networkName`))", + "fields": [ + { + "fieldPath": "networkName", + "columnName": "networkName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "networkName" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "sites_visited", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `count` INTEGER NOT NULL, PRIMARY KEY(`key`))", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tabs", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tabId` TEXT NOT NULL, `url` TEXT, `title` TEXT, `skipHome` INTEGER NOT NULL, `viewed` INTEGER NOT NULL, `position` INTEGER NOT NULL, `tabPreviewFile` TEXT, `sourceTabId` TEXT, `deletable` INTEGER NOT NULL, PRIMARY KEY(`tabId`), FOREIGN KEY(`sourceTabId`) REFERENCES `tabs`(`tabId`) ON UPDATE SET NULL ON DELETE SET NULL )", + "fields": [ + { + "fieldPath": "tabId", + "columnName": "tabId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "skipHome", + "columnName": "skipHome", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "viewed", + "columnName": "viewed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "tabPreviewFile", + "columnName": "tabPreviewFile", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sourceTabId", + "columnName": "sourceTabId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deletable", + "columnName": "deletable", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "tabId" + ] + }, + "indices": [ + { + "name": "index_tabs_tabId", + "unique": false, + "columnNames": [ + "tabId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_tabs_tabId` ON `${TABLE_NAME}` (`tabId`)" + } + ], + "foreignKeys": [ + { + "table": "tabs", + "onDelete": "SET NULL", + "onUpdate": "SET NULL", + "columns": [ + "sourceTabId" + ], + "referencedColumns": [ + "tabId" + ] + } + ] + }, + { + "tableName": "tab_selection", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tabId` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`tabId`) REFERENCES `tabs`(`tabId`) ON UPDATE NO ACTION ON DELETE SET NULL )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "tabId", + "columnName": "tabId", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_tab_selection_tabId", + "unique": false, + "columnNames": [ + "tabId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_tab_selection_tabId` ON `${TABLE_NAME}` (`tabId`)" + } + ], + "foreignKeys": [ + { + "table": "tabs", + "onDelete": "SET NULL", + "onUpdate": "NO ACTION", + "columns": [ + "tabId" + ], + "referencedColumns": [ + "tabId" + ] + } + ] + }, + { + "tableName": "bookmarks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT, `url` TEXT NOT NULL, `parentId` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentId", + "columnName": "parentId", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "favorites", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `url` TEXT NOT NULL, `position` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_favorites_title_url", + "unique": true, + "columnNames": [ + "title", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_favorites_title_url` ON `${TABLE_NAME}` (`title`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "bookmark_folders", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `parentId` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "parentId", + "columnName": "parentId", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "survey", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`surveyId` TEXT NOT NULL, `url` TEXT, `daysInstalled` INTEGER, `status` TEXT NOT NULL, PRIMARY KEY(`surveyId`))", + "fields": [ + { + "fieldPath": "surveyId", + "columnName": "surveyId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "daysInstalled", + "columnName": "daysInstalled", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "surveyId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "dismissed_cta", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ctaId` TEXT NOT NULL, PRIMARY KEY(`ctaId`))", + "fields": [ + { + "fieldPath": "ctaId", + "columnName": "ctaId", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "ctaId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "search_count", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `count` INTEGER NOT NULL, PRIMARY KEY(`key`))", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "app_days_used", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`date` TEXT NOT NULL, `previous_date` TEXT, PRIMARY KEY(`date`))", + "fields": [ + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "previousDate", + "columnName": "previous_date", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "date" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "app_enjoyment", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`eventType` INTEGER NOT NULL, `promptCount` INTEGER NOT NULL, `timestamp` INTEGER NOT NULL, `primaryKey` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "eventType", + "columnName": "eventType", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "promptCount", + "columnName": "promptCount", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "primaryKey", + "columnName": "primaryKey", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "primaryKey" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "notification", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`notificationId` TEXT NOT NULL, PRIMARY KEY(`notificationId`))", + "fields": [ + { + "fieldPath": "notificationId", + "columnName": "notificationId", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "notificationId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "privacy_protection_count", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `blocked_tracker_count` INTEGER NOT NULL, `upgrade_count` INTEGER NOT NULL, PRIMARY KEY(`key`))", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "blockedTrackerCount", + "columnName": "blocked_tracker_count", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "upgradeCount", + "columnName": "upgrade_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tdsMetadata", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `eTag` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "eTag", + "columnName": "eTag", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "userStage", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` INTEGER NOT NULL, `appStage` TEXT NOT NULL, PRIMARY KEY(`key`))", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "appStage", + "columnName": "appStage", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "fireproofWebsites", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "user_events", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `payload` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "payload", + "columnName": "payload", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "locationPermissions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, `permission` INTEGER NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "permission", + "columnName": "permission", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "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": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "web_trackers_blocked", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `trackerUrl` TEXT NOT NULL, `trackerCompany` TEXT NOT NULL, `timestamp` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "trackerUrl", + "columnName": "trackerUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "trackerCompany", + "columnName": "trackerCompany", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "auth_cookies_allowed_domains", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`domain` TEXT NOT NULL, PRIMARY KEY(`domain`))", + "fields": [ + { + "fieldPath": "domain", + "columnName": "domain", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "domain" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "entities", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`entityId` TEXT NOT NULL, `title` TEXT NOT NULL, `url` TEXT, `type` TEXT NOT NULL, `lastModified` TEXT, `deleted` INTEGER NOT NULL, PRIMARY KEY(`entityId`))", + "fields": [ + { + "fieldPath": "entityId", + "columnName": "entityId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lastModified", + "columnName": "lastModified", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "entityId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "relations", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `folderId` TEXT NOT NULL, `entityId` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "folderId", + "columnName": "folderId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "entityId", + "columnName": "entityId", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "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, '94c2d412eb4c7627396e5cd20c9dfe6a')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/WebViewRequestInterceptorTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/WebViewRequestInterceptorTest.kt index fdcabc50cd3f..6c9baaf3424a 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/WebViewRequestInterceptorTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/WebViewRequestInterceptorTest.kt @@ -29,7 +29,6 @@ import com.duckduckgo.app.browser.useragent.provideUserAgentOverridePluginPoint import com.duckduckgo.app.fakes.FeatureToggleFake import com.duckduckgo.app.fakes.UserAgentFake import com.duckduckgo.app.fakes.UserAllowListRepositoryFake -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao import com.duckduckgo.app.surrogates.ResourceSurrogates import com.duckduckgo.app.surrogates.SurrogateResponse @@ -39,6 +38,7 @@ import com.duckduckgo.app.trackerdetection.model.TrackerStatus import com.duckduckgo.app.trackerdetection.model.TrackerType import com.duckduckgo.app.trackerdetection.model.TrackingEvent import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader import com.duckduckgo.privacy.config.api.Gpc import com.duckduckgo.privacy.config.api.UserAgent import com.duckduckgo.privacy.config.impl.features.gpc.RealGpc.Companion.GPC_HEADER diff --git a/app/src/androidTest/java/com/duckduckgo/app/global/db/AppDatabaseTest.kt b/app/src/androidTest/java/com/duckduckgo/app/global/db/AppDatabaseTest.kt index 6afaf7ba13d7..2f9e878adfe6 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/global/db/AppDatabaseTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/global/db/AppDatabaseTest.kt @@ -50,7 +50,7 @@ class AppDatabaseTest { var instantTaskExecutorRule = InstantTaskExecutorRule() @get:Rule - val testHelper = MigrationTestHelper(getInstrumentation(), AppDatabase::class.qualifiedName, FrameworkSQLiteOpenHelperFactory()) + val testHelper = MigrationTestHelper(getInstrumentation(), AppDatabase::class.qualifiedName!!, FrameworkSQLiteOpenHelperFactory()) private val context = mock() private val mockSettingsDataStore: SettingsDataStore = mock() diff --git a/app/src/androidTest/java/com/duckduckgo/app/referencetests/DomainsReferenceTest.kt b/app/src/androidTest/java/com/duckduckgo/app/referencetests/DomainsReferenceTest.kt index 218fe26936b5..2f8cfef01916 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/referencetests/DomainsReferenceTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/referencetests/DomainsReferenceTest.kt @@ -35,7 +35,6 @@ import com.duckduckgo.app.fakes.FeatureToggleFake import com.duckduckgo.app.fakes.UserAgentFake import com.duckduckgo.app.fakes.UserAllowListRepositoryFake import com.duckduckgo.app.global.db.AppDatabase -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao import com.duckduckgo.app.privacy.db.UserAllowListRepository import com.duckduckgo.app.privacy.db.UserWhitelistDao @@ -57,6 +56,7 @@ import com.duckduckgo.app.trackerdetection.db.TdsDomainEntityDao import com.duckduckgo.app.trackerdetection.db.TdsEntityDao import com.duckduckgo.app.trackerdetection.db.WebTrackersBlockedDao import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader import com.duckduckgo.privacy.config.api.ContentBlocking import com.duckduckgo.privacy.config.api.Gpc import com.duckduckgo.privacy.config.api.TrackerAllowlist diff --git a/app/src/androidTest/java/com/duckduckgo/app/referencetests/HttpsReferenceTest.kt b/app/src/androidTest/java/com/duckduckgo/app/referencetests/HttpsReferenceTest.kt index b3e2aa1581a2..22b203ba2aad 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/referencetests/HttpsReferenceTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/referencetests/HttpsReferenceTest.kt @@ -22,24 +22,24 @@ import androidx.test.annotation.UiThreadTest import androidx.test.platform.app.InstrumentationRegistry import com.duckduckgo.app.CoroutineTestRule import com.duckduckgo.app.FileUtilities -import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.isHttps import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.HttpsBloomFilterFactory -import com.duckduckgo.app.httpsupgrade.HttpsBloomFilterFactoryImpl -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader -import com.duckduckgo.app.httpsupgrade.HttpsUpgraderImpl -import com.duckduckgo.app.httpsupgrade.api.HttpsFalsePositivesJsonAdapter -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain -import com.duckduckgo.app.httpsupgrade.store.HttpsBloomFilterSpecDao -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsEmbeddedDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.app.privacy.db.UserAllowListRepository import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.trackerdetection.api.ActionJsonAdapter import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.impl.HttpsBloomFilterFactory +import com.duckduckgo.httpsupgrade.impl.HttpsBloomFilterFactoryImpl +import com.duckduckgo.httpsupgrade.impl.HttpsDataPersister +import com.duckduckgo.httpsupgrade.impl.HttpsFalsePositivesJsonAdapter +import com.duckduckgo.httpsupgrade.impl.HttpsUpgraderImpl +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpecDao +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositiveDomain +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao +import com.duckduckgo.httpsupgrade.store.HttpsUpgradeDatabase import com.duckduckgo.privacy.config.api.Https import com.duckduckgo.privacy.config.api.HttpsException import com.duckduckgo.privacy.config.api.PrivacyFeatureName @@ -71,6 +71,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import timber.log.Timber +// FIXME reference tests forced to have visibility in things we should not have visibility like httpsupgrade-impl and impl classes :shrug: @ExperimentalCoroutinesApi @RunWith(Parameterized::class) class HttpsReferenceTest(private val testCase: TestCase) { @@ -79,7 +80,7 @@ class HttpsReferenceTest(private val testCase: TestCase) { @get:Rule var coroutinesTestRule = CoroutineTestRule() - private lateinit var db: AppDatabase + private lateinit var db: HttpsUpgradeDatabase private lateinit var bloomFalsePositiveDao: HttpsFalsePositivesDao private lateinit var bloomFilterFactory: HttpsBloomFilterFactory private lateinit var httpsBloomFilterSpecDao: HttpsBloomFilterSpecDao @@ -181,7 +182,7 @@ class HttpsReferenceTest(private val testCase: TestCase) { private fun initialiseBloomFilter() { val context = InstrumentationRegistry.getInstrumentation().targetContext - db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java) + db = Room.inMemoryDatabaseBuilder(context, HttpsUpgradeDatabase::class.java) .allowMainThreadQueries() .build() diff --git a/app/src/androidTest/java/com/duckduckgo/app/referencetests/SurrogatesReferenceTest.kt b/app/src/androidTest/java/com/duckduckgo/app/referencetests/SurrogatesReferenceTest.kt index a53b102338f3..66ddfab8df5f 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/referencetests/SurrogatesReferenceTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/referencetests/SurrogatesReferenceTest.kt @@ -34,7 +34,6 @@ import com.duckduckgo.app.fakes.FeatureToggleFake import com.duckduckgo.app.fakes.UserAgentFake import com.duckduckgo.app.fakes.UserAllowListRepositoryFake import com.duckduckgo.app.global.db.AppDatabase -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao import com.duckduckgo.app.privacy.db.UserWhitelistDao import com.duckduckgo.app.surrogates.ResourceSurrogateLoader @@ -55,6 +54,7 @@ import com.duckduckgo.app.trackerdetection.db.TdsDomainEntityDao import com.duckduckgo.app.trackerdetection.db.TdsEntityDao import com.duckduckgo.app.trackerdetection.db.WebTrackersBlockedDao import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader import com.duckduckgo.privacy.config.api.ContentBlocking import com.duckduckgo.privacy.config.api.Gpc import com.duckduckgo.privacy.config.api.TrackerAllowlist diff --git a/app/src/androidTestPlay/java/com/duckduckgo/app/integration/HttpsEmbeddedDataIntegrationTest.kt b/app/src/androidTestPlay/java/com/duckduckgo/app/integration/HttpsEmbeddedDataIntegrationTest.kt index d560dd873731..c959dce3297d 100644 --- a/app/src/androidTestPlay/java/com/duckduckgo/app/integration/HttpsEmbeddedDataIntegrationTest.kt +++ b/app/src/androidTestPlay/java/com/duckduckgo/app/integration/HttpsEmbeddedDataIntegrationTest.kt @@ -19,15 +19,15 @@ package com.duckduckgo.app.integration import android.net.Uri import androidx.room.Room import androidx.test.platform.app.InstrumentationRegistry -import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.HttpsBloomFilterFactoryImpl -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader -import com.duckduckgo.app.httpsupgrade.HttpsUpgraderImpl -import com.duckduckgo.app.httpsupgrade.api.HttpsFalsePositivesJsonAdapter -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.impl.HttpsBloomFilterFactoryImpl +import com.duckduckgo.httpsupgrade.impl.HttpsDataPersister +import com.duckduckgo.httpsupgrade.impl.HttpsFalsePositivesJsonAdapter +import com.duckduckgo.httpsupgrade.impl.HttpsUpgraderImpl +import com.duckduckgo.httpsupgrade.store.HttpsUpgradeDatabase import com.duckduckgo.httpsupgrade.store.PlayHttpsEmbeddedDataPersister import com.duckduckgo.privacy.config.api.Https import com.duckduckgo.privacy.config.api.PrivacyFeatureName @@ -44,7 +44,7 @@ import org.mockito.kotlin.whenever class HttpsEmbeddedDataIntegrationTest { private lateinit var httpsUpgrader: HttpsUpgrader - private lateinit var db: AppDatabase + private lateinit var db: HttpsUpgradeDatabase private val context = InstrumentationRegistry.getInstrumentation().targetContext private var moshi = Moshi.Builder().add(HttpsFalsePositivesJsonAdapter()).build() @@ -56,7 +56,7 @@ class HttpsEmbeddedDataIntegrationTest { fun before() { whenever(mockFeatureToggle.isFeatureEnabled(PrivacyFeatureName.HttpsFeatureName.value)).thenReturn(true) - db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java) + db = Room.inMemoryDatabaseBuilder(context, HttpsUpgradeDatabase::class.java) .allowMainThreadQueries() .build() diff --git a/app/src/main/java/com/duckduckgo/app/browser/WebViewRequestInterceptor.kt b/app/src/main/java/com/duckduckgo/app/browser/WebViewRequestInterceptor.kt index 5afb51b22401..583d39d98f26 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/WebViewRequestInterceptor.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/WebViewRequestInterceptor.kt @@ -27,7 +27,6 @@ import com.duckduckgo.app.global.AppUrl import com.duckduckgo.app.global.DefaultDispatcherProvider import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.isHttp -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao import com.duckduckgo.app.privacy.model.TrustedSites import com.duckduckgo.app.surrogates.ResourceSurrogates @@ -35,6 +34,7 @@ import com.duckduckgo.app.trackerdetection.CloakedCnameDetector import com.duckduckgo.app.trackerdetection.TrackerDetector import com.duckduckgo.app.trackerdetection.model.TrackerStatus import com.duckduckgo.app.trackerdetection.model.TrackingEvent +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader import com.duckduckgo.privacy.config.api.Gpc import com.duckduckgo.request.filterer.api.RequestFilterer import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt b/app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt index 68affdcaa9e4..da24206ec070 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt @@ -55,7 +55,6 @@ import com.duckduckgo.app.global.events.db.UserEventsStore import com.duckduckgo.app.global.file.FileDeleter import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.global.plugins.PluginPoint -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver import com.duckduckgo.app.privacy.db.PrivacyProtectionCountDao import com.duckduckgo.app.privacy.db.UserAllowListRepository @@ -78,6 +77,7 @@ import com.duckduckgo.downloads.impl.AndroidFileDownloader import com.duckduckgo.downloads.impl.DataUriDownloader import com.duckduckgo.downloads.impl.FileDownloadCallback import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader import com.duckduckgo.privacy.config.api.AmpLinks import com.duckduckgo.privacy.config.api.Gpc import com.duckduckgo.privacy.config.api.TrackingParameters diff --git a/app/src/main/java/com/duckduckgo/app/di/AppConfigurationDownloaderModule.kt b/app/src/main/java/com/duckduckgo/app/di/AppConfigurationDownloaderModule.kt index 1d92b07a0452..b0b3734cdb2c 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AppConfigurationDownloaderModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AppConfigurationDownloaderModule.kt @@ -16,12 +16,12 @@ package com.duckduckgo.app.di -import com.duckduckgo.app.httpsupgrade.api.HttpsUpgradeDataDownloader import com.duckduckgo.app.job.AppConfigurationDownloader import com.duckduckgo.app.job.ConfigurationDownloader import com.duckduckgo.app.surrogates.api.ResourceSurrogateListDownloader import com.duckduckgo.app.survey.api.SurveyDownloader import com.duckduckgo.app.trackerdetection.api.TrackerDataDownloader +import com.duckduckgo.httpsupgrade.api.HttpsUpgradeDataDownloader import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/duckduckgo/app/di/DaoModule.kt b/app/src/main/java/com/duckduckgo/app/di/DaoModule.kt index 36be74c8dfb9..1fc90a50ff0d 100644 --- a/app/src/main/java/com/duckduckgo/app/di/DaoModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/DaoModule.kt @@ -23,12 +23,6 @@ import dagger.Provides @Module object DaoModule { - @Provides - fun providesHttpsFalsePositivesDao(database: AppDatabase) = database.httpsFalsePositivesDao() - - @Provides - fun provideHttpsBloomFilterSpecDao(database: AppDatabase) = database.httpsBloomFilterSpecDao() - @Provides fun providesTdsTrackDao(database: AppDatabase) = database.tdsTrackerDao() diff --git a/app/src/main/java/com/duckduckgo/app/di/JsonModule.kt b/app/src/main/java/com/duckduckgo/app/di/JsonModule.kt index 4e58cb9d5e3b..b5e7c387d3b3 100644 --- a/app/src/main/java/com/duckduckgo/app/di/JsonModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/JsonModule.kt @@ -16,9 +16,9 @@ package com.duckduckgo.app.di -import com.duckduckgo.app.httpsupgrade.api.HttpsFalsePositivesJsonAdapter import com.duckduckgo.app.trackerdetection.api.ActionJsonAdapter import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.httpsupgrade.impl.HttpsFalsePositivesJsonAdapter import com.duckduckgo.privacy.config.impl.network.JSONObjectAdapter import com.squareup.moshi.Moshi import dagger.Module @@ -32,6 +32,7 @@ object JsonModule { @SingleInstanceIn(AppScope::class) fun moshi(): Moshi = Moshi.Builder() .add(ActionJsonAdapter()) + // FIXME we should not access HttpsFalsePositivesJsonAdapter directly here because it's in impl module .add(HttpsFalsePositivesJsonAdapter()) .add(JSONObjectAdapter()) .build() diff --git a/app/src/main/java/com/duckduckgo/app/global/db/AppDatabase.kt b/app/src/main/java/com/duckduckgo/app/global/db/AppDatabase.kt index bc4526f3e9a3..ee9b0aabb2ee 100644 --- a/app/src/main/java/com/duckduckgo/app/global/db/AppDatabase.kt +++ b/app/src/main/java/com/duckduckgo/app/global/db/AppDatabase.kt @@ -34,10 +34,6 @@ import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.global.events.db.UserEventEntity import com.duckduckgo.app.global.events.db.UserEventTypeConverter import com.duckduckgo.app.global.events.db.UserEventsDao -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain -import com.duckduckgo.app.httpsupgrade.store.HttpsBloomFilterSpecDao -import com.duckduckgo.app.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.app.location.data.LocationPermissionEntity import com.duckduckgo.app.location.data.LocationPermissionsDao import com.duckduckgo.app.notification.db.NotificationDao @@ -70,15 +66,13 @@ import com.duckduckgo.savedsites.store.SavedSitesRelationsDao @Database( exportSchema = true, - version = 48, + version = 49, entities = [ TdsTracker::class, TdsEntity::class, TdsDomainEntity::class, TdsCnameEntity::class, UserWhitelistedDomain::class, - HttpsBloomFilterSpec::class, - HttpsFalsePositiveDomain::class, NetworkLeaderboardEntry::class, SitesVisitedEntity::class, TabEntity::class, @@ -127,8 +121,6 @@ abstract class AppDatabase : RoomDatabase() { abstract fun tdsDomainEntityDao(): TdsDomainEntityDao abstract fun tdsCnameEntityDao(): TdsCnameEntityDao abstract fun userWhitelistDao(): UserWhitelistDao - abstract fun httpsFalsePositivesDao(): HttpsFalsePositivesDao - abstract fun httpsBloomFilterSpecDao(): HttpsBloomFilterSpecDao abstract fun networkLeaderboardDao(): NetworkLeaderboardDao abstract fun tabsDao(): TabsDao abstract fun bookmarksDao(): BookmarksDao @@ -616,6 +608,13 @@ class MigrationsProvider(val context: Context, val settingsDataStore: SettingsDa } } + private val MIGRATION_48_TO_49: Migration = object : Migration(48, 49) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("DROP TABLE `https_bloom_filter_spec`") + database.execSQL("DROP TABLE `https_false_positive_domain`") + } + } + val BOOKMARKS_DB_ON_CREATE = object : RoomDatabase.Callback() { override fun onCreate(database: SupportSQLiteDatabase) { database.execSQL( @@ -689,6 +688,7 @@ class MigrationsProvider(val context: Context, val settingsDataStore: SettingsDa MIGRATION_45_TO_46, MIGRATION_46_TO_47, MIGRATION_47_TO_48, + MIGRATION_48_TO_49, ) @Deprecated( diff --git a/app/src/main/java/com/duckduckgo/app/job/AppConfigurationDownloader.kt b/app/src/main/java/com/duckduckgo/app/job/AppConfigurationDownloader.kt index 2938ebbddfee..a91b32e25601 100644 --- a/app/src/main/java/com/duckduckgo/app/job/AppConfigurationDownloader.kt +++ b/app/src/main/java/com/duckduckgo/app/job/AppConfigurationDownloader.kt @@ -16,10 +16,10 @@ package com.duckduckgo.app.job -import com.duckduckgo.app.httpsupgrade.api.HttpsUpgradeDataDownloader import com.duckduckgo.app.surrogates.api.ResourceSurrogateListDownloader import com.duckduckgo.app.survey.api.SurveyDownloader import com.duckduckgo.app.trackerdetection.api.TrackerDataDownloader +import com.duckduckgo.httpsupgrade.api.HttpsUpgradeDataDownloader import io.reactivex.Completable import timber.log.Timber diff --git a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt index 7e7b620092c0..8aa99ef42068 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt @@ -273,6 +273,4 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName { REMOTE_MESSAGE_SHOWN_UNIQUE("m_remote_message_shown_unique"), REMOTE_MESSAGE_PRIMARY_ACTION_CLICKED("m_remote_message_primary_action_clicked"), REMOTE_MESSAGE_SECONDARY_ACTION_CLICKED("m_remote_message_secondary_action_clicked"), - - CREATE_BLOOM_FILTER_ERROR("m_create_bloom_filter_error"), } diff --git a/app/src/main/java/com/duckduckgo/app/surrogates/api/ResourceSurrogateListDownloader.kt b/app/src/main/java/com/duckduckgo/app/surrogates/api/ResourceSurrogateListDownloader.kt index 791aed09a532..2fe7169cfa16 100644 --- a/app/src/main/java/com/duckduckgo/app/surrogates/api/ResourceSurrogateListDownloader.kt +++ b/app/src/main/java/com/duckduckgo/app/surrogates/api/ResourceSurrogateListDownloader.kt @@ -16,7 +16,7 @@ package com.duckduckgo.app.surrogates.api -import com.duckduckgo.app.global.api.isCached +import com.duckduckgo.app.global.extensions.isCached import com.duckduckgo.app.surrogates.ResourceSurrogateLoader import com.duckduckgo.app.surrogates.store.ResourceSurrogateDataStore import io.reactivex.Completable diff --git a/app/src/main/res/drawable/network_logo_comscore_inc.xml b/app/src/main/res/drawable/network_logo_comscore_inc.xml index ce0247a56ca2..d46262aac6e5 100644 --- a/app/src/main/res/drawable/network_logo_comscore_inc.xml +++ b/app/src/main/res/drawable/network_logo_comscore_inc.xml @@ -9,6 +9,6 @@ android:fillType="evenOdd"/> + android:fillColor="?attr/daxColorSurface" android:fillType="evenOdd"/> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0e414b2e0fbc..b83032770a8a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -469,7 +469,7 @@ %1$d autres essayaient de vous traquer ici.

Je les ai bloqués !

☝️Vous pouvez voir dans la barre d\'adresse URL qui essaie de vous traquer lorsque vous visitez un nouveau site.️]]>
-
Je l\'ai bloqué !

☝️Vous pouvez voir dans la barre d\'adresse URL qui essaie de vous traquer lorsque vous visitez un nouveau site.️️]]>
+
Je l\'ai bloqué !

☝️Vous pouvez voir dans la barre d\'adresse URL qui essaie de vous traquer lorsque vous visitez un nouveau site.️️]]>

Je les ai bloqués !

☝️Vous pouvez voir dans la barre d\'adresse URL qui essaie de vous traquer lorsque vous visitez un nouveau site.️️]]>

Continuez à naviguer en toute tranquillité !]]>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5ae064bb5d36..be2a4aa27634 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -471,7 +471,7 @@ %1$d drugih pokušalo te ovdje pratiti.

Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>
-
Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>
+
Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>

Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>

Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>

Ja sam ih blokirao!

☝️Možeš pogledati na adresnu traku da vidiš tko te pokušava pratiti kad posjetiš novo web-mjesto.]]>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index b02ae6216c73..4fc0613893bf 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -471,7 +471,7 @@ %1$d kitų bandė tave stebėti.

Užblokavau juos!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>
-
Užblokavau!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>
+
Užblokavau!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>

Užblokavau!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>

Užblokavau!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>

Užblokavau!

☝️Patikrink URL juostą ir pamatyk, kas bando tave stebėti, kai lankaisi naujoje svetainėje.️]]>
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 0293802d1830..54970da72cb0 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -470,8 +470,8 @@ %1$d citas vietnes mēģināja tevi šeit izsekot.

Es tās nobloķēju!

☝️ Vari pārbaudīt adreses joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>
-
Es tās nobloķēju!

☝️ Vari pārbaudīt URL joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>
-
Es tās nobloķēju!

☝️ Vari pārbaudīt URL joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>
+
Es tās nobloķēju!

☝️ Vari pārbaudīt URL joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>
+
Es tās nobloķēju!

☝️ Vari pārbaudīt URL joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>

Es tās nobloķēju!

☝️ Vari pārbaudīt URL joslu, lai redzētu, kas tevi mēģina izsekot, kad tu apmeklē jaunu vietni.️]]>

Aiziet! Turpini pārlūkot!]]>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 87838beba284..fe47f750b3e1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -469,7 +469,7 @@ %1$doutros estavam a tentar rastreá-lo aqui.

Eu bloqueei-os!

☝️Pode verificar a barra de endereços para ver quem está a tentar rastreá-lo quando visita um novo site.]]>
-
Eu bloqueei-os!

☝️Pode verificar a barra de endereços para ver quem está a tentar rastreá-lo quando visita um novo site.]]>
+
Eu bloqueei-os!

☝️Pode verificar a barra de endereços para ver quem está a tentar rastreá-lo quando visita um novo site.]]>

Eu bloqueei-os!

☝️Pode verificar a barra de endereços para ver quem está a tentar rastreá-lo quando visita um novo site.]]>

Prossiga - continue a navegar!]]>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 966b94fa17da..8b1bb10653b0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -471,7 +471,7 @@ еще %1$d сервиса пытались вести за вами слежку.

Но мы их заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>
-
Но мы его заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>
+
Но мы его заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>

Но мы их заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>

Но мы их заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>

Но мы их заблокировали!

☝️ Заходя на новый сайт, вы всегда можете проверить, шпионит ли он за вами: просто загляните в адресную строку.]]>
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 95a031af6977..d582848e8552 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -471,8 +471,8 @@ %1$d drugi so vas skušali zaslediti tukaj.

Blokiral sem jih!

☝️Preverite lahko naslovno vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.️]]>
-
Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>
-
Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>
+
Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>
+
Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>

Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>

Blokiral sem ga!

☝️Preverite lahko URL vrstico, da vidite, kdo vas poskuša zaslediti, ko obiščete novo spletišče.]]>
diff --git a/app/src/play/java/com/duckduckgo/app/di/PlayHttpsPersisterModule.kt b/app/src/play/java/com/duckduckgo/app/di/PlayHttpsPersisterModule.kt index eccfa5f08e41..100ace5fae3a 100644 --- a/app/src/play/java/com/duckduckgo/app/di/PlayHttpsPersisterModule.kt +++ b/app/src/play/java/com/duckduckgo/app/di/PlayHttpsPersisterModule.kt @@ -18,10 +18,11 @@ package com.duckduckgo.app.di import android.content.Context import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.store.HttpsBloomFilterSpecDao -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsEmbeddedDataPersister import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.impl.HttpsDataPersister +import com.duckduckgo.httpsupgrade.impl.di.HttpsPersisterModule +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpecDao import com.duckduckgo.httpsupgrade.store.PlayHttpsEmbeddedDataPersister import com.squareup.anvil.annotations.ContributesTo import com.squareup.moshi.Moshi diff --git a/app/src/play/java/com/duckduckgo/httpsupgrade/store/PlayHttpsEmbeddedDataPersister.kt b/app/src/play/java/com/duckduckgo/httpsupgrade/store/PlayHttpsEmbeddedDataPersister.kt index c95efc0a5afd..69db333385f2 100644 --- a/app/src/play/java/com/duckduckgo/httpsupgrade/store/PlayHttpsEmbeddedDataPersister.kt +++ b/app/src/play/java/com/duckduckgo/httpsupgrade/store/PlayHttpsEmbeddedDataPersister.kt @@ -3,11 +3,8 @@ package com.duckduckgo.httpsupgrade.store import android.content.Context import com.duckduckgo.app.browser.R import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain -import com.duckduckgo.app.httpsupgrade.store.HttpsBloomFilterSpecDao -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.impl.HttpsDataPersister import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types diff --git a/build.gradle b/build.gradle index 2adb6596e428..c7b1eaa117cb 100644 --- a/build.gradle +++ b/build.gradle @@ -3,17 +3,17 @@ buildscript { ext { - kotlin_version = '1.7.10' - spotless = "6.1.2" - anvil_version = "2.4.1" - gradle_plugin = "7.2.2" // When updating, also update lint_version - lint_version = "30.2.2" // This value must always be gradle_plugin + 23 + kotlin_version = '1.8.10' + spotless = '6.1.2' + anvil_version = '2.4.4' + gradle_plugin = '7.4.2' // When updating, also update lint_version + lint_version = '30.4.2' // This value must always be gradle_plugin + 23 min_sdk = 23 target_sdk = 33 compile_sdk = 33 - fladle_version = "0.17.4" - kotlinter_version = "3.12.0" - dokka_version = "1.8.20" + fladle_version = '0.17.4' + kotlinter_version = '3.12.0' + dokka_version = '1.8.20' } repositories { @@ -54,7 +54,7 @@ subprojects { apply plugin: 'org.jetbrains.dokka' } - String[] allowAndroidTestsIn = ["app", "sync-lib"] + String[] allowAndroidTestsIn = ["app", "sync-lib", "httpsupgrade-impl"] if (!allowAndroidTestsIn.contains(project.name)) { project.projectDir.eachFile(groovy.io.FileType.DIRECTORIES) { File parent -> if (parent.name == "src") { diff --git a/common-ui/src/main/res/drawable/ic_baseline_list_24.xml b/common-ui/src/main/res/drawable/ic_baseline_list_24.xml index dc7f9f9527ed..3ca9ad864095 100644 --- a/common-ui/src/main/res/drawable/ic_baseline_list_24.xml +++ b/common-ui/src/main/res/drawable/ic_baseline_list_24.xml @@ -19,7 +19,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="?attr/colorOnBackground"> + android:tint="?attr/colorOnBackground" android:autoMirrored="true"> + + + diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/BloomFilterTest.kt b/httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/BloomFilterTest.kt similarity index 78% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/BloomFilterTest.kt rename to httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/BloomFilterTest.kt index 56ccc8c9eee2..fd66332c7ad4 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/BloomFilterTest.kt +++ b/httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/BloomFilterTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,10 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade +package com.duckduckgo.httpsupgrade.impl import androidx.test.platform.app.InstrumentationRegistry +import com.duckduckgo.httpsupgrade.impl.BloomFilter.Config.ProbabilityConfig import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test @@ -28,13 +29,13 @@ class BloomFilterTest { @Test fun whenBloomFilterEmptyThenContainsIsFalse() { - testee = BloomFilter(context, BloomFilter.Config.ProbabilityConfig(FILTER_ELEMENT_COUNT, TARGET_ERROR_RATE)) + testee = BloomFilter(context, ProbabilityConfig(FILTER_ELEMENT_COUNT, TARGET_ERROR_RATE)) assertFalse(testee.contains("abc")) } @Test fun whenBloomFilterContainsElementThenContainsIsTrue() { - testee = BloomFilter(context, BloomFilter.Config.ProbabilityConfig(FILTER_ELEMENT_COUNT, TARGET_ERROR_RATE)) + testee = BloomFilter(context, ProbabilityConfig(FILTER_ELEMENT_COUNT, TARGET_ERROR_RATE)) testee.add("abc") assertTrue(testee.contains("abc")) } diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/HttpsUpgraderTest.kt b/httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgraderTest.kt similarity index 94% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/HttpsUpgraderTest.kt rename to httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgraderTest.kt index 3e7da426a4fc..653aabeed450 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/HttpsUpgraderTest.kt +++ b/httpsupgrade/httpsupgrade-impl/src/androidTest/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgraderTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,12 +14,13 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade +package com.duckduckgo.httpsupgrade.impl import android.net.Uri import androidx.test.platform.app.InstrumentationRegistry -import com.duckduckgo.app.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.privacy.config.api.Https import com.duckduckgo.privacy.config.api.PrivacyFeatureName import org.junit.Assert.assertFalse diff --git a/app/src/main/cpp/.editorconfig b/httpsupgrade/httpsupgrade-impl/src/main/cpp/.editorconfig similarity index 100% rename from app/src/main/cpp/.editorconfig rename to httpsupgrade/httpsupgrade-impl/src/main/cpp/.editorconfig diff --git a/app/src/main/cpp/third-party/bloom_cpp b/httpsupgrade/httpsupgrade-impl/src/main/cpp/bloom_cpp similarity index 100% rename from app/src/main/cpp/third-party/bloom_cpp rename to httpsupgrade/httpsupgrade-impl/src/main/cpp/bloom_cpp diff --git a/app/src/main/cpp/https-bloom-lib.cpp b/httpsupgrade/httpsupgrade-impl/src/main/cpp/https-bloom-lib.cpp similarity index 64% rename from app/src/main/cpp/https-bloom-lib.cpp rename to httpsupgrade/httpsupgrade-impl/src/main/cpp/https-bloom-lib.cpp index 7808d4f1343e..60e753ecd57a 100644 --- a/app/src/main/cpp/https-bloom-lib.cpp +++ b/httpsupgrade/httpsupgrade-impl/src/main/cpp/https-bloom-lib.cpp @@ -1,10 +1,10 @@ #include -#include "third-party/bloom_cpp/src/BloomFilter.hpp" +#include "bloom_cpp/src/BloomFilter.hpp" extern "C" JNIEXPORT long JNICALL -Java_com_duckduckgo_app_httpsupgrade_BloomFilter_createBloomFilter(JNIEnv *env, jobject, jint maxItems, jdouble targetProbability) { +Java_com_duckduckgo_httpsupgrade_impl_BloomFilter_createBloomFilter(JNIEnv *env, jobject, jint maxItems, jdouble targetProbability) { BloomFilter *filter = new BloomFilter(maxItems, targetProbability); return (long) filter; } @@ -13,7 +13,7 @@ Java_com_duckduckgo_app_httpsupgrade_BloomFilter_createBloomFilter(JNIEnv *env, extern "C" JNIEXPORT long JNICALL -Java_com_duckduckgo_app_httpsupgrade_BloomFilter_createBloomFilterFromFile(JNIEnv *env, jobject, jstring path, jint bits, jint maxItems) { +Java_com_duckduckgo_httpsupgrade_impl_BloomFilter_createBloomFilterFromFile(JNIEnv *env, jobject, jstring path, jint bits, jint maxItems) { jboolean isElementCopy; const char *pathChars = env->GetStringUTFChars(path, &isElementCopy); @@ -26,7 +26,7 @@ Java_com_duckduckgo_app_httpsupgrade_BloomFilter_createBloomFilterFromFile(JNIEn extern "C" JNIEXPORT void JNICALL -Java_com_duckduckgo_app_httpsupgrade_BloomFilter_releaseBloomFilter(JNIEnv *env, jobject, jlong pointer) { +Java_com_duckduckgo_httpsupgrade_impl_BloomFilter_releaseBloomFilter(JNIEnv *env, jobject, jlong pointer) { auto *filter = (BloomFilter *) pointer; delete filter; } @@ -34,7 +34,7 @@ Java_com_duckduckgo_app_httpsupgrade_BloomFilter_releaseBloomFilter(JNIEnv *env, extern "C" JNIEXPORT void JNICALL -Java_com_duckduckgo_app_httpsupgrade_BloomFilter_add(JNIEnv *env, jobject, jlong pointer, jstring element) { +Java_com_duckduckgo_httpsupgrade_impl_BloomFilter_add(JNIEnv *env, jobject, jlong pointer, jstring element) { jboolean isElementCopy; const char *elementChars = env->GetStringUTFChars(element, &isElementCopy); @@ -47,7 +47,7 @@ Java_com_duckduckgo_app_httpsupgrade_BloomFilter_add(JNIEnv *env, jobject, jlong extern "C" JNIEXPORT jboolean JNICALL -Java_com_duckduckgo_app_httpsupgrade_BloomFilter_contains(JNIEnv *env, jobject, jlong pointer, jstring element) { +Java_com_duckduckgo_httpsupgrade_impl_BloomFilter_contains(JNIEnv *env, jobject, jlong pointer, jstring element) { jboolean isElementCopy; const char *elementChars = env->GetStringUTFChars(element, &isElementCopy); diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/BloomFilter.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/BloomFilter.kt similarity index 82% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/BloomFilter.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/BloomFilter.kt index 4dc243f833be..0b91e155497e 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/BloomFilter.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/BloomFilter.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,11 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade +package com.duckduckgo.httpsupgrade.impl import android.content.Context +import com.duckduckgo.httpsupgrade.impl.BloomFilter.Config.PathConfig +import com.duckduckgo.httpsupgrade.impl.BloomFilter.Config.ProbabilityConfig import com.duckduckgo.library.loader.LibraryLoader class BloomFilter constructor(context: Context, private val config: Config) { @@ -26,8 +28,8 @@ class BloomFilter constructor(context: Context, private val config: Config) { LibraryLoader.loadLibrary(context, "https-bloom-lib") nativePointer = when (config) { - is Config.PathConfig -> createBloomFilterFromFile(config.path, config.bits, config.maxItems) - is Config.ProbabilityConfig -> createBloomFilter(config.maxItems, config.targetProbability) + is PathConfig -> createBloomFilterFromFile(config.path, config.bits, config.maxItems) + is ProbabilityConfig -> createBloomFilter(config.maxItems, config.targetProbability) } } diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsBloomFilterFactory.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterFactory.kt similarity index 59% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsBloomFilterFactory.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterFactory.kt index 65b79e8e171c..ca1b4ef88ac6 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsBloomFilterFactory.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterFactory.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,28 +14,26 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade +package com.duckduckgo.httpsupgrade.impl import android.content.Context import androidx.annotation.WorkerThread import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec.Companion.HTTPS_BINARY_FILE -import com.duckduckgo.app.httpsupgrade.store.HttpsBloomFilterSpecDao -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsEmbeddedDataPersister -import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.di.scopes.AppScope -import com.squareup.anvil.annotations.ContributesBinding -import javax.inject.Inject -import timber.log.Timber +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.impl.BloomFilter.Config.PathConfig +import com.duckduckgo.httpsupgrade.impl.HttpsUpgradePixelName.CREATE_BLOOM_FILTER_ERROR +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec.Companion.HTTPS_BINARY_FILE +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpecDao +import logcat.LogPriority.ERROR +import logcat.asLog +import logcat.logcat interface HttpsBloomFilterFactory { fun create(): BloomFilter? } -@ContributesBinding(AppScope::class) -class HttpsBloomFilterFactoryImpl @Inject constructor( +class HttpsBloomFilterFactoryImpl constructor( private val dao: HttpsBloomFilterSpecDao, private val binaryDataStore: BinaryDataStore, private val httpsEmbeddedDataPersister: HttpsEmbeddedDataPersister, @@ -47,27 +45,27 @@ class HttpsBloomFilterFactoryImpl @Inject constructor( @WorkerThread override fun create(): BloomFilter? { if (httpsEmbeddedDataPersister.shouldPersistEmbeddedData()) { - Timber.d("Https update data not found, loading embedded data") + logcat { "Https update data not found, loading embedded data" } httpsEmbeddedDataPersister.persistEmbeddedData() } val specification = dao.get() val dataPath = binaryDataStore.dataFilePath(HTTPS_BINARY_FILE) if (dataPath == null || specification == null || !httpsDataPersister.isPersisted(specification)) { - Timber.d("Https update data not available") + logcat { "Https update data not available" } return null } val initialTimestamp = System.currentTimeMillis() - Timber.d("Found https data at $dataPath, building filter") + logcat { "Found https data at $dataPath, building filter" } val bloomFilter = try { - BloomFilter(context, BloomFilter.Config.PathConfig(path = dataPath, bits = specification.bitCount, maxItems = specification.totalEntries)) + BloomFilter(context, PathConfig(path = dataPath, bits = specification.bitCount, maxItems = specification.totalEntries)) } catch (t: Throwable) { - Timber.e(t, "Error creating the bloom filter") - pixel.fire(AppPixelName.CREATE_BLOOM_FILTER_ERROR) + logcat(ERROR) { "Error creating the bloom filter, ${t.asLog()}" } + pixel.fire(CREATE_BLOOM_FILTER_ERROR) null } - Timber.v("Loading took ${System.currentTimeMillis() - initialTimestamp}ms") + logcat { "Loading took ${System.currentTimeMillis() - initialTimestamp}ms" } return bloomFilter } diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsDataPersister.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsDataPersister.kt similarity index 74% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsDataPersister.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsDataPersister.kt index 8537a7c1cf5f..f8f38a9a30a3 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsDataPersister.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsDataPersister.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,21 +14,22 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.impl -import com.duckduckgo.app.global.db.AppDatabase import com.duckduckgo.app.global.store.BinaryDataStore -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpecDao +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositiveDomain +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao +import com.duckduckgo.httpsupgrade.store.HttpsUpgradeDatabase import java.io.IOException -import javax.inject.Inject -import timber.log.Timber +import logcat.logcat -class HttpsDataPersister @Inject constructor( +class HttpsDataPersister constructor( private val binaryDataStore: BinaryDataStore, private val httpsBloomSpecDao: HttpsBloomFilterSpecDao, private val httpsFalsePositivesDao: HttpsFalsePositivesDao, - private val appDatabase: AppDatabase, + private val httpsUpgradeDatabase: HttpsUpgradeDatabase, ) { fun persistBloomFilter( @@ -36,7 +37,7 @@ class HttpsDataPersister @Inject constructor( bytes: ByteArray, falsePositives: List, ) { - appDatabase.runInTransaction { + httpsUpgradeDatabase.runInTransaction { persistBloomFilter(specification, bytes) persistFalsePositives(falsePositives) } @@ -50,8 +51,8 @@ class HttpsDataPersister @Inject constructor( throw IOException("Https binary has incorrect sha, throwing away file") } - Timber.d("Updating https bloom data store with new data") - appDatabase.runInTransaction { + logcat { "Updating https bloom data store with new data" } + httpsUpgradeDatabase.runInTransaction { httpsBloomSpecDao.insert(specification) binaryDataStore.saveData(HttpsBloomFilterSpec.HTTPS_BINARY_FILE, bytes) } diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsEmbeddedDataPersister.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsEmbeddedDataPersister.kt similarity index 61% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsEmbeddedDataPersister.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsEmbeddedDataPersister.kt index 63c638be5188..31c99d9b08d4 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsEmbeddedDataPersister.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsEmbeddedDataPersister.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,25 +14,19 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.impl -import timber.log.Timber +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import logcat.logcat -interface HttpsEmbeddedDataPersister { - - fun shouldPersistEmbeddedData(): Boolean - - fun persistEmbeddedData() -} - -class EmptyHttpsEmbeddedDataPersister : HttpsEmbeddedDataPersister { +internal class EmptyHttpsEmbeddedDataPersister : HttpsEmbeddedDataPersister { override fun shouldPersistEmbeddedData(): Boolean { - Timber.d("Ignoring, empty persister does not use embedded data") + logcat { "Ignoring, empty persister does not use embedded data" } return false } override fun persistEmbeddedData() { - Timber.d("Ignoring, empty persister does not use embedded data") + logcat { "Ignoring, empty persister does not use embedded data" } } } diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonAdapter.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonAdapter.kt similarity index 84% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonAdapter.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonAdapter.kt index 59bc7ad0458f..a057b5a99ffb 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonAdapter.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonAdapter.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.api +package com.duckduckgo.httpsupgrade.impl -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositiveDomain import com.squareup.moshi.FromJson class HttpsFalsePositivesJsonAdapter { diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeDataDownloader.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeDataDownloaderImpl.kt similarity index 72% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeDataDownloader.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeDataDownloaderImpl.kt index bd6283845e67..1df24bda76d5 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeDataDownloader.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeDataDownloaderImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,27 +14,26 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.api +package com.duckduckgo.httpsupgrade.impl -import com.duckduckgo.app.global.api.isCached -import com.duckduckgo.app.httpsupgrade.HttpsUpgrader -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.store.HttpsDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsFalsePositivesDao +import com.duckduckgo.app.global.extensions.isCached +import com.duckduckgo.httpsupgrade.api.HttpsUpgradeDataDownloader +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao import io.reactivex.Completable import io.reactivex.Completable.fromAction import java.io.IOException -import javax.inject.Inject -import timber.log.Timber +import logcat.logcat -class HttpsUpgradeDataDownloader @Inject constructor( +internal class HttpsUpgradeDataDownloaderImpl constructor( private val service: HttpsUpgradeService, private val httpsUpgrader: HttpsUpgrader, private val dataPersister: HttpsDataPersister, private val bloomFalsePositivesDao: HttpsFalsePositivesDao, -) { +) : HttpsUpgradeDataDownloader { - fun download(): Completable { + override fun download(): Completable { val filter = service.httpsBloomFilterSpec() .flatMapCompletable { downloadBloomFilter(it) @@ -43,16 +42,16 @@ class HttpsUpgradeDataDownloader @Inject constructor( return Completable.mergeDelayError(listOf(filter, falsePositives)) .doOnComplete { - Timber.i("Https download task completed successfully") + logcat { "Https download task completed successfully" } } } private fun downloadBloomFilter(specification: HttpsBloomFilterSpec): Completable { return fromAction { - Timber.d("Downloading https bloom filter binary") + logcat { "Downloading https bloom filter binary" } if (dataPersister.isPersisted(specification)) { - Timber.d("Https bloom data already stored for this spec") + logcat { "Https bloom data already stored for this spec" } return@fromAction } @@ -69,19 +68,19 @@ class HttpsUpgradeDataDownloader @Inject constructor( } private fun downloadFalsePositives(): Completable { - Timber.d("Downloading HTTPS false positives") + logcat { "Downloading HTTPS false positives" } return fromAction { val call = service.falsePositives() val response = call.execute() if (response.isCached && bloomFalsePositivesDao.count() > 0) { - Timber.d("Https false positives already cached and stored") + logcat { "Https false positives already cached and stored" } return@fromAction } if (response.isSuccessful) { val falsePositives = response.body()!! - Timber.d("Updating https false positives with new data") + logcat { "Updating https false positives with new data" } dataPersister.persistFalsePositives(falsePositives) } else { throw IOException("Status: ${response.code()} - ${response.errorBody()?.string()}") diff --git a/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradePixelName.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradePixelName.kt new file mode 100644 index 000000000000..2f2e18b74590 --- /dev/null +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradePixelName.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2023 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.httpsupgrade.impl + +import com.duckduckgo.app.statistics.pixels.Pixel + +internal enum class HttpsUpgradePixelName(override val pixelName: String) : Pixel.PixelName { + CREATE_BLOOM_FILTER_ERROR("m_create_bloom_filter_error"), +} diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeService.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeService.kt similarity index 85% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeService.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeService.kt index 98fa768fc485..57f85a1e664e 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeService.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgradeService.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.api +package com.duckduckgo.httpsupgrade.impl import com.duckduckgo.anvil.annotations.ContributesServiceApi -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositiveDomain import io.reactivex.Observable import okhttp3.ResponseBody import retrofit2.Call diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsUpgrader.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgrader.kt similarity index 81% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsUpgrader.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgrader.kt index 057af42fd9b1..0c55eb68a040 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/HttpsUpgrader.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/HttpsUpgrader.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,17 +14,18 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade +package com.duckduckgo.httpsupgrade.impl import android.net.Uri import androidx.annotation.WorkerThread import androidx.lifecycle.LifecycleOwner import com.duckduckgo.app.global.isHttps import com.duckduckgo.app.global.toHttps -import com.duckduckgo.app.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver import com.duckduckgo.di.scopes.AppScope import com.duckduckgo.feature.toggles.api.FeatureToggle +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao import com.duckduckgo.privacy.config.api.Https import com.duckduckgo.privacy.config.api.PrivacyFeatureName import com.squareup.anvil.annotations.ContributesBinding @@ -33,20 +34,7 @@ import dagger.SingleInstanceIn import java.util.concurrent.locks.ReentrantLock import javax.inject.Inject import kotlin.concurrent.thread -import timber.log.Timber - -interface HttpsUpgrader { - - @WorkerThread - fun shouldUpgrade(uri: Uri): Boolean - - fun upgrade(uri: Uri): Uri { - return uri.toHttps - } - - @WorkerThread - fun reloadData() -} +import logcat.logcat @SingleInstanceIn(AppScope::class) @ContributesBinding( @@ -76,7 +64,7 @@ class HttpsUpgraderImpl @Inject constructor( val host = uri.host ?: return false if (!toggle.isFeatureEnabled(PrivacyFeatureName.HttpsFeatureName.value)) { - Timber.d("https is disabled in the remote config and so $host is not upgradable") + logcat { "https is disabled in the remote config and so $host is not upgradable" } return false } @@ -85,20 +73,22 @@ class HttpsUpgraderImpl @Inject constructor( } if (https.isAnException(uri.toString())) { - Timber.d("$host is in the exception list and so not upgradable") + logcat { "$host is in the exception list and so not upgradable" } return false } if (bloomFalsePositiveDao.contains(host)) { - Timber.d("$host is in https whitelist and so not upgradable") + logcat { "$host is in https whitelist and so not upgradable" } return false } val isUpgradable = isInUpgradeList(host) - Timber.d("$host ${if (isUpgradable) "is" else "is not"} upgradable") + logcat { "$host ${if (isUpgradable) "is" else "is not"} upgradable" } return isUpgradable } + override fun upgrade(uri: Uri): Uri = uri.toHttps + @WorkerThread private fun isInUpgradeList(host: String): Boolean { waitForAnyReloadsToComplete() @@ -107,7 +97,7 @@ class HttpsUpgraderImpl @Inject constructor( @WorkerThread override fun reloadData() { - Timber.v("Reload Https upgrader data") + logcat { "Reload Https upgrader data" } bloomReloadLock.lock() try { bloomFilter = bloomFactory.create() diff --git a/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsModule.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsModule.kt new file mode 100644 index 000000000000..01dcf2599927 --- /dev/null +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsModule.kt @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2023 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.httpsupgrade.impl.di + +import android.content.Context +import androidx.room.Room +import com.duckduckgo.app.global.store.BinaryDataStore +import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.api.HttpsUpgradeDataDownloader +import com.duckduckgo.httpsupgrade.api.HttpsUpgrader +import com.duckduckgo.httpsupgrade.impl.HttpsBloomFilterFactory +import com.duckduckgo.httpsupgrade.impl.HttpsBloomFilterFactoryImpl +import com.duckduckgo.httpsupgrade.impl.HttpsDataPersister +import com.duckduckgo.httpsupgrade.impl.HttpsUpgradeDataDownloaderImpl +import com.duckduckgo.httpsupgrade.impl.HttpsUpgradeService +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpecDao +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositivesDao +import com.duckduckgo.httpsupgrade.store.HttpsUpgradeDatabase +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.SingleInstanceIn + +@Module +@ContributesTo(AppScope::class) +object HttpsModule { + + @Provides + @SingleInstanceIn(AppScope::class) + fun provideAppDatabase( + context: Context, + ): HttpsUpgradeDatabase { + return Room.databaseBuilder(context, HttpsUpgradeDatabase::class.java, "httpsupgrade.db") + .addMigrations(*HttpsUpgradeDatabase.ALL_MIGRATIONS.toTypedArray()) + .fallbackToDestructiveMigration() + .build() + } + + @Provides + fun providesHttpsFalsePositivesDao(database: HttpsUpgradeDatabase): HttpsFalsePositivesDao = database.httpsFalsePositivesDao() + + @Provides + fun provideHttpsBloomFilterSpecDao(database: HttpsUpgradeDatabase): HttpsBloomFilterSpecDao = database.httpsBloomFilterSpecDao() + + @Provides + @SingleInstanceIn(AppScope::class) + fun provideHttpsBloomFilterFactory( + dao: HttpsBloomFilterSpecDao, + binaryDataStore: BinaryDataStore, + httpsEmbeddedDataPersister: HttpsEmbeddedDataPersister, + httpsDataPersister: HttpsDataPersister, + pixel: Pixel, + context: Context, + ): HttpsBloomFilterFactory { + return HttpsBloomFilterFactoryImpl(dao, binaryDataStore, httpsEmbeddedDataPersister, httpsDataPersister, pixel, context) + } + + @Provides + @SingleInstanceIn(AppScope::class) + fun provideHttpsUpgradeDataDownloader( + service: HttpsUpgradeService, + httpsUpgrader: HttpsUpgrader, + dataPersister: HttpsDataPersister, + bloomFalsePositivesDao: HttpsFalsePositivesDao, + ): HttpsUpgradeDataDownloader { + return HttpsUpgradeDataDownloaderImpl(service, httpsUpgrader, dataPersister, bloomFalsePositivesDao) + } + + @Provides + fun provideHttpsDataPersister( + binaryDataStore: BinaryDataStore, + httpsBloomSpecDao: HttpsBloomFilterSpecDao, + httpsFalsePositivesDao: HttpsFalsePositivesDao, + httpsUpgradeDatabase: HttpsUpgradeDatabase, + ): HttpsDataPersister { + return HttpsDataPersister(binaryDataStore, httpsBloomSpecDao, httpsFalsePositivesDao, httpsUpgradeDatabase) + } +} diff --git a/app/src/main/java/com/duckduckgo/app/di/HttpsPersisterModule.kt b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsPersisterModule.kt similarity index 81% rename from app/src/main/java/com/duckduckgo/app/di/HttpsPersisterModule.kt rename to httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsPersisterModule.kt index 78747ff1b50d..cbf0e391bda1 100644 --- a/app/src/main/java/com/duckduckgo/app/di/HttpsPersisterModule.kt +++ b/httpsupgrade/httpsupgrade-impl/src/main/java/com/duckduckgo/httpsupgrade/impl/di/HttpsPersisterModule.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.duckduckgo.app.di +package com.duckduckgo.httpsupgrade.impl.di -import com.duckduckgo.app.httpsupgrade.store.EmptyHttpsEmbeddedDataPersister -import com.duckduckgo.app.httpsupgrade.store.HttpsEmbeddedDataPersister import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister +import com.duckduckgo.httpsupgrade.impl.EmptyHttpsEmbeddedDataPersister import com.squareup.anvil.annotations.ContributesTo import dagger.Module import dagger.Provides diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsBloomFilterSpecJsonTest.kt b/httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterSpecJsonTest.kt similarity index 90% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsBloomFilterSpecJsonTest.kt rename to httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterSpecJsonTest.kt index c1eb7bc2f13e..1eef0d9d07eb 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsBloomFilterSpecJsonTest.kt +++ b/httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsBloomFilterSpecJsonTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.api +package com.duckduckgo.httpsupgrade.impl -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec +import com.duckduckgo.httpsupgrade.store.HttpsBloomFilterSpec import com.squareup.moshi.Moshi import org.junit.Assert.assertEquals import org.junit.Test diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonTest.kt b/httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonTest.kt similarity index 91% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonTest.kt rename to httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonTest.kt index 943227aba356..373abc7b9e77 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsFalsePositivesJsonTest.kt +++ b/httpsupgrade/httpsupgrade-impl/src/test/java/com/duckduckgo/httpsupgrade/impl/HttpsFalsePositivesJsonTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.api +package com.duckduckgo.httpsupgrade.impl -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain +import com.duckduckgo.httpsupgrade.store.HttpsFalsePositiveDomain import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types diff --git a/httpsupgrade/httpsupgrade-store/build.gradle b/httpsupgrade/httpsupgrade-store/build.gradle new file mode 100644 index 000000000000..d1a01c643927 --- /dev/null +++ b/httpsupgrade/httpsupgrade-store/build.gradle @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023 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' +} + +apply from: "$rootProject.projectDir/gradle/android-library.gradle" + +dependencies { + implementation project(path: ':common') + implementation project(path: ':di') + + implementation AndroidX.core.ktx + + // Room + implementation AndroidX.room.runtime + implementation AndroidX.room.ktx + implementation Square.retrofit2.converter.moshi + kapt AndroidX.room.compiler + testImplementation AndroidX.room.testing + + testImplementation project(path: ':common-test') + testImplementation Testing.junit4 + testImplementation AndroidX.test.ext.junit + testImplementation AndroidX.archCore.testing + testImplementation "org.mockito.kotlin:mockito-kotlin:_" + testImplementation Testing.robolectric +} + +android { + namespace 'com.duckduckgo.httpsupgrade.store' +} \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsBloomFilterSpec.kt b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpec.kt similarity index 95% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsBloomFilterSpec.kt rename to httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpec.kt index 3a55da937431..b603df81b84b 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsBloomFilterSpec.kt +++ b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpec.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.model +package com.duckduckgo.httpsupgrade.store import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDao.kt b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDao.kt similarity index 78% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDao.kt rename to httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDao.kt index ac061e8b5284..10ab553bf0fd 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDao.kt +++ b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,18 +14,14 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.store import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec -import com.duckduckgo.di.scopes.AppScope -import dagger.SingleInstanceIn @Dao -@SingleInstanceIn(AppScope::class) interface HttpsBloomFilterSpecDao { @Insert(onConflict = OnConflictStrategy.REPLACE) diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsFalsePositiveDomain.kt b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositiveDomain.kt similarity index 94% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsFalsePositiveDomain.kt rename to httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositiveDomain.kt index 4e190a057d0f..b6a2b523d230 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/model/HttpsFalsePositiveDomain.kt +++ b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositiveDomain.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.model +package com.duckduckgo.httpsupgrade.store import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDao.kt b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDao.kt similarity index 82% rename from app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDao.kt rename to httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDao.kt index 0c1b6fa0f09d..06cb7524582d 100644 --- a/app/src/main/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDao.kt +++ b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,15 +14,11 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.store import androidx.room.* -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain -import com.duckduckgo.di.scopes.AppScope -import dagger.SingleInstanceIn @Dao -@SingleInstanceIn(AppScope::class) abstract class HttpsFalsePositivesDao { @Insert(onConflict = OnConflictStrategy.REPLACE) diff --git a/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsUpgradeDatabase.kt b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsUpgradeDatabase.kt new file mode 100644 index 000000000000..dddeb5c257ed --- /dev/null +++ b/httpsupgrade/httpsupgrade-store/src/main/java/com/duckduckgo/httpsupgrade/store/HttpsUpgradeDatabase.kt @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 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.httpsupgrade.store + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.migration.Migration + +@Database( + exportSchema = true, + version = 1, + entities = [ + HttpsBloomFilterSpec::class, + HttpsFalsePositiveDomain::class, + ], +) +abstract class HttpsUpgradeDatabase : RoomDatabase() { + abstract fun httpsBloomFilterSpecDao(): HttpsBloomFilterSpecDao + abstract fun httpsFalsePositivesDao(): HttpsFalsePositivesDao + + companion object { + val ALL_MIGRATIONS: List + get() = emptyList() + } +} diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt b/httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt similarity index 64% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt rename to httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt index a83d77152a78..95b84b1bf5ea 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt +++ b/httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsBloomFilterSpecDaoTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,25 +14,41 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.store +import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.room.Room +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.duckduckgo.app.global.db.AppDatabase -import com.duckduckgo.app.httpsupgrade.model.HttpsBloomFilterSpec +import com.duckduckgo.app.CoroutineTestRule +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.* import org.junit.Before +import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith +@ExperimentalCoroutinesApi +@RunWith(AndroidJUnit4::class) class HttpsBloomFilterSpecDaoTest { - private lateinit var db: AppDatabase + @get:Rule + @Suppress("unused") + var instantTaskExecutorRule = InstantTaskExecutorRule() + + @get:Rule + var coroutinesTestRule = CoroutineTestRule() + + private lateinit var db: HttpsUpgradeDatabase private lateinit var dao: HttpsBloomFilterSpecDao @Before fun before() { - db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, AppDatabase::class.java).build() + db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, HttpsUpgradeDatabase::class.java) + .allowMainThreadQueries() + .build() dao = db.httpsBloomFilterSpecDao() } @@ -42,25 +58,25 @@ class HttpsBloomFilterSpecDaoTest { } @Test - fun whenModelIsEmptyThenGetIsNull() { + fun whenModelIsEmptyThenGetIsNull() = runTest { assertNull(dao.get()) } @Test - fun whenModelIsInsertedThenGetIsNotNull() { + fun whenModelIsInsertedThenGetIsNotNull() = runTest { dao.insert(HttpsBloomFilterSpec(errorRate = 0.1, bitCount = 1000, totalEntries = 55, sha256 = "abc")) assertNotNull(dao.get()) } @Test - fun whenNewModelIsInsertedThenGetIsNotNullAndDetailsUpdates() { + fun whenNewModelIsInsertedThenGetIsNotNullAndDetailsUpdates() = runTest { dao.insert(HttpsBloomFilterSpec(bitCount = 1000, errorRate = 0.1, totalEntries = 55, sha256 = "abc")) dao.insert(HttpsBloomFilterSpec(bitCount = 2000, errorRate = 0.2, totalEntries = 60, sha256 = "xyz")) val specification = dao.get() assertNotNull(specification) assertEquals(2000, specification!!.bitCount) - assertEquals(0.2, specification!!.errorRate, 0.01) + assertEquals(0.2, specification.errorRate, 0.01) assertEquals(60, specification.totalEntries) assertEquals("xyz", specification.sha256) } diff --git a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt b/httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt similarity index 63% rename from app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt rename to httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt index 4e9fe480a59e..4a986d371914 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt +++ b/httpsupgrade/httpsupgrade-store/src/test/java/com/duckduckgo/httpsupgrade/store/HttpsFalsePositivesDaoTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 DuckDuckGo + * Copyright (c) 2023 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,25 +14,41 @@ * limitations under the License. */ -package com.duckduckgo.app.httpsupgrade.store +package com.duckduckgo.httpsupgrade.store +import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.room.Room +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.duckduckgo.app.global.db.AppDatabase -import com.duckduckgo.app.httpsupgrade.model.HttpsFalsePositiveDomain +import com.duckduckgo.app.CoroutineTestRule +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.* import org.junit.Before +import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith +@ExperimentalCoroutinesApi +@RunWith(AndroidJUnit4::class) class HttpsFalsePositivesDaoTest { - private lateinit var db: AppDatabase + @get:Rule + @Suppress("unused") + var instantTaskExecutorRule = InstantTaskExecutorRule() + + @get:Rule + var coroutinesTestRule = CoroutineTestRule() + + private lateinit var db: HttpsUpgradeDatabase private lateinit var dao: HttpsFalsePositivesDao @Before fun before() { - db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, AppDatabase::class.java).build() + db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getInstrumentation().targetContext, HttpsUpgradeDatabase::class.java) + .allowMainThreadQueries() + .build() dao = db.httpsFalsePositivesDao() } @@ -42,43 +58,43 @@ class HttpsFalsePositivesDaoTest { } @Test - fun whenModelIsEmptyThenCountIsZero() { + fun whenModelIsEmptyThenCountIsZero() = runTest { assertEquals(0, dao.count()) } @Test - fun whenModelIsEmptyThenContainsDomainIsFalse() { + fun whenModelIsEmptyThenContainsDomainIsFalse() = runTest { assertFalse(dao.contains(domain)) } @Test - fun whenDomainInsertedThenContainsDomainIsTrue() { + fun whenDomainInsertedThenContainsDomainIsTrue() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) assertTrue(dao.contains(domain)) } @Test - fun whenDomainInsertedThenCountIsOne() { + fun whenDomainInsertedThenCountIsOne() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) assertEquals(1, dao.count()) } @Test - fun whenSecondUniqueDomainInsertedThenCountIsTwo() { + fun whenSecondUniqueDomainInsertedThenCountIsTwo() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) dao.insertAll(listOf(HttpsFalsePositiveDomain(anotherDomain))) assertEquals(2, dao.count()) } @Test - fun whenSecondDuplicateDomainInsertedThenCountIsOne() { + fun whenSecondDuplicateDomainInsertedThenCountIsOne() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) assertEquals(1, dao.count()) } @Test - fun whenAllUpdatedThenPreviousValuesAreReplaced() { + fun whenAllUpdatedThenPreviousValuesAreReplaced() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) dao.updateAll(listOf(HttpsFalsePositiveDomain(anotherDomain))) assertEquals(1, dao.count()) @@ -86,7 +102,7 @@ class HttpsFalsePositivesDaoTest { } @Test - fun whenAllDeletedThenContainsDomainIsFalse() { + fun whenAllDeletedThenContainsDomainIsFalse() = runTest { dao.insertAll(listOf(HttpsFalsePositiveDomain(domain))) dao.deleteAll() assertFalse(dao.contains(domain)) diff --git a/lint-rules/build.gradle b/lint-rules/build.gradle index 3dce5e40b7eb..e9d01477ba18 100644 --- a/lint-rules/build.gradle +++ b/lint-rules/build.gradle @@ -28,8 +28,12 @@ dependencies { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } tasks.register('jvm_checks') { diff --git a/privacy-config/privacy-config-api/build.gradle b/privacy-config/privacy-config-api/build.gradle index 722d1a2442d2..1577323fa5ae 100644 --- a/privacy-config/privacy-config-api/build.gradle +++ b/privacy-config/privacy-config-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/remote-messaging/remote-messaging-api/build.gradle b/remote-messaging/remote-messaging-api/build.gradle index 02238fae27e3..1440f859f3d3 100644 --- a/remote-messaging/remote-messaging-api/build.gradle +++ b/remote-messaging/remote-messaging-api/build.gradle @@ -21,6 +21,15 @@ plugins { apply from: "$rootProject.projectDir/gradle/android-library.gradle" +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) +} + dependencies { implementation Kotlin.stdlib.jdk7 implementation KotlinX.coroutines.core diff --git a/saved-sites/saved-sites-api/build.gradle b/saved-sites/saved-sites-api/build.gradle index 6133f32c2c86..09d29e8ecd7b 100644 --- a/saved-sites/saved-sites-api/build.gradle +++ b/saved-sites/saved-sites-api/build.gradle @@ -23,8 +23,12 @@ plugins { apply from: "$rootProject.projectDir/gradle/android-library.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/site-permissions/site-permissions-api/build.gradle b/site-permissions/site-permissions-api/build.gradle index 6b0e227fcee4..bd49114e4041 100644 --- a/site-permissions/site-permissions-api/build.gradle +++ b/site-permissions/site-permissions-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/gradle/android-library.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/versions.properties b/versions.properties index bd343c7a12be..d0adbd3c3114 100644 --- a/versions.properties +++ b/versions.properties @@ -73,13 +73,13 @@ version.com.nhaarman.mockitokotlin2..mockito-kotlin=2.2.0 version.google.android.material=1.7.0 -version.google.dagger=2.44.2 +version.google.dagger=2.46.1 version.jakewharton.rxrelay2=2.0.0 version.jakewharton.timber=5.0.1 -version.kotlin=1.7.10 +version.kotlin=1.8.10 version.kotlinx.coroutines=1.6.4 diff --git a/vpn-network/vpn-network-api/build.gradle b/vpn-network/vpn-network-api/build.gradle index 87b4f6194104..1fbb5bf191d3 100644 --- a/vpn-network/vpn-network-api/build.gradle +++ b/vpn-network/vpn-network-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/code-formatting.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } dependencies { diff --git a/windows/windows-api/build.gradle b/windows/windows-api/build.gradle index f616ee8eed01..1fca14a32e71 100644 --- a/windows/windows-api/build.gradle +++ b/windows/windows-api/build.gradle @@ -22,8 +22,12 @@ plugins { apply from: "$rootProject.projectDir/gradle/android-library.gradle" java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } android {