diff options
| author | Guillaume Jacquart <guillaume.jacquart@hoodbrains.com> | 2023-03-06 10:41:07 +0000 |
|---|---|---|
| committer | Guillaume Jacquart <guillaume.jacquart@hoodbrains.com> | 2023-03-06 10:41:07 +0000 |
| commit | 110d1cbffbfb8e397047a6d1e80eb8a21befffca (patch) | |
| tree | 36c76f3addaa94a56025ce15d753f609978ac8e5 /app/src/main/java/foundation/e/privacycentralapp/data | |
| parent | 5aa1f270323bf36a2797cef3f486a1c22e76c308 (diff) | |
| parent | e279045cfe02dd4a571df98f596b8a9af9b9d24c (diff) | |
| download | advanced-privacy-110d1cbffbfb8e397047a6d1e80eb8a21befffca.tar.gz | |
Merge branch '842-dummy_apps_compatibility' into 'main'
842: Create dummy-app apps compatibility leaking system components
See merge request e/os/advanced-privacy!114
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/data')
| -rw-r--r-- | app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt | 94 |
1 files changed, 77 insertions, 17 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 65ae478..a97888f 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 @@ -41,6 +41,12 @@ class AppListsRepository( companion object { private const val PNAME_SETTINGS = "com.android.settings" private const val PNAME_PWAPLAYER = "foundation.e.pwaplayer" + private const val PNAME_INTENT_VERIFICATION = "com.android.statementservice" + private const val PNAME_MICROG_SERVICES_CORE = "com.google.android.gms" + + val appsCompatibiltyPNames = setOf( + PNAME_PWAPLAYER, PNAME_INTENT_VERIFICATION, PNAME_MICROG_SERVICES_CORE + ) } val dummySystemApp = ApplicationDescription( @@ -50,6 +56,13 @@ class AppListsRepository( icon = context.getDrawable(R.drawable.ic_e_app_logo) ) + val dummyAppsCompatibilityApp = ApplicationDescription( + packageName = "foundation.e.dummyappscompatibilityapp", + uid = -2, + label = context.getString(R.string.dummy_apps_compatibility_app_label), + icon = context.getDrawable(R.drawable.ic_apps_compatibility_components) + ) + private suspend fun fetchAppDescriptions() { val launcherPackageNames = pm.queryIntentActivities( Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) }, @@ -58,25 +71,32 @@ class AppListsRepository( val visibleAppsFilter = { packageInfo: PackageInfo -> hasInternetPermission(packageInfo) && - isNotHiddenSystemApp(packageInfo.applicationInfo, launcherPackageNames) + isStandardApp(packageInfo.applicationInfo, launcherPackageNames) } val hiddenAppsFilter = { packageInfo: PackageInfo -> hasInternetPermission(packageInfo) && - !isNotHiddenSystemApp(packageInfo.applicationInfo, launcherPackageNames) + isHiddenSystemApp(packageInfo.applicationInfo, launcherPackageNames) + } + + val aCFilter = { packageInfo: PackageInfo -> + packageInfo.packageName in appsCompatibiltyPNames } val visibleApps = permissionsModule.getApplications(visibleAppsFilter, true) val hiddenApps = permissionsModule.getApplications(hiddenAppsFilter, false) + val aCApps = permissionsModule.getApplications(aCFilter, 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) - ) + val workProfileACApps = permissionsModule.getApplications(aCFilter, false) + + appDescriptions.emit((visibleApps + dummySystemApp + dummyAppsCompatibilityApp) to hiddenApps) + allProfilesAppDescriptions.emit(Triple( + (visibleApps + workProfileVisibleApps + dummySystemApp + dummyAppsCompatibilityApp), + (hiddenApps + workProfileHiddenApps), + (aCApps + workProfileACApps) + )) } private var refreshAppJob: Job? = null @@ -109,26 +129,47 @@ class AppListsRepository( 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 } + fun getAllProfilesACApps(): List<ApplicationDescription> { + return allProfilesAppDescriptions.value.third } + fun getAllApps(): Flow<List<ApplicationDescription>> = getAllProfilesVisibleApps() + .map { it + getAllProfilesHiddenSystemApps() + getAllProfilesACApps()} + fun getApplicationDescription(appUid: Int): ApplicationDescription? { - return appDescriptions.value.first.find { it.uid == appUid } + return allProfilesAppDescriptions.value.first.find { it.uid == appUid } } - fun foldForHiddenSystemApp(appUid: Int, appValueGetter: (Int) -> Int): Int { + fun foldForHiddenApp(appUid: Int, appValueGetter: (Int) -> Int): Int { return if (appUid == dummySystemApp.uid) { getAllProfilesHiddenSystemApps().fold(0) { acc, app -> acc + appValueGetter(app.uid) } + } else if (appUid == dummyAppsCompatibilityApp.uid) { + getAllProfilesACApps().fold(0) { acc, app -> + acc + appValueGetter(app.uid) + } } else appValueGetter(appUid) } - private val pm get() = context.packageManager + fun anyForHiddenApps(appUid: Int, test: (Int) -> Boolean): Boolean { + return if (appUid == dummySystemApp.uid) { + getAllProfilesHiddenSystemApps().any { test(it.uid) } + } else if (appUid == dummyAppsCompatibilityApp.uid) { + getAllProfilesACApps().any { test(it.uid) } + } else test(appUid) + } + + fun applyForHiddenApps(appUid: Int, action: (Int) -> Unit) { + if (appUid == dummySystemApp.uid) { + getAllProfilesHiddenSystemApps().forEach { action(it.uid) } + } else if (appUid == dummyAppsCompatibilityApp.uid) { + getAllProfilesACApps().forEach { action(it.uid) } + } else action(appUid) + } + + + private val pm get() = context.packageManager private val appDescriptions = MutableStateFlow( Pair( @@ -138,7 +179,8 @@ class AppListsRepository( ) private val allProfilesAppDescriptions = MutableStateFlow( - Pair( + Triple( + emptyList<ApplicationDescription>(), emptyList<ApplicationDescription>(), emptyList<ApplicationDescription>() ) @@ -164,5 +206,23 @@ class AppListsRepository( return false } + private fun isStandardApp(app: ApplicationInfo, launcherApps: List<String>): Boolean { + return when { + app.packageName == PNAME_SETTINGS -> false + app.packageName in appsCompatibiltyPNames -> false + app.hasFlag(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) -> true + !app.hasFlag(ApplicationInfo.FLAG_SYSTEM) -> true + launcherApps.contains(app.packageName) -> true + else -> false + } + } + + private fun isHiddenSystemApp(app: ApplicationInfo, launcherApps: List<String>): Boolean { + return when { + app.packageName in appsCompatibiltyPNames -> false + else -> !isNotHiddenSystemApp(app, launcherApps) + } + } + private fun ApplicationInfo.hasFlag(flag: Int) = (flags and flag) == 1 } |
