diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index 593abba3..827950d6 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -109,6 +109,10 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter(checkedList); + if (isChecked && !tmpChkList.isEmpty() && !ConfigManager.setModuleScope(module.packageName, tmpChkList)) { + return false; + } enabled = isChecked; notifyDataSetChanged(); return true; @@ -200,6 +204,10 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter { var tmpChkList = new HashSet<>(checkedList); tmpChkList.removeIf(i -> i.userId == module.userId); @@ -514,9 +522,6 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter scope = new HashSet<>(); for (int j = 0; j < scopeArray.length(); j++) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8308c26f..b4e27c32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,7 +133,7 @@ Games Modules Denylist - Failed save scope list + Failed to save scope list %1$s\nVersion %2$s Recommended You did not select any app. Select recommended apps? 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 3fbf2c19..0fc6b7cc 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -711,21 +711,21 @@ public class ConfigManager { } } - public boolean setModuleScope(String packageName, List scopes) { + public boolean setModuleScope(String packageName, List scopes) throws RemoteException { if (scopes == null) return false; + enableModule(packageName); int mid = getModuleId(packageName); if (mid == -1) return false; Application self = new Application(); self.packageName = packageName; self.userId = 0; scopes.add(self); - int finalMid = mid; executeInTransaction(() -> { - db.delete("scope", "mid = ?", new String[]{String.valueOf(finalMid)}); + db.delete("scope", "mid = ?", new String[]{String.valueOf(mid)}); for (Application app : scopes) { if (app.packageName.equals("android") && app.userId != 0) continue; ContentValues values = new ContentValues(); - values.put("mid", finalMid); + values.put("mid", mid); values.put("app_pkg_name", app.packageName); values.put("user_id", app.userId); db.insertWithOnConflict("scope", null, values, SQLiteDatabase.CONFLICT_IGNORE); @@ -810,8 +810,12 @@ public class ConfigManager { } } - public boolean enableModule(String packageName, ApplicationInfo info) { - if (packageName.equals("lspd") || !updateModuleApkPath(packageName, getModuleApkPath(info), false)) + public boolean enableModule(String packageName) throws RemoteException { + PackageInfo pkgInfo = PackageService.getPackageInfo(packageName, PackageService.MATCH_ALL_FLAGS, 0); + if (pkgInfo == null || pkgInfo.applicationInfo == null) { + return false; + } + if (packageName.equals("lspd") || !updateModuleApkPath(packageName, getModuleApkPath(pkgInfo.applicationInfo), false)) return false; boolean changed = executeInTransaction(() -> { ContentValues values = new ContentValues(); diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java index 62c8aa90..05f24745 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -521,16 +521,11 @@ public class LSPManagerService extends ILSPManagerService.Stub { @Override public boolean enableModule(String packageName) throws RemoteException { - PackageInfo pkgInfo = PackageService.getPackageInfo(packageName, PackageService.MATCH_ALL_FLAGS, 0); - if (pkgInfo != null && pkgInfo.applicationInfo != null) { - return ConfigManager.getInstance().enableModule(packageName, pkgInfo.applicationInfo); - } else { - return false; - } + return ConfigManager.getInstance().enableModule(packageName); } @Override - public boolean setModuleScope(String packageName, ParceledListSlice scope) { + public boolean setModuleScope(String packageName, ParceledListSlice scope) throws RemoteException { return ConfigManager.getInstance().setModuleScope(packageName, scope.getList()); } 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 2d828458..1404d756 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java @@ -115,9 +115,9 @@ public class LSPosedService extends ILSPosedService.Stub { } if (isXposedModule) { broadcastOrShowNotification(moduleName, userId, intentAction); - // When installing a new Xposed module, we update the apk path to prepare for - // the first activation of a module with a recommended scope or for a user to - // uninstall a module that has not been activated before. + // When installing a new Xposed module, we update the apk path to mark it as a + // module to send a broadcast when modules that have not been activated are + // uninstalled. ConfigManager.getInstance().updateModuleApkPath(moduleName, ConfigManager.getInstance().getModuleApkPath(applicationInfo), true); // when package is changed, we may need to update cache (module cache or process cache) ConfigManager.getInstance().updateCache();