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 {
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<LauncherApp> {
private fun getApplications(packageName: String, userHandle: UserHandle): List<LauncherApp> {
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"

View File

@ -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"
}