Skip to content

Commit b1eec70

Browse files
committed
Merge branch 'release/5.212.0'
2 parents 02ca56c + 93904a2 commit b1eec70

File tree

190 files changed

+6666
-981
lines changed

Some content is hidden

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

190 files changed

+6666
-981
lines changed

ad-click/ad-click-impl/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ plugins {
1818
id 'com.android.library'
1919
id 'kotlin-android'
2020
id 'com.squareup.anvil'
21+
id 'com.google.devtools.ksp' version "$ksp_version"
2122
}
2223

2324
apply from: "$rootProject.projectDir/gradle/android-library.gradle"
@@ -43,7 +44,6 @@ dependencies {
4344
implementation project(path: ':privacy-config-api')
4445
implementation project(path: ':feature-toggles-api')
4546
implementation project(path: ':app-build-config-api')
46-
implementation project(path: ':ad-click-store')
4747

4848
implementation AndroidX.core.ktx
4949

@@ -65,6 +65,7 @@ dependencies {
6565
implementation AndroidX.room.runtime
6666
implementation AndroidX.room.rxJava2
6767
implementation AndroidX.room.ktx
68+
ksp AndroidX.room.compiler
6869
testImplementation AndroidX.room.testing
6970

7071
// Dagger

ad-click/ad-click-impl/src/main/java/com/duckduckgo/adclick/impl/AdClickAttributionPlugin.kt

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

ad-click/ad-click-impl/src/main/java/com/duckduckgo/adclick/impl/AdClickFeatureTogglesPlugin.kt

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

ad-click/ad-click-impl/src/main/java/com/duckduckgo/adclick/impl/RealAdClickAttribution.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717
package com.duckduckgo.adclick.impl
1818

1919
import android.net.Uri
20-
import com.duckduckgo.adclick.api.AdClickFeatureName
21-
import com.duckduckgo.adclick.store.AdClickAttributionLinkFormatEntity
22-
import com.duckduckgo.adclick.store.AdClickAttributionRepository
20+
import com.duckduckgo.adclick.impl.remoteconfig.AdClickAttributionFeature
21+
import com.duckduckgo.adclick.impl.remoteconfig.AdClickAttributionRepository
22+
import com.duckduckgo.adclick.impl.store.AdClickAttributionLinkFormatEntity
2323
import com.duckduckgo.app.browser.UriString
2424
import com.duckduckgo.di.scopes.AppScope
25-
import com.duckduckgo.feature.toggles.api.FeatureToggle
2625
import com.squareup.anvil.annotations.ContributesBinding
2726
import java.util.concurrent.TimeUnit
2827
import javax.inject.Inject
@@ -40,11 +39,11 @@ interface AdClickAttribution {
4039
@ContributesBinding(AppScope::class)
4140
class RealAdClickAttribution @Inject constructor(
4241
private val adClickAttributionRepository: AdClickAttributionRepository,
43-
private val featureToggle: FeatureToggle,
42+
private val adClickAttributionFeature: AdClickAttributionFeature,
4443
) : AdClickAttribution {
4544

4645
override fun isAllowed(url: String): Boolean {
47-
if (!featureToggle.isFeatureEnabled(AdClickFeatureName.AdClickAttributionFeatureName.value, true)) {
46+
if (!adClickAttributionFeature.self().isEnabled()) {
4847
return false
4948
}
5049
if (!isHeuristicDetectionEnabled() && !isDomainDetectionEnabled()) {
@@ -56,7 +55,7 @@ class RealAdClickAttribution @Inject constructor(
5655
override fun isAdClick(url: String): Pair<Boolean, String?> {
5756
val noMatch = Pair(false, null)
5857

59-
if (!featureToggle.isFeatureEnabled(AdClickFeatureName.AdClickAttributionFeatureName.value, true)) {
58+
if (!adClickAttributionFeature.self().isEnabled()) {
6059
return noMatch
6160
}
6261
if (!isHeuristicDetectionEnabled() && !isDomainDetectionEnabled()) {

ad-click/ad-click-impl/src/main/java/com/duckduckgo/adclick/impl/di/AdClickModule.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ package com.duckduckgo.adclick.impl.di
1818

1919
import android.content.Context
2020
import androidx.room.Room
21-
import com.duckduckgo.adclick.store.AdClickAttributionRepository
22-
import com.duckduckgo.adclick.store.AdClickDatabase
23-
import com.duckduckgo.adclick.store.AdClickDatabase.Companion.ALL_MIGRATIONS
24-
import com.duckduckgo.adclick.store.AdClickFeatureToggleRepository
25-
import com.duckduckgo.adclick.store.RealAdClickAttributionRepository
21+
import com.duckduckgo.adclick.impl.remoteconfig.AdClickAttributionRepository
22+
import com.duckduckgo.adclick.impl.remoteconfig.RealAdClickAttributionRepository
23+
import com.duckduckgo.adclick.impl.store.AdClickDatabase
24+
import com.duckduckgo.adclick.impl.store.AdClickDatabase.Companion.ALL_MIGRATIONS
2625
import com.duckduckgo.app.di.AppCoroutineScope
2726
import com.duckduckgo.app.di.IsMainProcess
2827
import com.duckduckgo.common.utils.DispatcherProvider
@@ -56,10 +55,4 @@ class AdClickModule {
5655
): AdClickAttributionRepository {
5756
return RealAdClickAttributionRepository(database, appCoroutineScope, dispatcherProvider, isMainProcess)
5857
}
59-
60-
@SingleInstanceIn(AppScope::class)
61-
@Provides
62-
fun provideAdClickFeatureToggleRepository(context: Context): AdClickFeatureToggleRepository {
63-
return AdClickFeatureToggleRepository.create(context)
64-
}
6558
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2024 DuckDuckGo
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.duckduckgo.adclick.impl.remoteconfig
18+
19+
import com.duckduckgo.anvil.annotations.ContributesRemoteFeature
20+
import com.duckduckgo.di.scopes.AppScope
21+
import com.duckduckgo.feature.toggles.api.Toggle
22+
23+
@ContributesRemoteFeature(
24+
scope = AppScope::class,
25+
featureName = "adClickAttribution",
26+
settingsStore = AdClickAttributionFeatureSettingsStore::class,
27+
)
28+
/**
29+
* This is the class that represents the adClickAttribution feature flags.
30+
*/
31+
interface AdClickAttributionFeature {
32+
/**
33+
* @return `true` when the remote config has the global "adClickAttribution" feature flag enabled
34+
* If the remote feature is not present defaults to `false`
35+
*/
36+
@Toggle.DefaultValue(false)
37+
fun self(): Toggle
38+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022 DuckDuckGo
2+
* Copyright (c) 2024 DuckDuckGo
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -14,32 +14,35 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.duckduckgo.adclick.impl
17+
package com.duckduckgo.adclick.impl.remoteconfig
1818

19-
import com.duckduckgo.feature.toggles.api.FeatureExceptions.FeatureException
19+
import com.squareup.moshi.Json
2020

21-
data class AdClickAttributionFeature(
22-
val state: String,
23-
val minSupportedVersion: Int?,
24-
val settings: AdClickAttributionSettings,
25-
val exceptions: List<FeatureException>,
26-
)
27-
28-
data class AdClickAttributionSettings(
21+
data class AdClickAttributionFeatureModel(
22+
@field:Json(name = "linkFormats")
2923
val linkFormats: List<AdClickAttributionLinkFormat>,
24+
@field:Json(name = "allowlist")
3025
val allowlist: List<AdClickAttributionAllowlist>,
26+
@field:Json(name = "navigationExpiration")
3127
val navigationExpiration: Long,
28+
@field:Json(name = "totalExpiration")
3229
val totalExpiration: Long,
30+
@field:Json(name = "heuristicDetection")
3331
val heuristicDetection: String?,
32+
@field:Json(name = "domainDetection")
3433
val domainDetection: String?,
3534
)
3635

3736
data class AdClickAttributionLinkFormat(
37+
@field:Json(name = "url")
3838
val url: String,
39+
@field:Json(name = "adDomainParameterName")
3940
val adDomainParameterName: String?,
4041
)
4142

4243
data class AdClickAttributionAllowlist(
44+
@field:Json(name = "blocklistEntry")
4345
val blocklistEntry: String?,
46+
@field:Json(name = "host")
4447
val host: String?,
4548
)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (c) 2024 DuckDuckGo
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.duckduckgo.adclick.impl.remoteconfig
18+
19+
import com.duckduckgo.di.scopes.AppScope
20+
import com.duckduckgo.feature.toggles.api.FeatureSettings
21+
import com.duckduckgo.feature.toggles.api.RemoteFeatureStoreNamed
22+
import com.squareup.anvil.annotations.ContributesBinding
23+
import com.squareup.moshi.JsonAdapter
24+
import com.squareup.moshi.Moshi
25+
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
26+
import javax.inject.Inject
27+
28+
@ContributesBinding(AppScope::class)
29+
@RemoteFeatureStoreNamed(AdClickAttributionFeature::class)
30+
class AdClickAttributionFeatureSettingsStore @Inject constructor(
31+
private val adClickAttributionRepository: AdClickAttributionRepository,
32+
) : FeatureSettings.Store {
33+
34+
private val jsonAdapter by lazy { buildJsonAdapter() }
35+
36+
override fun store(jsonString: String) {
37+
jsonAdapter.fromJson(jsonString)?.let {
38+
adClickAttributionRepository.updateAll(
39+
it.linkFormats,
40+
it.allowlist,
41+
it.navigationExpiration,
42+
it.totalExpiration,
43+
it.heuristicDetection,
44+
it.domainDetection,
45+
)
46+
}
47+
}
48+
49+
private fun buildJsonAdapter(): JsonAdapter<AdClickAttributionFeatureModel> {
50+
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
51+
return moshi.adapter(AdClickAttributionFeatureModel::class.java)
52+
}
53+
}

0 commit comments

Comments
 (0)