Loading app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt +1 −2 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import foundation.e.privacycentralapp.features.trackers.apptrackers.AppTrackersV import foundation.e.privacymodules.fakelocation.FakeLocationModule import foundation.e.privacymodules.ipscrambler.IpScramblerModule import foundation.e.privacymodules.ipscramblermodule.IIpScramblerModule import foundation.e.privacymodules.location.IFakeLocationModule import foundation.e.privacymodules.permissions.PermissionsPrivacyModule import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.api.BlockTrackersPrivacyModule Loading Loading @@ -98,7 +97,7 @@ class DependencyContainer(val app: Application) { } val trackersStateUseCase by lazy { TrackersStateUseCase(blockTrackersPrivacyModule, trackTrackersPrivacyModule, permissionsModule, localStateRepository, trackersRepository, appListsRepository, GlobalScope) TrackersStateUseCase(blockTrackersPrivacyModule, trackTrackersPrivacyModule, localStateRepository, trackersRepository, appListsRepository, GlobalScope) } private val fakeLocationStateUseCase by lazy { Loading app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt +7 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,10 @@ class AppListsRepository( private val context: Context, private val coroutineScope: CoroutineScope ) { companion object { private const val settingsPackageName = "com.android.settings" } val dummySystemApp = ApplicationDescription( packageName = "foundation.e.dummysystemapp", uid = -1, Loading Loading @@ -96,7 +100,9 @@ class AppListsRepository( } private fun isNotHiddenSystemApp(app: ApplicationInfo, launcherApps: List<String>): Boolean { if (app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) { if (app.packageName == settingsPackageName) { return false } else if (app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) { return true } else if (!app.hasFlag(ApplicationInfo.FLAG_SYSTEM)) { return true Loading app/src/main/java/foundation/e/privacycentralapp/data/repositories/TrackersRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ package foundation.e.privacycentralapp.data.repositories import android.content.Context import android.util.Log import com.google.gson.Gson import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.Tracker import retrofit2.Retrofit import retrofit2.converter.scalars.ScalarsConverterFactory import retrofit2.http.GET Loading app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt +18 −12 Original line number Diff line number Diff line Loading @@ -22,17 +22,15 @@ import foundation.e.privacycentralapp.data.repositories.LocalStateRepository import foundation.e.privacycentralapp.data.repositories.TrackersRepository import foundation.e.privacymodules.permissions.PermissionsPrivacyModule import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.Tracker import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch class TrackersStateUseCase( private val blockTrackersPrivacyModule: IBlockTrackersPrivacyModule, private val trackersPrivacyModule: ITrackTrackersPrivacyModule, private val permissionsPrivacyModule: PermissionsPrivacyModule, private val localStateRepository: LocalStateRepository, private val trackersRepository: TrackersRepository, private val appListsRepository: AppListsRepository, Loading Loading @@ -65,13 +63,8 @@ class TrackersStateUseCase( return appListsRepository.getApplicationDescription(appUid) } fun isWhitelisted(appUid: Int): Boolean { return if (appUid == appListsRepository.dummySystemApp.uid) { appListsRepository.getHiddenSystemApps().any { blockTrackersPrivacyModule.isWhitelisted(it.uid) } } else blockTrackersPrivacyModule.isWhitelisted(appUid) } fun isWhitelisted(appUid: Int) = isWhitelisted(appUid, appListsRepository, blockTrackersPrivacyModule) fun getTrackersWhitelistIds(appUid: Int): List<String> { return if (appUid == appListsRepository.dummySystemApp.uid) { Loading Loading @@ -114,3 +107,16 @@ class TrackersStateUseCase( trackersPrivacyModule.start(trackersRepository.trackers, enableNotification = false) } } fun isWhitelisted( appUid: Int, appListsRepository: AppListsRepository, blockTrackersPrivacyModule: IBlockTrackersPrivacyModule ): Boolean { return if (appUid == appListsRepository.dummySystemApp.uid) { appListsRepository.getHiddenSystemApps().any { blockTrackersPrivacyModule.isWhitelisted(it.uid) } } else blockTrackersPrivacyModule.isWhitelisted(appUid) } app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt +33 −11 Original line number Diff line number Diff line Loading @@ -18,15 +18,16 @@ package foundation.e.privacycentralapp.domain.usecases import android.content.res.Resources import android.util.Log import foundation.e.privacycentralapp.R import foundation.e.privacycentralapp.common.throttleFirst import foundation.e.privacycentralapp.data.repositories.AppListsRepository import foundation.e.privacycentralapp.domain.entities.AppWithCounts import foundation.e.privacycentralapp.domain.entities.TrackersPeriodicStatistics import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.Tracker import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow Loading Loading @@ -172,24 +173,45 @@ class TrackersStatisticsUseCase( .map { apps -> val callsByApp = trackTrackersPrivacyModule.getPastDayTrackersCallsByApps() apps.map { app -> val (blockedLeaks, leaks) = callsByApp.getOrDefault(app.uid, 0 to 0) AppWithCounts( app = app, isWhitelisted = !blockTrackersPrivacyModule.isBlockingEnabled() || blockTrackersPrivacyModule.isWhitelisted(app.uid), trackersCount = appListsRepository.foldForHiddenSystemApp(app.uid) { trackersCounts.getOrDefault(it, 0) isWhitelisted(app.uid, appListsRepository, blockTrackersPrivacyModule), trackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) { getHiddenSystemAppsTrackersCount() } else { trackersCounts.getOrDefault(app.uid, 0) }, whiteListedTrackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) { getHiddenSystemAppWhitelistedTrackersCount() } else { blockTrackersPrivacyModule.getWhiteList(app.uid).size }, whiteListedTrackersCount = appListsRepository.foldForHiddenSystemApp(app.uid) { blockTrackersPrivacyModule.getWhiteList(it).size blockedLeaks = appListsRepository.foldForHiddenSystemApp(app.uid) { appUid -> callsByApp.getOrDefault(appUid, 0 to 0).first }, blockedLeaks = blockedLeaks, leaks = leaks leaks = appListsRepository.foldForHiddenSystemApp(app.uid) { appUid -> callsByApp.getOrDefault(appUid, 0 to 0).second } ) }.sortedWith(mostLeakedAppsComparator) } } private fun getHiddenSystemAppsTrackersCount(): Int { return trackTrackersPrivacyModule.getTrackersCount( appListsRepository.getHiddenSystemApps().map { it.uid } ) } private fun getHiddenSystemAppWhitelistedTrackersCount(): Int { return appListsRepository.getHiddenSystemApps().fold(HashSet<String>()) { acc, app -> acc.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid).map { it.id }) acc }.size } private val mostLeakedAppsComparator: Comparator<AppWithCounts> = Comparator { o1, o2 -> val leaks = o2.leaks - o1.leaks if (leaks != 0) leaks else { Loading Loading
app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt +1 −2 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import foundation.e.privacycentralapp.features.trackers.apptrackers.AppTrackersV import foundation.e.privacymodules.fakelocation.FakeLocationModule import foundation.e.privacymodules.ipscrambler.IpScramblerModule import foundation.e.privacymodules.ipscramblermodule.IIpScramblerModule import foundation.e.privacymodules.location.IFakeLocationModule import foundation.e.privacymodules.permissions.PermissionsPrivacyModule import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.api.BlockTrackersPrivacyModule Loading Loading @@ -98,7 +97,7 @@ class DependencyContainer(val app: Application) { } val trackersStateUseCase by lazy { TrackersStateUseCase(blockTrackersPrivacyModule, trackTrackersPrivacyModule, permissionsModule, localStateRepository, trackersRepository, appListsRepository, GlobalScope) TrackersStateUseCase(blockTrackersPrivacyModule, trackTrackersPrivacyModule, localStateRepository, trackersRepository, appListsRepository, GlobalScope) } private val fakeLocationStateUseCase by lazy { Loading
app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt +7 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,10 @@ class AppListsRepository( private val context: Context, private val coroutineScope: CoroutineScope ) { companion object { private const val settingsPackageName = "com.android.settings" } val dummySystemApp = ApplicationDescription( packageName = "foundation.e.dummysystemapp", uid = -1, Loading Loading @@ -96,7 +100,9 @@ class AppListsRepository( } private fun isNotHiddenSystemApp(app: ApplicationInfo, launcherApps: List<String>): Boolean { if (app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) { if (app.packageName == settingsPackageName) { return false } else if (app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) { return true } else if (!app.hasFlag(ApplicationInfo.FLAG_SYSTEM)) { return true Loading
app/src/main/java/foundation/e/privacycentralapp/data/repositories/TrackersRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ package foundation.e.privacycentralapp.data.repositories import android.content.Context import android.util.Log import com.google.gson.Gson import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.Tracker import retrofit2.Retrofit import retrofit2.converter.scalars.ScalarsConverterFactory import retrofit2.http.GET Loading
app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt +18 −12 Original line number Diff line number Diff line Loading @@ -22,17 +22,15 @@ import foundation.e.privacycentralapp.data.repositories.LocalStateRepository import foundation.e.privacycentralapp.data.repositories.TrackersRepository import foundation.e.privacymodules.permissions.PermissionsPrivacyModule import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.Tracker import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch class TrackersStateUseCase( private val blockTrackersPrivacyModule: IBlockTrackersPrivacyModule, private val trackersPrivacyModule: ITrackTrackersPrivacyModule, private val permissionsPrivacyModule: PermissionsPrivacyModule, private val localStateRepository: LocalStateRepository, private val trackersRepository: TrackersRepository, private val appListsRepository: AppListsRepository, Loading Loading @@ -65,13 +63,8 @@ class TrackersStateUseCase( return appListsRepository.getApplicationDescription(appUid) } fun isWhitelisted(appUid: Int): Boolean { return if (appUid == appListsRepository.dummySystemApp.uid) { appListsRepository.getHiddenSystemApps().any { blockTrackersPrivacyModule.isWhitelisted(it.uid) } } else blockTrackersPrivacyModule.isWhitelisted(appUid) } fun isWhitelisted(appUid: Int) = isWhitelisted(appUid, appListsRepository, blockTrackersPrivacyModule) fun getTrackersWhitelistIds(appUid: Int): List<String> { return if (appUid == appListsRepository.dummySystemApp.uid) { Loading Loading @@ -114,3 +107,16 @@ class TrackersStateUseCase( trackersPrivacyModule.start(trackersRepository.trackers, enableNotification = false) } } fun isWhitelisted( appUid: Int, appListsRepository: AppListsRepository, blockTrackersPrivacyModule: IBlockTrackersPrivacyModule ): Boolean { return if (appUid == appListsRepository.dummySystemApp.uid) { appListsRepository.getHiddenSystemApps().any { blockTrackersPrivacyModule.isWhitelisted(it.uid) } } else blockTrackersPrivacyModule.isWhitelisted(appUid) }
app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt +33 −11 Original line number Diff line number Diff line Loading @@ -18,15 +18,16 @@ package foundation.e.privacycentralapp.domain.usecases import android.content.res.Resources import android.util.Log import foundation.e.privacycentralapp.R import foundation.e.privacycentralapp.common.throttleFirst import foundation.e.privacycentralapp.data.repositories.AppListsRepository import foundation.e.privacycentralapp.domain.entities.AppWithCounts import foundation.e.privacycentralapp.domain.entities.TrackersPeriodicStatistics import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.Tracker import foundation.e.privacymodules.trackers.api.IBlockTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.ITrackTrackersPrivacyModule import foundation.e.privacymodules.trackers.api.Tracker import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow Loading Loading @@ -172,24 +173,45 @@ class TrackersStatisticsUseCase( .map { apps -> val callsByApp = trackTrackersPrivacyModule.getPastDayTrackersCallsByApps() apps.map { app -> val (blockedLeaks, leaks) = callsByApp.getOrDefault(app.uid, 0 to 0) AppWithCounts( app = app, isWhitelisted = !blockTrackersPrivacyModule.isBlockingEnabled() || blockTrackersPrivacyModule.isWhitelisted(app.uid), trackersCount = appListsRepository.foldForHiddenSystemApp(app.uid) { trackersCounts.getOrDefault(it, 0) isWhitelisted(app.uid, appListsRepository, blockTrackersPrivacyModule), trackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) { getHiddenSystemAppsTrackersCount() } else { trackersCounts.getOrDefault(app.uid, 0) }, whiteListedTrackersCount = if (app.uid == appListsRepository.dummySystemApp.uid) { getHiddenSystemAppWhitelistedTrackersCount() } else { blockTrackersPrivacyModule.getWhiteList(app.uid).size }, whiteListedTrackersCount = appListsRepository.foldForHiddenSystemApp(app.uid) { blockTrackersPrivacyModule.getWhiteList(it).size blockedLeaks = appListsRepository.foldForHiddenSystemApp(app.uid) { appUid -> callsByApp.getOrDefault(appUid, 0 to 0).first }, blockedLeaks = blockedLeaks, leaks = leaks leaks = appListsRepository.foldForHiddenSystemApp(app.uid) { appUid -> callsByApp.getOrDefault(appUid, 0 to 0).second } ) }.sortedWith(mostLeakedAppsComparator) } } private fun getHiddenSystemAppsTrackersCount(): Int { return trackTrackersPrivacyModule.getTrackersCount( appListsRepository.getHiddenSystemApps().map { it.uid } ) } private fun getHiddenSystemAppWhitelistedTrackersCount(): Int { return appListsRepository.getHiddenSystemApps().fold(HashSet<String>()) { acc, app -> acc.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid).map { it.id }) acc }.size } private val mostLeakedAppsComparator: Comparator<AppWithCounts> = Comparator { o1, o2 -> val leaks = o2.leaks - o1.leaks if (leaks != 0) leaks else { Loading