Skip to content

Commit 4dbeef2

Browse files
committed
Either show ad blocking settings or Duck Player ones (via RC)
1 parent f9b516e commit 4dbeef2

6 files changed

Lines changed: 143 additions & 38 deletions

File tree

ad-blocking/ad-blocking-impl/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependencies {
5656
implementation project(path: ':feature-toggles-api')
5757
implementation project(path: ':navigation-api')
5858
implementation project(path: ':settings-api')
59+
implementation project(path: ':statistics-api')
5960

6061
implementation Google.android.material
6162
implementation "com.squareup.logcat:logcat:_"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2026 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.adblocking.impl
18+
19+
object AdBlockingPixelNames {
20+
const val DUCK_PLAYER_SETTINGS_PRESSED = "duckplayer_setting_pressed"
21+
}

ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/ui/AdBlockingSettings.kt

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,24 @@ package com.duckduckgo.adblocking.impl.ui
1818

1919
import android.content.Context
2020
import android.view.View
21-
import com.duckduckgo.adblocking.impl.R
2221
import com.duckduckgo.adblocking.impl.domain.AdBlockingStatusChecker
2322
import com.duckduckgo.anvil.annotations.PriorityKey
24-
import com.duckduckgo.common.ui.view.listitem.OneLineListItem
2523
import com.duckduckgo.di.scopes.ActivityScope
26-
import com.duckduckgo.navigation.api.GlobalActivityStarter
2724
import com.duckduckgo.settings.api.AdBlockingSettingsPlugin
2825
import com.squareup.anvil.annotations.ContributesMultibinding
2926
import javax.inject.Inject
30-
import com.duckduckgo.mobile.android.R as CommonR
3127

3228
@ContributesMultibinding(ActivityScope::class)
3329
@PriorityKey(150)
3430
class AdBlockingSettingsEntry @Inject constructor(
35-
private val globalActivityStarter: GlobalActivityStarter,
3631
private val statusChecker: AdBlockingStatusChecker,
32+
private val adBlockingTileFactory: AdBlockingTileFactory,
33+
private val duckPlayerTileFactory: DuckPlayerTileFactory,
3734
) : AdBlockingSettingsPlugin {
3835

39-
override fun getView(context: Context): View {
40-
if (!statusChecker.isShownInSettings()) {
41-
return View(context).apply { visibility = View.GONE }
42-
}
43-
return OneLineListItem(context).apply {
44-
setLeadingIconResource(CommonR.drawable.ic_video_player_color_24)
45-
setPrimaryText(context.getString(R.string.ad_blocking_settings_title))
46-
setOnClickListener {
47-
globalActivityStarter.start(this.context, AdBlockingSettingsNoParams, null)
48-
}
49-
}
36+
override fun getView(context: Context): View = if (statusChecker.isShownInSettings()) {
37+
adBlockingTileFactory.getView(context)
38+
} else {
39+
duckPlayerTileFactory.getView(context)
5040
}
5141
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright (c) 2026 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.adblocking.impl.ui
18+
19+
import android.content.Context
20+
import android.view.View
21+
import com.duckduckgo.adblocking.impl.R
22+
import com.duckduckgo.common.ui.view.listitem.OneLineListItem
23+
import com.duckduckgo.navigation.api.GlobalActivityStarter
24+
import javax.inject.Inject
25+
import com.duckduckgo.mobile.android.R as CommonR
26+
27+
class AdBlockingTileFactory @Inject constructor(
28+
private val globalActivityStarter: GlobalActivityStarter,
29+
) {
30+
fun getView(context: Context): View = OneLineListItem(context).apply {
31+
setLeadingIconResource(CommonR.drawable.ic_video_player_color_24)
32+
setPrimaryText(context.getString(R.string.ad_blocking_settings_title))
33+
setOnClickListener {
34+
globalActivityStarter.start(this.context, AdBlockingSettingsNoParams, null)
35+
}
36+
}
37+
}

duckplayer/duckplayer-impl/src/main/java/com/duckduckgo/duckplayer/impl/DuckPlayerSettings.kt renamed to ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/ui/DuckPlayerTileFactory.kt

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023 DuckDuckGo
2+
* Copyright (c) 2026 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,46 +14,41 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.duckduckgo.duckplayer.impl
17+
package com.duckduckgo.adblocking.impl.ui
1818

1919
import android.content.Context
2020
import android.view.View
21-
import com.duckduckgo.anvil.annotations.PriorityKey
21+
import com.duckduckgo.adblocking.impl.AdBlockingPixelNames
22+
import com.duckduckgo.adblocking.impl.R
2223
import com.duckduckgo.app.di.AppCoroutineScope
2324
import com.duckduckgo.app.statistics.pixels.Pixel
2425
import com.duckduckgo.common.ui.view.listitem.OneLineListItem
2526
import com.duckduckgo.common.utils.extensions.toBinaryString
26-
import com.duckduckgo.di.scopes.ActivityScope
2727
import com.duckduckgo.duckplayer.api.DuckPlayer
2828
import com.duckduckgo.duckplayer.api.DuckPlayerSettingsNoParams
29-
import com.duckduckgo.duckplayer.impl.DuckPlayerPixelName.DUCK_PLAYER_SETTINGS_PRESSED
3029
import com.duckduckgo.navigation.api.GlobalActivityStarter
31-
import com.duckduckgo.settings.api.DuckPlayerSettingsPlugin
32-
import com.squareup.anvil.annotations.ContributesMultibinding
3330
import kotlinx.coroutines.CoroutineScope
3431
import kotlinx.coroutines.launch
3532
import javax.inject.Inject
3633
import com.duckduckgo.mobile.android.R as CommonR
3734

38-
@ContributesMultibinding(ActivityScope::class)
39-
@PriorityKey(100)
40-
class DuckPlayerSettingsTitle @Inject constructor(
35+
class DuckPlayerTileFactory @Inject constructor(
4136
private val globalActivityStarter: GlobalActivityStarter,
4237
private val pixel: Pixel,
4338
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
4439
private val duckPlayer: DuckPlayer,
45-
) : DuckPlayerSettingsPlugin {
46-
override fun getView(context: Context): View {
47-
return OneLineListItem(context).apply {
48-
setLeadingIconResource(CommonR.drawable.ic_video_player_color_24)
49-
50-
setPrimaryText(context.getString(R.string.duck_player_setting_title))
51-
setOnClickListener {
52-
globalActivityStarter.start(this.context, DuckPlayerSettingsNoParams, null)
53-
appCoroutineScope.launch {
54-
val wasUsedBefore = duckPlayer.wasUsedBefore()
55-
pixel.fire(DUCK_PLAYER_SETTINGS_PRESSED, parameters = mapOf("was_used_before" to wasUsedBefore.toBinaryString()))
56-
}
40+
) {
41+
fun getView(context: Context): View = OneLineListItem(context).apply {
42+
setLeadingIconResource(CommonR.drawable.ic_video_player_color_24)
43+
setPrimaryText(context.getString(R.string.ad_blocking_settings_duck_player_header))
44+
setOnClickListener {
45+
globalActivityStarter.start(this.context, DuckPlayerSettingsNoParams, null)
46+
appCoroutineScope.launch {
47+
val wasUsedBefore = duckPlayer.wasUsedBefore()
48+
pixel.fire(
49+
AdBlockingPixelNames.DUCK_PLAYER_SETTINGS_PRESSED,
50+
parameters = mapOf("was_used_before" to wasUsedBefore.toBinaryString()),
51+
)
5752
}
5853
}
5954
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2026 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.adblocking.impl.ui
18+
19+
import android.content.Context
20+
import com.duckduckgo.adblocking.impl.domain.AdBlockingStatusChecker
21+
import org.junit.Test
22+
import org.mockito.kotlin.any
23+
import org.mockito.kotlin.doReturn
24+
import org.mockito.kotlin.mock
25+
import org.mockito.kotlin.never
26+
import org.mockito.kotlin.verify
27+
import org.mockito.kotlin.whenever
28+
29+
class AdBlockingSettingsEntryTest {
30+
31+
private val statusChecker: AdBlockingStatusChecker = mock()
32+
private val adBlockingTileFactory: AdBlockingTileFactory = mock()
33+
private val duckPlayerTileFactory: DuckPlayerTileFactory = mock()
34+
private val context: Context = mock()
35+
36+
private val entry = AdBlockingSettingsEntry(
37+
statusChecker = statusChecker,
38+
adBlockingTileFactory = adBlockingTileFactory,
39+
duckPlayerTileFactory = duckPlayerTileFactory,
40+
)
41+
42+
@Test
43+
fun whenAdBlockingShownInSettingsThenAdBlockingTileIsReturned() {
44+
whenever(statusChecker.isShownInSettings()) doReturn true
45+
46+
entry.getView(context)
47+
48+
verify(adBlockingTileFactory).getView(context)
49+
verify(duckPlayerTileFactory, never()).getView(any())
50+
}
51+
52+
@Test
53+
fun whenAdBlockingNotShownInSettingsThenDuckPlayerTileIsReturned() {
54+
whenever(statusChecker.isShownInSettings()) doReturn false
55+
56+
entry.getView(context)
57+
58+
verify(duckPlayerTileFactory).getView(context)
59+
verify(adBlockingTileFactory, never()).getView(any())
60+
}
61+
}

0 commit comments

Comments
 (0)