From 4955dcb5422fed4b41fbffde696433c5566b7b7b Mon Sep 17 00:00:00 2001 From: LoveSy Date: Fri, 4 Feb 2022 01:35:37 +0800 Subject: [PATCH] Module list from manager should use match all flag (#1621) --- .../java/org/lsposed/manager/util/ModuleUtil.java | 9 ++++++--- .../org/lsposed/lspd/service/PackageService.java | 12 +++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java b/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java index bc3c9d0d..d4781b23 100644 --- a/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java +++ b/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java @@ -56,6 +56,10 @@ public final class ModuleUtil { private Map, InstalledModule> installedModules = new HashMap<>(); private boolean modulesLoaded = false; + static final int MATCH_ANY_USER = 0x00400000; // PackageManager.MATCH_ANY_USER + + static final int MATCH_ALL_FLAGS = PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_UNINSTALLED_PACKAGES | MATCH_ANY_USER; + private ModuleUtil() { pm = App.getInstance().getPackageManager(); } @@ -93,12 +97,11 @@ public final class ModuleUtil { Map, InstalledModule> modules = new HashMap<>(); var users = ConfigManager.getUsers(); - for (PackageInfo pkg : ConfigManager.getInstalledPackagesFromAllUsers(PackageManager.GET_META_DATA, false)) { + for (PackageInfo pkg : ConfigManager.getInstalledPackagesFromAllUsers(PackageManager.GET_META_DATA | MATCH_ALL_FLAGS, false)) { ApplicationInfo app = pkg.applicationInfo; if (app.metaData != null && app.metaData.containsKey("xposedminversion")) { - InstalledModule installed = new InstalledModule(pkg); - modules.put(Pair.create(pkg.packageName, app.uid / 100000), installed); + modules.computeIfAbsent(Pair.create(pkg.packageName, app.uid / 100000), k -> new InstalledModule(pkg)); } } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/PackageService.java b/daemon/src/main/java/org/lsposed/lspd/service/PackageService.java index 63b1c87b..979e3e29 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/PackageService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/PackageService.java @@ -128,13 +128,23 @@ public class PackageService { return pm.getApplicationInfo(packageName, flags, userId); } + // Only for manager public static ParceledListSlice getInstalledPackagesFromAllUsers(int flags, boolean filterNoProcess) throws RemoteException { List res = new ArrayList<>(); IPackageManager pm = getPackageManager(); if (pm == null) return ParceledListSlice.emptyList(); for (var user : UserService.getUsers()) { // in case pkginfo of other users in primary user - res.addAll(pm.getInstalledPackages(flags, user.id).getList().parallelStream().filter(info -> info.applicationInfo != null && info.applicationInfo.uid / PER_USER_RANGE == user.id).collect(Collectors.toList())); + res.addAll(pm.getInstalledPackages(flags, user.id).getList().parallelStream() + .filter(info -> info.applicationInfo != null && info.applicationInfo.uid / PER_USER_RANGE == user.id) + .filter(info -> { + try { + return isPackageAvailable(info.packageName, user.id, true); + } catch (RemoteException e) { + return false; + } + }) + .collect(Collectors.toList())); } if (filterNoProcess) { return new ParceledListSlice<>(res.parallelStream().filter(packageInfo -> {