From 3ee298a32f31824413f99e702c1346b6480f34cd Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Thu, 23 May 2024 21:46:33 +0200 Subject: [PATCH] Fix suspended app badges Fix #746 --- .../launcher2/applications/AppRepository.kt | 50 ++++++++++--------- .../launcher2/applications/LauncherApp.kt | 10 ++++ 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/data/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt b/data/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt index 16af3d6f..fcb5f7c6 100644 --- a/data/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt +++ b/data/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt @@ -58,8 +58,9 @@ internal class AppRepositoryImpl( ) { scope.launch { mutex.withLock { - installedApps.value = - installedApps.value.filter { !packageNames.contains(it.componentName.packageName) } + val apps = installedApps.value.toMutableList() + apps.removeAll { packageNames.contains(it.componentName.packageName) && it.user == user } + installedApps.value = apps } } } @@ -68,8 +69,8 @@ internal class AppRepositoryImpl( scope.launch { mutex.withLock { val apps = installedApps.value.toMutableList() - apps.removeAll { packageName == it.componentName.packageName } - apps.addAll(getApplications(packageName)) + apps.removeAll { packageName == it.componentName.packageName && it.user == user } + apps.addAll(getApplications(packageName, user)) installedApps.value = apps } } @@ -84,7 +85,7 @@ internal class AppRepositoryImpl( mutex.withLock { val apps = installedApps.value.toMutableList() for (packageName in packageNames) { - apps.addAll(getApplications(packageName)) + apps.addAll(getApplications(packageName, user)) } installedApps.value = apps } @@ -95,7 +96,7 @@ internal class AppRepositoryImpl( scope.launch { mutex.withLock { val apps = installedApps.value.toMutableList() - apps.addAll(getApplications(packageName)) + apps.addAll(getApplications(packageName, user)) installedApps.value = apps } } @@ -104,8 +105,9 @@ internal class AppRepositoryImpl( override fun onPackageRemoved(packageName: String, user: UserHandle) { scope.launch { mutex.withLock { - installedApps.value = - installedApps.value.filter { packageName != (it.componentName.packageName) || it.user != user } + val apps = installedApps.value.toMutableList() + apps.removeAll { packageName == it.componentName.packageName && it.user == user } + installedApps.value = apps } } @@ -123,13 +125,15 @@ internal class AppRepositoryImpl( packageNames ?: return scope.launch { mutex.withLock { - installedApps.value = installedApps.value.map { - if (packageNames.contains(it.componentName.packageName)) { + val apps = installedApps.value.toMutableList() + apps.replaceAll { + if (packageNames.contains(it.componentName.packageName) && it.user == user) { it.copy(isSuspended = true) } else { it } } + installedApps.value = apps } } } @@ -141,13 +145,15 @@ internal class AppRepositoryImpl( packageNames ?: return scope.launch { mutex.withLock { - installedApps.value = installedApps.value.map { - if (packageNames.contains(it.componentName.packageName)) { + val apps = installedApps.value.toMutableList() + apps.replaceAll { + if (packageNames.contains(it.componentName.packageName) && it.user == user) { it.copy(isSuspended = false) } else { it } } + installedApps.value = apps } } } @@ -157,7 +163,7 @@ internal class AppRepositoryImpl( mutex.withLock { val apps = profiles.map { p -> try { - launcherApps.getActivityList(null, p).mapNotNull { getApplication(it, p) } + launcherApps.getActivityList(null, p).mapNotNull { getApplication(it) } } catch (e: SecurityException) { emptyList() } @@ -167,22 +173,20 @@ internal class AppRepositoryImpl( } } - private fun getApplications(packageName: String): List { + private fun getApplications(packageName: String, userHandle: UserHandle): List { if (packageName == context.packageName) return emptyList() - return profiles.map { p -> - try { - launcherApps.getActivityList(packageName, p).mapNotNull { getApplication(it, p) } - } catch (e: SecurityException) { - emptyList() - } - }.flatten() + return try { + launcherApps.getActivityList(packageName, userHandle) + .mapNotNull { getApplication(it) } + } catch (e: SecurityException) { + emptyList() + } } private fun getApplication( - launcherActivityInfo: LauncherActivityInfo, - profile: UserHandle + launcherActivityInfo: LauncherActivityInfo ): LauncherApp? { if (launcherActivityInfo.applicationInfo.packageName == context.packageName && !context.packageName.endsWith( ".debug" diff --git a/data/applications/src/main/java/de/mm20/launcher2/applications/LauncherApp.kt b/data/applications/src/main/java/de/mm20/launcher2/applications/LauncherApp.kt index 1e6a7a13..c1216ec8 100644 --- a/data/applications/src/main/java/de/mm20/launcher2/applications/LauncherApp.kt +++ b/data/applications/src/main/java/de/mm20/launcher2/applications/LauncherApp.kt @@ -1,5 +1,6 @@ package de.mm20.launcher2.applications +import android.app.admin.DevicePolicyManager import android.content.ActivityNotFoundException import android.content.ComponentName import android.content.Context @@ -51,6 +52,7 @@ internal data class LauncherApp( constructor(context: Context, launcherActivityInfo: LauncherActivityInfo) : this( launcherActivityInfo, versionName = getPackageVersionName(context, launcherActivityInfo.applicationInfo.packageName), + isSuspended = launcherActivityInfo.applicationInfo.flags and ApplicationInfo.FLAG_SUSPENDED != 0, userSerialNumber = launcherActivityInfo.user.getSerialNumber(context) ) @@ -266,6 +268,14 @@ internal data class LauncherApp( } } + fun isSuspended(context: Context, packageName: String): Boolean { + return try { + context.packageManager.getApplicationInfo(packageName, 0).flags and ApplicationInfo.FLAG_SUSPENDED != 0 + } catch (e: PackageManager.NameNotFoundException) { + false + } + } + const val Domain = "app" }