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 13dfe951..37c2d0fe 100644 --- a/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java +++ b/app/src/main/java/org/lsposed/manager/util/ModuleUtil.java @@ -112,6 +112,7 @@ public final class ModuleUtil { } catch (NameNotFoundException e) { InstalledModule old = installedModules.remove(Pair.create(packageName, userId)); if (old != null) { + enabledModules.remove(packageName); for (ModuleListener listener : listeners) { listener.onSingleInstalledModuleReloaded(); } diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java index c798ee3d..1654f2e2 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -772,11 +772,13 @@ public class ConfigManager { } } - public void removeModule(String packageName) { + public boolean removeModule(String packageName) { if (removeModuleWithoutCache(packageName)) { // called by oneway binder updateCaches(true); + return true; } + return false; } private boolean removeModuleWithoutCache(String packageName) { @@ -936,11 +938,11 @@ public class ConfigManager { } // this is slow, avoid using it - public boolean isModule(int uid) { + public String getModule(int uid) { for (var module : cachedModule.values()) { - if (module.appId == uid % PER_USER_RANGE) return true; + if (module.appId == uid % PER_USER_RANGE) return module.packageName; } - return false; + return null; } public boolean isModule(int uid, String name) { diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java index 6c107631..e59b6105 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java @@ -79,7 +79,7 @@ public class LSPosedService extends ILSPosedService.Stub { if (userId == USER_NULL) userId = uid % PER_USER_RANGE; Uri uri = intent.getData(); - String moduleName = (uri != null) ? uri.getSchemeSpecificPart() : null; + String moduleName = (uri != null) ? uri.getSchemeSpecificPart() : ConfigManager.getInstance().getModule(uid); ApplicationInfo applicationInfo = null; if (moduleName != null) { @@ -100,7 +100,8 @@ public class LSPosedService extends ILSPosedService.Stub { // for module, remove module // because we only care about when the apk is gone if (moduleName != null) - ConfigManager.getInstance().removeModule(moduleName); + if (ConfigManager.getInstance().removeModule(moduleName)) + isXposedModule = true; break; } case Intent.ACTION_PACKAGE_ADDED: @@ -123,7 +124,7 @@ public class LSPosedService extends ILSPosedService.Stub { case Intent.ACTION_UID_REMOVED: { // when a package is removed (rather than hide) for a single user // (apk may still be there because of multi-user) - if (ConfigManager.getInstance().isModule(uid)) { + if (isXposedModule) { // it will automatically remove obsolete scope from database ConfigManager.getInstance().updateCache(); } else if (ConfigManager.getInstance().isUidHooked(uid)) { @@ -134,8 +135,10 @@ public class LSPosedService extends ILSPosedService.Stub { } } if (isXposedModule) { + Log.d(TAG, "module " + moduleName + " changed, dispatching to manager"); boolean enabled = Arrays.asList(ConfigManager.getInstance().enabledModules()).contains(moduleName); - Intent broadcastIntent = new Intent(enabled ? "org.lsposed.action.MODULE_UPDATED" : "org.lsposed.action.MODULE_NOT_ACTIVATAED"); + boolean removed = intent.getAction().equals(Intent.ACTION_PACKAGE_FULLY_REMOVED) || intent.getAction().equals(Intent.ACTION_UID_REMOVED); + Intent broadcastIntent = new Intent(enabled || removed ? "org.lsposed.action.MODULE_UPDATED" : "org.lsposed.action.MODULE_NOT_ACTIVATAED"); broadcastIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); broadcastIntent.addFlags(0x01000000); broadcastIntent.addFlags(0x00400000);