Fix suspended app badges

Fix #746
This commit is contained in:
MM20 2024-05-23 21:46:33 +02:00
parent c8a9e551f2
commit 3ee298a32f
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 37 additions and 23 deletions

View File

@ -58,8 +58,9 @@ internal class AppRepositoryImpl(
) { ) {
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
installedApps.value = val apps = installedApps.value.toMutableList()
installedApps.value.filter { !packageNames.contains(it.componentName.packageName) } apps.removeAll { packageNames.contains(it.componentName.packageName) && it.user == user }
installedApps.value = apps
} }
} }
} }
@ -68,8 +69,8 @@ internal class AppRepositoryImpl(
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
val apps = installedApps.value.toMutableList() val apps = installedApps.value.toMutableList()
apps.removeAll { packageName == it.componentName.packageName } apps.removeAll { packageName == it.componentName.packageName && it.user == user }
apps.addAll(getApplications(packageName)) apps.addAll(getApplications(packageName, user))
installedApps.value = apps installedApps.value = apps
} }
} }
@ -84,7 +85,7 @@ internal class AppRepositoryImpl(
mutex.withLock { mutex.withLock {
val apps = installedApps.value.toMutableList() val apps = installedApps.value.toMutableList()
for (packageName in packageNames) { for (packageName in packageNames) {
apps.addAll(getApplications(packageName)) apps.addAll(getApplications(packageName, user))
} }
installedApps.value = apps installedApps.value = apps
} }
@ -95,7 +96,7 @@ internal class AppRepositoryImpl(
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
val apps = installedApps.value.toMutableList() val apps = installedApps.value.toMutableList()
apps.addAll(getApplications(packageName)) apps.addAll(getApplications(packageName, user))
installedApps.value = apps installedApps.value = apps
} }
} }
@ -104,8 +105,9 @@ internal class AppRepositoryImpl(
override fun onPackageRemoved(packageName: String, user: UserHandle) { override fun onPackageRemoved(packageName: String, user: UserHandle) {
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
installedApps.value = val apps = installedApps.value.toMutableList()
installedApps.value.filter { packageName != (it.componentName.packageName) || it.user != user } apps.removeAll { packageName == it.componentName.packageName && it.user == user }
installedApps.value = apps
} }
} }
@ -123,13 +125,15 @@ internal class AppRepositoryImpl(
packageNames ?: return packageNames ?: return
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
installedApps.value = installedApps.value.map { val apps = installedApps.value.toMutableList()
if (packageNames.contains(it.componentName.packageName)) { apps.replaceAll {
if (packageNames.contains(it.componentName.packageName) && it.user == user) {
it.copy(isSuspended = true) it.copy(isSuspended = true)
} else { } else {
it it
} }
} }
installedApps.value = apps
} }
} }
} }
@ -141,13 +145,15 @@ internal class AppRepositoryImpl(
packageNames ?: return packageNames ?: return
scope.launch { scope.launch {
mutex.withLock { mutex.withLock {
installedApps.value = installedApps.value.map { val apps = installedApps.value.toMutableList()
if (packageNames.contains(it.componentName.packageName)) { apps.replaceAll {
if (packageNames.contains(it.componentName.packageName) && it.user == user) {
it.copy(isSuspended = false) it.copy(isSuspended = false)
} else { } else {
it it
} }
} }
installedApps.value = apps
} }
} }
} }
@ -157,7 +163,7 @@ internal class AppRepositoryImpl(
mutex.withLock { mutex.withLock {
val apps = profiles.map { p -> val apps = profiles.map { p ->
try { try {
launcherApps.getActivityList(null, p).mapNotNull { getApplication(it, p) } launcherApps.getActivityList(null, p).mapNotNull { getApplication(it) }
} catch (e: SecurityException) { } catch (e: SecurityException) {
emptyList() emptyList()
} }
@ -167,22 +173,20 @@ internal class AppRepositoryImpl(
} }
} }
private fun getApplications(packageName: String): List<LauncherApp> { private fun getApplications(packageName: String, userHandle: UserHandle): List<LauncherApp> {
if (packageName == context.packageName) return emptyList() if (packageName == context.packageName) return emptyList()
return profiles.map { p -> return try {
try { launcherApps.getActivityList(packageName, userHandle)
launcherApps.getActivityList(packageName, p).mapNotNull { getApplication(it, p) } .mapNotNull { getApplication(it) }
} catch (e: SecurityException) { } catch (e: SecurityException) {
emptyList() emptyList()
} }
}.flatten()
} }
private fun getApplication( private fun getApplication(
launcherActivityInfo: LauncherActivityInfo, launcherActivityInfo: LauncherActivityInfo
profile: UserHandle
): LauncherApp? { ): LauncherApp? {
if (launcherActivityInfo.applicationInfo.packageName == context.packageName && !context.packageName.endsWith( if (launcherActivityInfo.applicationInfo.packageName == context.packageName && !context.packageName.endsWith(
".debug" ".debug"

View File

@ -1,5 +1,6 @@
package de.mm20.launcher2.applications package de.mm20.launcher2.applications
import android.app.admin.DevicePolicyManager
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
@ -51,6 +52,7 @@ internal data class LauncherApp(
constructor(context: Context, launcherActivityInfo: LauncherActivityInfo) : this( constructor(context: Context, launcherActivityInfo: LauncherActivityInfo) : this(
launcherActivityInfo, launcherActivityInfo,
versionName = getPackageVersionName(context, launcherActivityInfo.applicationInfo.packageName), versionName = getPackageVersionName(context, launcherActivityInfo.applicationInfo.packageName),
isSuspended = launcherActivityInfo.applicationInfo.flags and ApplicationInfo.FLAG_SUSPENDED != 0,
userSerialNumber = launcherActivityInfo.user.getSerialNumber(context) 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" const val Domain = "app"
} }