aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/foundation/e/privacycentralapp/data
diff options
context:
space:
mode:
authorGuillaume Jacquart <guillaume.jacquart@hoodbrains.com>2023-01-02 08:35:21 +0000
committerGuillaume Jacquart <guillaume.jacquart@hoodbrains.com>2023-01-02 08:35:21 +0000
commitf1e0961daf535628252f18c06fe22001f84015b5 (patch)
tree78a37bc4da310662f44c4e6c362c0d58de2cc2e6 /app/src/main/java/foundation/e/privacycentralapp/data
parent7333a0d80ef3fb879fb6d261988deb78b4857393 (diff)
parentf1d5b12dd11019508208571db5e5f57f43e3c4b6 (diff)
downloadadvanced-privacy-f1e0961daf535628252f18c06fe22001f84015b5.tar.gz
Merge branch '5648-apps_pro_profile' into 'main'
5648: display trackers for pro-profile app instances. See merge request e/os/advanced-privacy!100
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/data')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt107
1 files changed, 69 insertions, 38 deletions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt
index febda91..65ae478 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 E FOUNDATION
+ * Copyright (C) 2022 E FOUNDATION, 2022 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
@@ -21,11 +21,13 @@ import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
-import android.content.pm.PackageManager
+import android.content.pm.PackageInfo
import foundation.e.privacycentralapp.R
import foundation.e.privacymodules.permissions.PermissionsPrivacyModule
import foundation.e.privacymodules.permissions.data.ApplicationDescription
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.map
@@ -48,24 +50,67 @@ class AppListsRepository(
icon = context.getDrawable(R.drawable.ic_e_app_logo)
)
- fun getVisibleApps(): Flow<List<ApplicationDescription>> {
- coroutineScope.launch {
- val (visible, hidden) = splitVisibleToHidden(getAppsUsingInternet())
- appDescriptions.emit(
- Pair(
- visible.map { permissionsModule.buildApplicationDescription(it, withIcon = true) } + dummySystemApp,
- hidden.map { permissionsModule.buildApplicationDescription(it, withIcon = false) },
- )
- )
+ private suspend fun fetchAppDescriptions() {
+ val launcherPackageNames = pm.queryIntentActivities(
+ Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) },
+ 0
+ ).mapNotNull { it.activityInfo?.packageName }
+
+ val visibleAppsFilter = { packageInfo: PackageInfo ->
+ hasInternetPermission(packageInfo) &&
+ isNotHiddenSystemApp(packageInfo.applicationInfo, launcherPackageNames)
+ }
+
+ val hiddenAppsFilter = { packageInfo: PackageInfo ->
+ hasInternetPermission(packageInfo) &&
+ !isNotHiddenSystemApp(packageInfo.applicationInfo, launcherPackageNames)
+ }
+
+ val visibleApps = permissionsModule.getApplications(visibleAppsFilter, true)
+ val hiddenApps = permissionsModule.getApplications(hiddenAppsFilter, false)
+
+ val workProfileVisibleApps = permissionsModule.getWorkProfileApplications(visibleAppsFilter, true)
+ val workProfileHiddenApps = permissionsModule.getWorkProfileApplications(hiddenAppsFilter, false)
+
+ appDescriptions.emit((visibleApps + dummySystemApp) to hiddenApps)
+ allProfilesAppDescriptions.emit(
+ (visibleApps + workProfileVisibleApps + dummySystemApp)
+ to (hiddenApps + workProfileHiddenApps)
+ )
+ }
+
+ private var refreshAppJob: Job? = null
+ private fun refreshAppDescriptions() {
+ if (refreshAppJob != null) {
+ return
+ } else {
+ refreshAppJob = coroutineScope.launch(Dispatchers.IO) {
+ fetchAppDescriptions()
+ refreshAppJob = null
+ }
}
+ }
+
+ fun getVisibleApps(): Flow<List<ApplicationDescription>> {
+ refreshAppDescriptions()
return appDescriptions.map { it.first.sortedBy { app -> app.label.toString().lowercase() } }
}
+
fun getHiddenSystemApps(): List<ApplicationDescription> {
return appDescriptions.value.second
}
- fun getVisibleAndHiddenApps(): Flow<List<ApplicationDescription>> = getVisibleApps()
- .map { it + getHiddenSystemApps() }
+ fun getAllProfilesVisibleApps(): Flow<List<ApplicationDescription>> {
+ refreshAppDescriptions()
+ return allProfilesAppDescriptions.map { it.first.sortedBy { app -> app.label.toString().lowercase() } }
+ }
+
+ fun getAllProfilesHiddenSystemApps(): List<ApplicationDescription> {
+ return allProfilesAppDescriptions.value.second
+ }
+
+ fun getAllApps(): Flow<List<ApplicationDescription>> = getAllProfilesVisibleApps()
+ .map { it + getAllProfilesHiddenSystemApps() }
fun getApplicationDescription(packageName: String): ApplicationDescription? {
return appDescriptions.value.first.find { it.packageName == packageName }
@@ -77,7 +122,7 @@ class AppListsRepository(
fun foldForHiddenSystemApp(appUid: Int, appValueGetter: (Int) -> Int): Int {
return if (appUid == dummySystemApp.uid) {
- getHiddenSystemApps().fold(0) { acc, app ->
+ getAllProfilesHiddenSystemApps().fold(0) { acc, app ->
acc + appValueGetter(app.uid)
}
} else appValueGetter(appUid)
@@ -92,14 +137,18 @@ class AppListsRepository(
)
)
- private fun getAppsUsingInternet(): List<ApplicationInfo> {
- return pm.getInstalledPackages(PackageManager.GET_PERMISSIONS).filter {
- it.requestedPermissions?.contains(Manifest.permission.INTERNET) == true
- }.map {
- it.applicationInfo
- }
+ private val allProfilesAppDescriptions = MutableStateFlow(
+ Pair(
+ emptyList<ApplicationDescription>(),
+ emptyList<ApplicationDescription>()
+ )
+ )
+
+ private fun hasInternetPermission(packageInfo: PackageInfo): Boolean {
+ return packageInfo.requestedPermissions?.contains(Manifest.permission.INTERNET) == true
}
+ @Suppress("ReturnCount")
private fun isNotHiddenSystemApp(app: ApplicationInfo, launcherApps: List<String>): Boolean {
if (app.packageName == PNAME_SETTINGS) {
return false
@@ -116,22 +165,4 @@ class AppListsRepository(
}
private fun ApplicationInfo.hasFlag(flag: Int) = (flags and flag) == 1
-
- private fun splitVisibleToHidden(apps: List<ApplicationInfo>): Pair<List<ApplicationInfo>, List<ApplicationInfo>> {
- val launcherPackageNames = pm.queryIntentActivities(
- Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) },
- 0
- ).mapNotNull { it.activityInfo?.packageName }
- return apps.fold(
- mutableListOf<ApplicationInfo>() to mutableListOf<ApplicationInfo>()
- ) {
- acc, app ->
- if (isNotHiddenSystemApp(app, launcherPackageNames)) {
- acc.first.add(app)
- } else {
- acc.second.add(app)
- }
- acc
- }
- }
}