Skip to content

Commit 8ae0bda

Browse files
authored
Major tracker networks summary
1 parent f8b7255 commit 8ae0bda

23 files changed

+175
-73
lines changed

app/src/androidTest/java/com/duckduckgo/app/privacydashboard/PrivacyDashboardViewModelTest.kt

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,31 @@ class PrivacyDashboardViewModelTest {
8282
}
8383

8484
@Test
85-
fun whenNoTrackersNetworksThenTrackerNetworkTextShowsZero() {
86-
whenever(monitor.trackerNetworkCount).thenReturn(0)
85+
fun whenNoTrackersNetworksThenNetworkTextShowsZero() {
86+
whenever(monitor.networkCount).thenReturn(0)
8787
testee.updatePrivacyMonitor(monitor)
88-
assertEquals("0 Tracker Networks Blocked", testee.viewState.value?.trackerNetworksText)
88+
assertEquals("0 Tracker Networks Blocked", testee.viewState.value?.networksText)
8989
}
9090

9191
@Test
92-
fun whenTenTrackersNetworksThenTrackerNetworkTextShowsTen() {
93-
whenever(monitor.trackerNetworkCount).thenReturn(10)
92+
fun whenTenTrackersNetworksThenNetworkTextShowsTen() {
93+
whenever(monitor.networkCount).thenReturn(10)
9494
testee.updatePrivacyMonitor(monitor)
95-
assertEquals("10 Tracker Networks Blocked", testee.viewState.value?.trackerNetworksText)
95+
assertEquals("10 Tracker Networks Blocked", testee.viewState.value?.networksText)
96+
}
97+
98+
@Test
99+
fun whenNoMajorTrackersNetworksThenMajorNetworkTextShowsZero() {
100+
whenever(monitor.majorNetworkCount).thenReturn(0)
101+
testee.updatePrivacyMonitor(monitor)
102+
assertEquals("0 Major Tracker Networks Blocked", testee.viewState.value?.majorNetworksText)
103+
}
104+
105+
@Test
106+
fun whenTenMajorTrackersNetworksThenMajorNetworkTextShowsTen() {
107+
whenever(monitor.majorNetworkCount).thenReturn(10)
108+
testee.updatePrivacyMonitor(monitor)
109+
assertEquals("10 Major Tracker Networks Blocked", testee.viewState.value?.majorNetworksText)
96110
}
97111

98112
private fun getStringResource(id: Int): String {

app/src/androidTest/java/com/duckduckgo/app/trackerdetection/model/NetworkTrackersInstrumentationTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class NetworkTrackersInstrumentationTest {
2626
companion object {
2727
private const val category = "Social"
2828
private const val network = "Network"
29+
private const val majorNetwork = "google"
2930
}
3031

3132
private val testee = NetworkTrackers()
@@ -79,4 +80,25 @@ class NetworkTrackersInstrumentationTest {
7980
assertNull(testee.network("http://notsubdomainofnetwork.com/index.html"))
8081
}
8182

83+
@Test
84+
fun whenUrlMatchesTrackerInMajorNetworkThenMajorNetworkReturnsName() {
85+
val data = listOf(DisconnectTracker("tracker.com", category, majorNetwork, "http://www.network.com/"))
86+
testee.updateData(data)
87+
assertEquals(majorNetwork, testee.majorNetwork("http://tracker.com/script.js"))
88+
}
89+
90+
@Test
91+
fun whenUrlMatchesTrackerOutsideMajorNetworkThenMajorNetworkIsNull() {
92+
val data = listOf(DisconnectTracker("tracker.com", category, network, "http://www.network.com/"))
93+
testee.updateData(data)
94+
assertNull(testee.majorNetwork("http://tracker.com/script.js"))
95+
}
96+
97+
@Test
98+
fun whenUrlIsNotATrackerThenMajorNetworkIsNull() {
99+
val data = listOf(DisconnectTracker("tracker.com", category, network, "http://www.network.com/"))
100+
testee.updateData(data)
101+
assertNull(testee.majorNetwork("http://example.com/index.html"))
102+
}
103+
82104
}

app/src/main/java/com/duckduckgo/app/privacydashboard/PrivacyDashboardActivity.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class PrivacyDashboardActivity : DuckDuckGoActivity() {
8989
domain.text = viewState.domain
9090
httpsText.text = viewState.httpsText
9191
httpsIcon.setImageDrawable(getDrawable(viewState.httpsIcon))
92-
trackerNetworksText.text = viewState.trackerNetworksText
92+
networksIcon.setImageDrawable(getDrawable(viewState.networksIcon))
93+
networksText.text = viewState.networksText
94+
majorNetworksIcon.setImageDrawable(getDrawable(viewState.majorNetworksIcon))
95+
majorNetworksText.text = viewState.majorNetworksText
9396
}
9497
}

app/src/main/java/com/duckduckgo/app/privacydashboard/PrivacyDashboardViewModel.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ class PrivacyDashboardViewModel @Inject constructor(@SuppressLint("StaticFieldLe
3232
val domain: String,
3333
val httpsIcon: Int,
3434
val httpsText: String,
35-
val trackerNetworksText: String,
36-
val trackerNetworksIcon: Int = R.drawable.dashboard_tracker_networks_blocked
35+
val networksText: String,
36+
val networksIcon: Int = R.drawable.dashboard_networks_blocked,
37+
val majorNetworksText: String,
38+
val majorNetworksIcon: Int = R.drawable.dashboard_major_networks_blocked
3739
)
3840

3941
val viewState: MutableLiveData<ViewState> = MutableLiveData()
@@ -43,7 +45,8 @@ class PrivacyDashboardViewModel @Inject constructor(@SuppressLint("StaticFieldLe
4345
domain = "",
4446
httpsIcon = httpsIcon(HttpsStatus.SECURE),
4547
httpsText = httpsText(HttpsStatus.SECURE),
46-
trackerNetworksText = trackerNetworksText(0)
48+
networksText = networksText(0),
49+
majorNetworksText = majorNetworksText(0)
4750
)
4851
}
4952

@@ -52,7 +55,8 @@ class PrivacyDashboardViewModel @Inject constructor(@SuppressLint("StaticFieldLe
5255
domain = monitor.uri?.host ?: "",
5356
httpsIcon = httpsIcon(monitor.https),
5457
httpsText = httpsText(monitor.https),
55-
trackerNetworksText = trackerNetworksText(monitor.trackerNetworkCount)
58+
networksText = networksText(monitor.networkCount),
59+
majorNetworksText = majorNetworksText(monitor.majorNetworkCount)
5660
)
5761
}
5862

@@ -68,6 +72,10 @@ class PrivacyDashboardViewModel @Inject constructor(@SuppressLint("StaticFieldLe
6872
HttpsStatus.SECURE -> R.drawable.dashboard_https_good
6973
}
7074

71-
private fun trackerNetworksText(trackerNetworkCount: Int): String =
72-
context.getString(R.string.trackerNetworksBlocked, trackerNetworkCount.toString())
75+
private fun networksText(trackerNetworkCount: Int): String =
76+
context.getString(R.string.networksBlocked, trackerNetworkCount.toString())
77+
78+
79+
private fun majorNetworksText(trackerNetworkCount: Int): String =
80+
context.getString(R.string.majorNetworksBlocked, trackerNetworkCount.toString())
7381
}

app/src/main/java/com/duckduckgo/app/privacymonitor/PrivacyMonitor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ interface PrivacyMonitor {
2424
val uri: Uri?
2525
val https: HttpsStatus
2626
val trackerCount: Int
27-
val trackerNetworkCount: Int
28-
27+
val networkCount: Int
28+
val majorNetworkCount: Int
2929
}

app/src/main/java/com/duckduckgo/app/privacymonitor/SiteMonitor.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,19 @@ class SiteMonitor constructor(override val url: String, private val networkTrack
4949
override val trackerCount: Int
5050
get() = trackingEvents.size
5151

52-
override val trackerNetworkCount: Int
52+
override val networkCount: Int
5353
get() = trackingEvents
5454
.mapNotNull { networkTrackers.network(it.trackerUrl) }
5555
.distinct()
5656
.count()
5757

58+
override val majorNetworkCount: Int
59+
get() = trackingEvents
60+
.mapNotNull { networkTrackers.majorNetwork(it.trackerUrl) }
61+
.distinct()
62+
.count()
63+
64+
5865
fun trackerDetected(event: TrackingEvent) {
5966
trackingEvents.add(event)
6067
}

app/src/main/java/com/duckduckgo/app/trackerdetection/model/DisconnectTracker.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package com.duckduckgo.app.trackerdetection.model
1818

19-
data class DisconnectTracker(override val url: String,
19+
import java.io.Serializable
20+
21+
data class DisconnectTracker(val url: String,
2022
val category: String,
21-
override val networkName: String,
22-
override val networkUrl: String) : NetworkTracker
23+
val networkName: String,
24+
val networkUrl: String) : Serializable

app/src/main/java/com/duckduckgo/app/trackerdetection/model/NetworkTracker.kt

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

app/src/main/java/com/duckduckgo/app/trackerdetection/model/NetworkTrackers.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,48 @@ package com.duckduckgo.app.trackerdetection.model
1818

1919
import com.duckduckgo.app.global.UriString.Companion.sameOrSubdomain
2020
import java.io.Serializable
21+
import java.util.*
2122
import javax.inject.Inject
2223
import javax.inject.Singleton
2324

2425

2526
@Singleton
2627
class NetworkTrackers @Inject constructor() : Serializable {
2728

28-
private var trackers: List<NetworkTracker> = ArrayList()
29+
data class MajorNetwork(val name: String,
30+
val domain: String,
31+
val percentageOfPahges: Int)
2932

30-
fun updateData(trackers: List<NetworkTracker>) {
33+
companion object {
34+
private var majorNetworks = arrayOf(
35+
MajorNetwork("google", "google.com", 84),
36+
MajorNetwork("facebook", "facebook.com", 36),
37+
MajorNetwork("twitter", "twitter.com", 16),
38+
MajorNetwork("amazon.com", "amazon.com", 14),
39+
MajorNetwork("appnexus", "appnexus.com", 10),
40+
MajorNetwork("oracle", "oracle.com", 10),
41+
MajorNetwork("mediamath", "mediamath.com", 9),
42+
MajorNetwork("yahoo!", "yahoo.com", 9),
43+
MajorNetwork("maxcdn", "maxcdn.com", 7),
44+
MajorNetwork("automattic", "automattic.com", 7)
45+
)
46+
}
47+
48+
private var trackers: List<DisconnectTracker> = ArrayList()
49+
50+
fun updateData(trackers: List<DisconnectTracker>) {
3151
this.trackers = trackers
3252
}
3353

3454
fun network(url: String): String? {
35-
return trackers
36-
.filter { sameOrSubdomain(url, it.url) || sameOrSubdomain(url, it.networkUrl) }
37-
.map { it.networkName }
38-
.firstOrNull()
55+
val network = trackers.find { sameOrSubdomain(url, it.url) || sameOrSubdomain(url, it.networkUrl) }
56+
return network?.networkName
3957
}
58+
59+
fun majorNetwork(url: String): String? {
60+
val majorNetwork = majorNetworks.find { network(url).equals(it.name, true) }
61+
return majorNetwork?.name
62+
}
63+
4064
}
65+
2.35 KB
Loading

0 commit comments

Comments
 (0)