aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/foundation/e/privacycentralapp/data
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/data')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt94
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
}