aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/foundation/e/privacycentralapp/domain
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/domain')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/entities/AppWithCounts.kt5
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/AppListUseCase.kt12
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt17
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt47
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt182
5 files changed, 137 insertions, 126 deletions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/AppWithCounts.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/AppWithCounts.kt
index 0b76c7b..afdd2d5 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/AppWithCounts.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/AppWithCounts.kt
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2023 MURENA SAS
* Copyright (C) 2022 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
@@ -21,6 +22,7 @@ import android.graphics.drawable.Drawable
import foundation.e.privacymodules.permissions.data.ApplicationDescription
data class AppWithCounts(
+ val appDesc: ApplicationDescription,
val packageName: String,
val uid: Int,
var label: CharSequence?,
@@ -40,6 +42,7 @@ data class AppWithCounts(
leaks: Int,
) :
this(
+ appDesc = app,
packageName = app.packageName,
uid = app.uid,
label = app.label,
@@ -52,5 +55,5 @@ data class AppWithCounts(
)
val blockedTrackersCount get() = if (isWhitelisted) 0
- else trackersCount - whiteListedTrackersCount
+ else Math.max(trackersCount - whiteListedTrackersCount, 0)
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/AppListUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/AppListUseCase.kt
index 4821349..dd62839 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/AppListUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/AppListUseCase.kt
@@ -24,8 +24,16 @@ import kotlinx.coroutines.flow.Flow
class AppListUseCase(
private val appListsRepository: AppListsRepository
) {
-
+ val dummySystemApp = appListsRepository.dummySystemApp
+ fun getApp(uid: Int): ApplicationDescription {
+ return when (uid) {
+ dummySystemApp.uid -> dummySystemApp
+ appListsRepository.dummyCompatibilityApp.uid ->
+ appListsRepository.dummyCompatibilityApp
+ else -> appListsRepository.getApp(uid) ?: dummySystemApp
+ }
+ }
fun getAppsUsingInternet(): Flow<List<ApplicationDescription>> {
- return appListsRepository.getVisibleApps()
+ return appListsRepository.mainProfileApps()
}
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
index caba132..dcb417b 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
@@ -17,7 +17,6 @@
package foundation.e.privacycentralapp.domain.usecases
-import android.util.Log
import foundation.e.privacycentralapp.data.repositories.AppListsRepository
import foundation.e.privacycentralapp.data.repositories.LocalStateRepository
import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
@@ -86,7 +85,7 @@ class IpScramblingStateUseCase(
}
private fun getHiddenPackageNames(): List<String> {
- return appListsRepository.getHiddenSystemApps().map { it.packageName }
+ return appListsRepository.getMainProfileHiddenSystemApps().map { it.packageName }
}
val bypassTorApps: Set<String> get() {
@@ -97,10 +96,10 @@ class IpScramblingStateUseCase(
mutable.add(appListsRepository.dummySystemApp.packageName)
whitelist = mutable
}
- if (AppListsRepository.appsCompatibiltyPNames.any { it in whitelist }) {
+ if (AppListsRepository.compatibiltyPNames.any { it in whitelist }) {
val mutable = whitelist.toMutableSet()
- mutable.removeAll(AppListsRepository.appsCompatibiltyPNames)
- mutable.add(appListsRepository.dummyAppsCompatibilityApp.packageName)
+ mutable.removeAll(AppListsRepository.compatibiltyPNames)
+ mutable.add(appListsRepository.dummyCompatibilityApp.packageName)
whitelist = mutable
}
return whitelist
@@ -113,16 +112,16 @@ class IpScramblingStateUseCase(
if (visibleList.contains(packageName)) {
if (packageName == appListsRepository.dummySystemApp.packageName) {
rawList.removeAll(getHiddenPackageNames())
- } else if (packageName == appListsRepository.dummyAppsCompatibilityApp.packageName) {
- rawList.removeAll(AppListsRepository.appsCompatibiltyPNames)
+ } else if (packageName == appListsRepository.dummyCompatibilityApp.packageName) {
+ rawList.removeAll(AppListsRepository.compatibiltyPNames)
} else {
rawList.remove(packageName)
}
} else {
if (packageName == appListsRepository.dummySystemApp.packageName) {
rawList.addAll(getHiddenPackageNames())
- } else if (packageName == appListsRepository.dummyAppsCompatibilityApp.packageName) {
- rawList.addAll(AppListsRepository.appsCompatibiltyPNames)
+ } else if (packageName == appListsRepository.dummyCompatibilityApp.packageName) {
+ rawList.addAll(AppListsRepository.compatibiltyPNames)
} else {
rawList.add(packageName)
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt
index 820073b..afb6d1e 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 E FOUNDATION, 2022 MURENA SAS
+ * Copyright (C) 2021 E FOUNDATION, 2022 - 2023 MURENA SAS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,7 +36,12 @@ class TrackersStateUseCase(
private val coroutineScope: CoroutineScope
) {
init {
- trackersPrivacyModule.start(trackersRepository.trackers, enableNotification = false)
+ trackersPrivacyModule.start(
+ trackers = trackersRepository.trackers,
+ getAppByAPId = appListsRepository::getApp,
+ getAppByUid = appListsRepository::getApp,
+ enableNotification = false
+ )
coroutineScope.launch {
localStateRepository.blockTrackers.collect { enabled ->
if (enabled) {
@@ -54,39 +59,47 @@ class TrackersStateUseCase(
blockTrackersPrivacyModule.isWhiteListEmpty()
}
- fun getApplicationDescription(appUid: Int): ApplicationDescription? {
- return appListsRepository.getApplicationDescription(appUid)
+ fun isWhitelisted(app: ApplicationDescription): Boolean {
+ return isWhitelisted(app, appListsRepository, blockTrackersPrivacyModule)
}
- fun isWhitelisted(appUid: Int): Boolean {
- return isWhitelisted(appUid, appListsRepository, blockTrackersPrivacyModule)
+ fun toggleAppWhitelist(app: ApplicationDescription, isWhitelisted: Boolean) {
+ appListsRepository.applyForHiddenApps(app) {
+ blockTrackersPrivacyModule.setWhiteListed(it, isWhitelisted)
+ }
+ updateAllTrackersBlockedState()
}
- fun toggleAppWhitelist(appUid: Int, isWhitelisted: Boolean) {
- appListsRepository.applyForHiddenApps(appUid) { uid ->
- blockTrackersPrivacyModule.setWhiteListed(uid, isWhitelisted)
+ fun blockTracker(app: ApplicationDescription, tracker: Tracker, isBlocked: Boolean) {
+ appListsRepository.applyForHiddenApps(app) {
+ blockTrackersPrivacyModule.setWhiteListed(tracker, it, !isBlocked)
}
-
updateAllTrackersBlockedState()
}
- fun blockTracker(appUid: Int, tracker: Tracker, isBlocked: Boolean) {
- appListsRepository.applyForHiddenApps(appUid) { uid ->
- blockTrackersPrivacyModule.setWhiteListed(tracker, uid, !isBlocked)
- }
+ fun clearWhitelist(app: ApplicationDescription) {
+ appListsRepository.applyForHiddenApps(
+ app,
+ blockTrackersPrivacyModule::clearWhiteList
+ )
updateAllTrackersBlockedState()
}
fun updateTrackers() = coroutineScope.launch {
trackersRepository.update()
- trackersPrivacyModule.start(trackersRepository.trackers, enableNotification = false)
+ trackersPrivacyModule.start(
+ trackers = trackersRepository.trackers,
+ getAppByAPId = appListsRepository::getApp,
+ getAppByUid = appListsRepository::getApp,
+ enableNotification = false
+ )
}
}
fun isWhitelisted(
- appUid: Int,
+ app: ApplicationDescription,
appListsRepository: AppListsRepository,
blockTrackersPrivacyModule: IBlockTrackersPrivacyModule
): Boolean {
- return appListsRepository.anyForHiddenApps(appUid, blockTrackersPrivacyModule::isWhitelisted)
+ return appListsRepository.anyForHiddenApps(app, blockTrackersPrivacyModule::isWhitelisted)
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt
index cc6ec45..5ca7039 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 E FOUNDATION, 2022 MURENA SAS
+ * Copyright (C) 2021 E FOUNDATION, 2022 - 2023 MURENA SAS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -47,7 +47,7 @@ class TrackersStatisticsUseCase(
private val resources: Resources
) {
fun initAppList() {
- appListsRepository.getAllProfilesVisibleApps()
+ appListsRepository.apps()
}
private fun rawUpdates(): Flow<Unit> = callbackFlow {
@@ -74,10 +74,25 @@ class TrackersStatisticsUseCase(
) to trackTrackersPrivacyModule.getTrackersCount()
}
+ fun getNonBlockedTrackersCount(): Flow<Int> {
+ return if (blockTrackersPrivacyModule.isBlockingEnabled())
+ appListsRepository.allApps().map { apps ->
+ val whiteListedTrackers = mutableSetOf<Tracker>()
+ val whiteListedApps = blockTrackersPrivacyModule.getWhiteListedApp()
+ apps.forEach { app ->
+ if (app in whiteListedApps) {
+ whiteListedTrackers.addAll(trackTrackersPrivacyModule.getTrackersForApp(app))
+ } else {
+ whiteListedTrackers.addAll(blockTrackersPrivacyModule.getWhiteList(app))
+ }
+ }
+ whiteListedTrackers.size
+ }
+ else flowOf(trackTrackersPrivacyModule.getTrackersCount())
+ }
+
fun getMostLeakedApp(): ApplicationDescription? {
- return appListsRepository.getApplicationDescription(
- trackTrackersPrivacyModule.getPastDayMostLeakedApp()
- )
+ return trackTrackersPrivacyModule.getPastDayMostLeakedApp()
}
fun getDayTrackersCalls() = trackTrackersPrivacyModule.getPastDayTrackersCalls()
@@ -161,103 +176,93 @@ class TrackersStatisticsUseCase(
}
}
- fun getTrackers(appUid: Int): List<Tracker> {
- val trackers = if (appUid == appListsRepository.dummySystemApp.uid) {
- appListsRepository.getAllProfilesHiddenSystemApps().map {
- trackTrackersPrivacyModule.getTrackersForApp(it.uid)
- }.flatten().distinctBy { it.id }
- } else if (appUid == appListsRepository.dummyAppsCompatibilityApp.uid) {
- appListsRepository.getAllProfilesACApps().map {
- trackTrackersPrivacyModule.getTrackersForApp(it.uid)
- }.flatten().distinctBy { it.id }
- } else trackTrackersPrivacyModule.getTrackersForApp(appUid)
-
- return trackers.sortedBy { it.label.lowercase() }
- }
-
- fun getTrackersWithWhiteList(appUid: Int): List<Pair<Tracker, Boolean>> {
- val trackers: List<Tracker>
- val whiteListedTrackersIds: Set<String>
- if (appUid == appListsRepository.dummySystemApp.uid) {
- val hiddenApps = appListsRepository.getAllProfilesHiddenSystemApps()
- trackers = trackTrackersPrivacyModule.getTrackers(hiddenApps.map { it.uid })
-
- whiteListedTrackersIds = hiddenApps.fold(HashSet<String>()) { acc, app ->
- acc.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid).map { it.id })
- acc
- }
- } else if (appUid == appListsRepository.dummyAppsCompatibilityApp.uid) {
- val acApps = appListsRepository.getAllProfilesACApps()
- trackers = trackTrackersPrivacyModule.getTrackers(acApps.map { it.uid })
+ fun getTrackersWithWhiteList(app: ApplicationDescription): List<Pair<Tracker, Boolean>> {
+ return appListsRepository.mapReduceForHiddenApps(
+ app = app,
+ map = { appDesc: ApplicationDescription ->
+ (
+ trackTrackersPrivacyModule.getTrackersForApp(appDesc) to
+ blockTrackersPrivacyModule.getWhiteList(appDesc)
+ )
+ },
+ reduce = { lists ->
+ lists.unzip().let { (trackerLists, whiteListedIdLists) ->
+ val whiteListedIds = whiteListedIdLists.flatten().map { it.id }.toSet()
- whiteListedTrackersIds = acApps.fold(HashSet<String>()) { acc, app ->
- acc.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid).map { it.id })
- acc
+ trackerLists.flatten().distinctBy { it.id }.sortedBy { it.label.lowercase() }
+ .map { tracker -> tracker to (tracker.id in whiteListedIds) }
+ }
}
- } else {
- trackers = trackTrackersPrivacyModule.getTrackersForApp(appUid)
- whiteListedTrackersIds = blockTrackersPrivacyModule.getWhiteList(appUid)
- .map { it.id }.toSet()
- }
+ )
+ }
- return trackers.sortedBy { it.label.lowercase() }.map { tracker -> tracker to whiteListedTrackersIds.any { tracker.id == it } }
+ fun isWhiteListEmpty(app: ApplicationDescription): Boolean {
+ return appListsRepository.mapReduceForHiddenApps(
+ app = app,
+ map = { appDesc: ApplicationDescription ->
+ blockTrackersPrivacyModule.getWhiteList(appDesc).isEmpty()
+ },
+ reduce = { areEmpty -> areEmpty.all { it } }
+ )
}
- fun getCalls(appUid: Int): Pair<Int, Int> {
- return if (appUid == appListsRepository.dummySystemApp.uid) {
- appListsRepository.getAllProfilesHiddenSystemApps().map {
- trackTrackersPrivacyModule.getPastDayTrackersCallsForApp(it.uid)
- }.reduce { (accBlocked, accLeaked), (blocked, leaked) ->
- accBlocked + blocked to accLeaked + leaked
- }
- } else if (appUid == appListsRepository.dummyAppsCompatibilityApp.uid) {
- appListsRepository.getAllProfilesACApps().map {
- trackTrackersPrivacyModule.getPastDayTrackersCallsForApp(it.uid)
- }.reduce { (accBlocked, accLeaked), (blocked, leaked) ->
- accBlocked + blocked to accLeaked + leaked
+ fun getCalls(app: ApplicationDescription): Pair<Int, Int> {
+ return appListsRepository.mapReduceForHiddenApps(
+ app = app,
+ map = trackTrackersPrivacyModule::getPastDayTrackersCallsForApp,
+ reduce = { zip ->
+ zip.unzip().let { (blocked, leaked) ->
+ blocked.sum() to leaked.sum()
+ }
}
- } else trackTrackersPrivacyModule.getPastDayTrackersCallsForApp(appUid)
+ )
}
fun getAppsWithCounts(): Flow<List<AppWithCounts>> {
val trackersCounts = trackTrackersPrivacyModule.getTrackersCountByApp()
val hiddenAppsTrackersWithWhiteList =
- getTrackersWithWhiteList(appListsRepository.dummySystemApp.uid)
+ getTrackersWithWhiteList(appListsRepository.dummySystemApp)
val acAppsTrackersWithWhiteList =
- getTrackersWithWhiteList(appListsRepository.dummyAppsCompatibilityApp.uid)
+ getTrackersWithWhiteList(appListsRepository.dummyCompatibilityApp)
- return appListsRepository.getAllProfilesVisibleApps()
+ return appListsRepository.apps()
.map { apps ->
val callsByApp = trackTrackersPrivacyModule.getPastDayTrackersCallsByApps()
apps.map { app ->
+ val calls = appListsRepository.mapReduceForHiddenApps(
+ app = app,
+ map = { callsByApp.getOrDefault(app, 0 to 0) },
+ reduce = {
+ it.unzip().let { (blocked, leaked) ->
+ blocked.sum() to leaked.sum()
+ }
+ }
+ )
+
AppWithCounts(
app = app,
isWhitelisted = !blockTrackersPrivacyModule.isBlockingEnabled() ||
- isWhitelisted(app.uid, appListsRepository, blockTrackersPrivacyModule),
- trackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) {
- hiddenAppsTrackersWithWhiteList.size
- } else if (app.uid == appListsRepository.dummyAppsCompatibilityApp.uid) {
- acAppsTrackersWithWhiteList.size
- } else {
- trackersCounts.getOrDefault(app.uid, 0)
- },
- whiteListedTrackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) {
- hiddenAppsTrackersWithWhiteList.count { it.second }
- } else if (app.uid == appListsRepository.dummyAppsCompatibilityApp.uid) {
- acAppsTrackersWithWhiteList.count { it.second }
- } else {
- blockTrackersPrivacyModule.getWhiteList(app.uid).size
+ isWhitelisted(app, appListsRepository, blockTrackersPrivacyModule),
+ trackersCount = when (app) {
+ appListsRepository.dummySystemApp ->
+ hiddenAppsTrackersWithWhiteList.size
+ appListsRepository.dummyCompatibilityApp ->
+ acAppsTrackersWithWhiteList.size
+ else -> trackersCounts.getOrDefault(app, 0)
},
- blockedLeaks = appListsRepository.foldForHiddenApp(app.uid) {
- appUid ->
- callsByApp.getOrDefault(appUid, 0 to 0).first
+ whiteListedTrackersCount = when (app) {
+ appListsRepository.dummySystemApp ->
+ hiddenAppsTrackersWithWhiteList.count { it.second }
+ appListsRepository.dummyCompatibilityApp ->
+ acAppsTrackersWithWhiteList.count { it.second }
+ else ->
+ blockTrackersPrivacyModule.getWhiteList(app).size
},
- leaks = appListsRepository.foldForHiddenApp(app.uid) {
- appUid ->
- callsByApp.getOrDefault(appUid, 0 to 0).second
- }
+ blockedLeaks = calls.first,
+ leaks = calls.second
)
- }.sortedWith(mostLeakedAppsComparator)
+ }
+ .sortedWith(mostLeakedAppsComparator)
}
}
@@ -270,21 +275,4 @@ class TrackersStatisticsUseCase(
}
}
}
-
- fun getNonBlockedTrackersCount(): Flow<Int> {
- return if (blockTrackersPrivacyModule.isBlockingEnabled())
- appListsRepository.getAllApps().map { apps ->
- val whiteListedTrackers = mutableSetOf<Tracker>()
- val whiteListedAppUids = blockTrackersPrivacyModule.getWhiteListedApp()
- apps.forEach { app ->
- if (app.uid in whiteListedAppUids) {
- whiteListedTrackers.addAll(getTrackers(app.uid))
- } else {
- whiteListedTrackers.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid))
- }
- }
- whiteListedTrackers.size
- }
- else flowOf(trackTrackersPrivacyModule.getTrackersCount())
- }
}