Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29a750c2 authored by Guillaume Jacquart's avatar Guillaume Jacquart
Browse files

Merge branch '2-fix_trackers_count_for_system_app' into 'main'

2 - Convert trackers to kotlin, fix trackers count for system app

See merge request !84
parents 2945b690 df7f3d96
Loading
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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
@@ -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 {
+7 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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
+18 −12
Original line number Diff line number Diff line
@@ -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,
@@ -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) {
@@ -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)
}
+33 −11
Original line number Diff line number Diff line
@@ -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
@@ -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