Skip to content

Commit e19622b

Browse files
committed
perf: AppInfo.enabled
1 parent a32199b commit e19622b

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

app/src/main/kotlin/li/songe/gkd/data/AppInfo.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private val PackageInfo.isOverlay: Boolean
5858
}
5959

6060
val ApplicationInfo.isSystem: Boolean
61-
get() = flags and ApplicationInfo.FLAG_SYSTEM != 0
61+
get() = flags and ApplicationInfo.FLAG_SYSTEM != 0 || flags and ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0
6262

6363
private fun checkIfNotHasActivity(packageName: String, userId: Int): Boolean {
6464
val flags = PackageManager.MATCH_UNINSTALLED_PACKAGES or PackageManager.GET_ACTIVITIES
@@ -78,6 +78,23 @@ private fun checkIfNotHasActivity(packageName: String, userId: Int): Boolean {
7878
}
7979
}
8080

81+
private fun PackageInfo.getEnabled(userId: Int): Boolean {
82+
val enabled = applicationInfo?.enabled ?: true
83+
if (enabled) return true
84+
val state = if (userId == currentUserId) {
85+
app.packageManager.getApplicationEnabledSetting(packageName)
86+
} else {
87+
shizukuContextFlow.value.packageManager?.getApplicationEnabledSetting(
88+
packageName,
89+
currentUserId
90+
) ?: 0
91+
}
92+
return when (state) {
93+
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED -> false
94+
else -> true
95+
}
96+
}
97+
8198
// all->433 isOverlay->354 checkIfNotHasActivity->271
8299
fun PackageInfo.toAppInfo(
83100
userId: Int = currentUserId,
@@ -93,7 +110,7 @@ fun PackageInfo.toAppInfo(
93110
isSystem = isSystem,
94111
name = applicationInfo?.run { loadLabel(app.packageManager).toString() } ?: packageName,
95112
hidden = hidden ?: (isSystem && (isOverlay || checkIfNotHasActivity(packageName, userId))),
96-
enabled = applicationInfo?.enabled ?: true,
113+
enabled = getEnabled(userId),
97114
)
98115
}
99116

app/src/main/kotlin/li/songe/gkd/shizuku/PackageManager.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class SafePackageManager(private val value: IPackageManager) {
3636
fun getPackageInfo(
3737
packageName: String,
3838
flags: Int,
39-
userId: Int = currentUserId,
39+
userId: Int,
4040
): PackageInfo? = safeInvokeMethod {
4141
if (AndroidTarget.TIRAMISU) {
4242
value.getPackageInfo(packageName, flags.toLong(), userId)
@@ -45,6 +45,13 @@ class SafePackageManager(private val value: IPackageManager) {
4545
}
4646
}
4747

48+
fun getApplicationEnabledSetting(
49+
packageName: String,
50+
userId: Int,
51+
): Int = safeInvokeMethod {
52+
value.getApplicationEnabledSetting(packageName, userId)
53+
} ?: 0
54+
4855
fun grantRuntimePermission(
4956
packageName: String,
5057
permissionName: String,

hidden_api/src/main/java/android/content/pm/IPackageManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ public static IPackageManager asInterface(IBinder binder) {
3737

3838
void grantRuntimePermission(String packageName, String permissionName, int userId);
3939

40+
int getApplicationEnabledSetting(String packageName, int userId);
41+
4042
}

0 commit comments

Comments
 (0)