diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index 15fc83d8..4358f369 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -29,6 +29,7 @@ import android.util.Log; import org.lsposed.lspd.Application; import org.lsposed.lspd.utils.ParceledListSlice; +import org.lsposed.lspd.utils.UserInfo; import org.lsposed.manager.adapters.ScopeAdapter; import org.lsposed.manager.receivers.LSPManagerServiceClient; @@ -232,7 +233,7 @@ public class ConfigManager { } } - public static int[] getUsers() { + public static List getUsers() { try { return LSPManagerServiceClient.getUsers(); } catch (RemoteException | NullPointerException e) { diff --git a/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java b/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java index 0a11d485..4cad8981 100644 --- a/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java +++ b/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java @@ -29,6 +29,7 @@ import android.os.RemoteException; import org.lsposed.lspd.Application; import org.lsposed.lspd.ILSPManagerService; import org.lsposed.lspd.utils.ParceledListSlice; +import org.lsposed.lspd.utils.UserInfo; import java.util.List; @@ -156,7 +157,7 @@ public class LSPManagerServiceClient { return service.isSepolicyLoaded(); } - public static int[] getUsers() throws RemoteException, NullPointerException { + public static List getUsers() throws RemoteException, NullPointerException { ensureService(); return service.getUsers(); } diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java index 8cafbdc1..7e776609 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java @@ -66,6 +66,7 @@ import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayoutMediator; +import org.lsposed.lspd.utils.UserInfo; import org.lsposed.manager.ConfigManager; import org.lsposed.manager.R; import org.lsposed.manager.adapters.AppHelper; @@ -138,23 +139,23 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi }); binding.fab.setOnClickListener(view -> { - var pickAdaptor = new ModuleAdapter(0, true); + var pickAdaptor = new ModuleAdapter(null, true); var position = binding.viewPager.getCurrentItem(); var snapshot = adapters.get(position).snapshot().stream().map(m -> m.packageName).collect(Collectors.toSet()); - var userId = adapters.get(position).getUserId(); + var user = adapters.get(position).getUser(); pickAdaptor.setFilter(m -> !snapshot.contains(m.packageName)); pickAdaptor.refresh(); var v = DialogRecyclerviewBinding.inflate(getLayoutInflater()).getRoot(); v.setAdapter(pickAdaptor); v.setLayoutManager(new LinearLayoutManagerFix(ModulesActivity.this)); var dialog = new AlertDialog.Builder(ModulesActivity.this) - .setTitle(getString(R.string.install_to_user, userId)) + .setTitle(getString(R.string.install_to_user, user.name)) .setView(v) .setNegativeButton(android.R.string.cancel, null) .show(); pickAdaptor.setOnPickListener(picked -> { var module = (ModuleUtil.InstalledModule) picked.getTag(); - installModuleToUser(module, userId); + installModuleToUser(module, user); dialog.dismiss(); }); }); @@ -197,24 +198,24 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi @Override protected void onResume() { super.onResume(); - int[] userIds = ConfigManager.getUsers(); - if (userIds != null) { - if (userIds.length != adapters.size()) { + var users = ConfigManager.getUsers(); + if (users != null) { + if (users.size() != adapters.size()) { adapters.clear(); - if (userIds.length != 1) { + if (users.size() != 1) { binding.viewPager.setUserInputEnabled(true); ArrayList titles = new ArrayList<>(); - for (int userId : userIds) { - var adapter = new ModuleAdapter(userId); + for (var user : users) { + var adapter = new ModuleAdapter(user); adapter.setHasStableIds(true); adapters.add(adapter); - titles.add(getString(R.string.user_title, userId)); + titles.add(user.name); } new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach(); binding.tabLayout.setVisibility(View.VISIBLE); } else { binding.viewPager.setUserInputEnabled(false); - var adapter = new ModuleAdapter(0); + var adapter = new ModuleAdapter(null); adapter.setHasStableIds(true); adapters.add(adapter); binding.tabLayout.setVisibility(View.GONE); @@ -251,15 +252,15 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi return super.onOptionsItemSelected(item); } - private void installModuleToUser(ModuleUtil.InstalledModule module, int userId) { + private void installModuleToUser(ModuleUtil.InstalledModule module, UserInfo user) { new AlertDialog.Builder(this) - .setTitle(getString(R.string.install_to_user, userId)) - .setMessage(getString(R.string.install_to_user_message, module.getAppName(), userId)) + .setTitle(getString(R.string.install_to_user, user.name)) + .setMessage(getString(R.string.install_to_user_message, module.getAppName(), user.name)) .setPositiveButton(android.R.string.ok, (dialog, which) -> workHandler.post(() -> { - var success = ConfigManager.installExistingPackageAsUser(module.packageName, userId); + var success = ConfigManager.installExistingPackageAsUser(module.packageName, user.id); runOnUiThread(() -> { - String text = success ? getString(R.string.module_installed, module.getAppName(), userId) : getString(R.string.module_install_failed); + String text = success ? getString(R.string.module_installed, module.getAppName(), user.name) : getString(R.string.module_install_failed); if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { Snackbar.make(binding.snackbar, text, Snackbar.LENGTH_SHORT).show(); } else { @@ -267,7 +268,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi } }); if (success) - moduleUtil.reloadSingleModule(module.packageName, userId); + moduleUtil.reloadSingleModule(module.packageName, user.id); })) .setNegativeButton(android.R.string.cancel, null) .show(); @@ -328,9 +329,6 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi intent.putExtra("moduleName", selectedModule.getAppName()); startActivity(intent); return true; - } else if (item.getGroupId() == 1) { - installModuleToUser(selectedModule, itemId); - return true; } return super.onContextItemSelected(item); } @@ -383,24 +381,24 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter implements Filterable { private final ConcurrentLinkedQueue searchList = new ConcurrentLinkedQueue<>(); private final List showList = new ArrayList<>(); - private final int userId; + private final UserInfo user; private final boolean isPick; private boolean isLoaded; private View.OnClickListener onPickListener; private Predicate customFilter = m -> true; - ModuleAdapter(int userId) { - this(userId, false); + ModuleAdapter(UserInfo user) { + this(user, false); } - ModuleAdapter(int userId, boolean isPick) { - this.userId = userId; + ModuleAdapter(UserInfo user, boolean isPick) { + this.user = user; this.isPick = isPick; } - public int getUserId() { - return userId; + public UserInfo getUser() { + return user; } @NonNull @@ -488,11 +486,14 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi menu.removeItem(R.id.menu_repo); } if (item.userId == 0) { - int[] users = ConfigManager.getUsers(); + var users = ConfigManager.getUsers(); if (users != null) { - for (int profile : users) { - if (ModuleUtil.getInstance().getModule(item.packageName, profile) == null) { - menu.add(1, profile, 0, getString(R.string.install_to_user, profile)); + for (var user : users) { + if (ModuleUtil.getInstance().getModule(item.packageName, user.id) == null) { + menu.add(1, user.id, 0, getString(R.string.install_to_user, user.name)).setOnMenuItemClickListener(i -> { + installModuleToUser(selectedModule, user); + return true; + }); } } } @@ -548,7 +549,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi private final Runnable reloadModules = new Runnable() { public void run() { - var tmpList = moduleUtil.getModules().values().stream().filter(module -> module.userId == userId).filter(customFilter).collect(Collectors.toCollection(ArrayList::new)); + var tmpList = moduleUtil.getModules().values().stream().filter(module -> user == null || module.userId == user.id).filter(customFilter).collect(Collectors.toCollection(ArrayList::new)); Comparator cmp = AppHelper.getAppListComparator(0, pm); tmpList.sort((a, b) -> { boolean aChecked = moduleUtil.isModuleEnabled(a.packageName); diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c743b717..99812adf 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -85,9 +85,9 @@ Desinstalado %1$s Fallo en la desinstalación Usuario %d - Instalar al usuario %d - ¿Quieres instalar %1$s al usuario %2$d? Se recomienda que lo instales manualmente; forzar la instalación a través de LSPosed puede causar problemas. - %1$s instalado %2$d + Instalar al usuario %s + ¿Quieres instalar %1$s al usuario %2$s? Se recomienda que lo instales manualmente; forzar la instalación a través de LSPosed puede causar problemas. + %1$s instalado %2$s Fallo en la instalación diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c4ca51b3..35eba372 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -86,11 +86,11 @@ Voulez-vous installer ce module? Désinstallation de %1$s Échec de la désinstallation - Ajout de %1$s à l’utilisateur %2$d + Ajout de %1$s à l’utilisateur %2$s Échec de l\’ajout du module Utilisateur %d - Installation dans utilisateur %d - Vous voulez installer %1$s dans l’utilisateur %2$d? Il est recommandé de l’installer manuellement, fercer l’installation via LSPosed pourrait causer des problèmes. + Installation dans utilisateur %s + Vous voulez installer %1$s dans l’utilisateur %2$s? Il est recommandé de l’installer manuellement, fercer l’installation via LSPosed pourrait causer des problèmes. Ré-optimiser diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 99ec8439..a4b38909 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -87,11 +87,11 @@ %1$s 제거됨 제거 실패 - %2$d 사용자에 %1$s 추가 + %2$s 사용자에 %1$s 추가 모듈 추가 실패 사용자 %d - %d 사용자에게 설치 - %2$d 사용자에게 %1$s을(를) 설치하시겠습니까? 수동으로 설치하는 것이 좋습니다. LSPosed를 통해 강제로 설치하면 문제가 발생할 수 있습니다. + %s 사용자에게 설치 + %2$s 사용자에게 %1$s을(를) 설치하시겠습니까? 수동으로 설치하는 것이 좋습니다. LSPosed를 통해 강제로 설치하면 문제가 발생할 수 있습니다. 다시 최적화 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d2fb88cf..dbc6c020 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -178,10 +178,10 @@ Gekopieerd ¯\\\\_(ツ)_\/¯\nNiets hier Module toevoegen aan gebruiker - Toegevoegd %1$s naar gebruiker %2$d + Toegevoegd %1$s naar gebruiker %2$s Het toevoegen van de module is mislukt Gebruiker %d - Installeer naar gebruiker %d - Wil je installeren %1$s naar gebruiker %2$d? Het wordt aanbevolen om handmatig te installeren, het forceren van installatie via LSPosed kan problemen veroorzaken. + Installeer naar gebruiker %s + Wil je installeren %1$s naar gebruiker %2$s? Het wordt aanbevolen om handmatig te installeren, het forceren van installatie via LSPosed kan problemen veroorzaken. Pandemic-XDA]]> diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index fe5061de..440e9c27 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -86,11 +86,11 @@ Você quer desinstalar este módulo? Desinstalado %1$s Falha ao desinstalar - Adicionado %1$s ao usuário %2$d + Adicionado %1$s ao usuário %2$s Falha ao adicinar módulo Usuário %d - Instalar ao usuário %d - Deseja instalar %1$s ao usuário %2$d? Recomenda-se instalar manualmente, forçar a instalação via LSPosed pode causar problemas. + Instalar ao usuário %s + Deseja instalar %1$s ao usuário %2$s? Recomenda-se instalar manualmente, forçar a instalação via LSPosed pode causar problemas. Re-otimizar diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index cb7245f4..840b8582 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -87,9 +87,9 @@ 已卸载%1$s 卸载失败 用户 %d - 安装到用户 %d - 要安装 %1$s 到用户 %2$d 吗?建议手动安装或多开,通过 LSPosed 强制安装可能会出现问题。 - 已安装 %1$s 到用户 %2$d + 安装到用户 %s + 要安装 %1$s 到用户 %2$s 吗?建议手动安装或多开,通过 LSPosed 强制安装可能会出现问题。 + 已安装 %1$s 到用户 %2$s 安装失败 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a19fe4ff..9340fba5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -86,11 +86,11 @@ 您確定要移除此模組嗎? 已移除 %1$s 移除失敗 - 已安裝 %1$s 到使用者 %2$d + 已安裝 %1$s 到使用者 %2$s 安裝模組失敗 使用者 %d - 安裝到使用者 %d - 要安裝 %1$s 到使用者 %2$d 嗎?建議手動安裝或多開,透過 LSPosed 強制安裝可能會出現問題。 + 安裝到使用者 %s + 要安裝 %1$s 到使用者 %2$s 嗎?建議手動安裝或多開,透過 LSPosed 強制安裝可能會出現問題。 重新最佳化 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f7bb6c7..3be30ea8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,11 +86,11 @@ Do you want to uninstall this module? Uninstalled %1$s Uninstall unsuccessful - Added %1$s to user %2$d + Added %1$s to user %2$s Adding module failed User %d - Install to user %d - Want to install %1$s to user %2$d? It is recommended to install manually, forcing installation via LSPosed may cause problems. + Install to user %s + Want to install %1$s to user %2$s? It is recommended to install manually, forcing installation via LSPosed may cause problems. Re-optimize diff --git a/build.gradle.kts b/build.gradle.kts index e59bb5a2..ae60c5d9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:7.0.0-beta02") + classpath("com.android.tools.build:gradle:7.0.0-beta03") classpath("org.eclipse.jgit:org.eclipse.jgit:5.10.0.202012080955-r") classpath(kotlin("gradle-plugin", version = "1.4.32")) } @@ -37,7 +37,7 @@ val commitCount = Git(repo).log().add(refId).call().count() val defaultManagerPackageName by extra("org.lsposed.manager") val verCode by extra(commitCount + 4200) -val verName by extra("v1.4.2") +val verName by extra("v1.4.3") val androidTargetSdkVersion by extra(30) val androidMinSdkVersion by extra(27) val androidBuildToolsVersion by extra("30.0.3") 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 c614e47c..f53cb1f0 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -420,7 +420,7 @@ public class ConfigManager { if (module_pkg.equals(app.packageName)) { var appId = processScope.uid % PER_USER_RANGE; for (var user : UserService.getUsers()) { - cachedScope.computeIfAbsent(new ProcessScope(processScope.processName, user * PER_USER_RANGE + appId), + cachedScope.computeIfAbsent(new ProcessScope(processScope.processName, user.id * PER_USER_RANGE + appId), ignored -> new HashMap<>()).put(module_pkg, apk_path); } } 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 7fcda768..e2087650 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -38,8 +38,10 @@ import org.lsposed.lspd.Application; import org.lsposed.lspd.BuildConfig; import org.lsposed.lspd.ILSPManagerService; import org.lsposed.lspd.utils.ParceledListSlice; +import org.lsposed.lspd.utils.UserInfo; import java.lang.reflect.InvocationTargetException; +import java.util.LinkedList; import java.util.List; import de.robv.android.xposed.XposedBridge; @@ -206,8 +208,15 @@ public class LSPManagerService extends ILSPManagerService.Stub { } @Override - public int[] getUsers() throws RemoteException { - return UserService.getUsers(); + public List getUsers() throws RemoteException { + var users = new LinkedList(); + for(var user: UserService.getUsers()){ + var info = new UserInfo(); + info.id = user.id; + info.name = user.name; + users.add(info); + } + return users; } @Override diff --git a/core/src/main/java/org/lsposed/lspd/service/PackageService.java b/core/src/main/java/org/lsposed/lspd/service/PackageService.java index 72c2568d..9fcb8328 100644 --- a/core/src/main/java/org/lsposed/lspd/service/PackageService.java +++ b/core/src/main/java/org/lsposed/lspd/service/PackageService.java @@ -112,9 +112,9 @@ public class PackageService { IPackageManager pm = getPackageManager(); Map res = new HashMap<>(); if (pm == null) return res; - for (int userId : UserService.getUsers()) { - var info = pm.getPackageInfo(packageName, flags, userId); - if (info != null && info.applicationInfo != null) res.put(userId, info); + for (var user : UserService.getUsers()) { + var info = pm.getPackageInfo(packageName, flags, user.id); + if (info != null && info.applicationInfo != null) res.put(user.id, info); } return res; } @@ -135,8 +135,8 @@ public class PackageService { List res = new ArrayList<>(); IPackageManager pm = getPackageManager(); if (pm == null) return ParceledListSlice.emptyList(); - for (int userId : UserService.getUsers()) { - res.addAll(pm.getInstalledPackages(flags, userId).getList()); + for (var user : UserService.getUsers()) { + res.addAll(pm.getInstalledPackages(flags, user.id).getList()); } if (filterNoProcess) { res = res.stream().filter(packageInfo -> { diff --git a/core/src/main/java/org/lsposed/lspd/service/UserService.java b/core/src/main/java/org/lsposed/lspd/service/UserService.java index 71e323c3..048ef7d4 100644 --- a/core/src/main/java/org/lsposed/lspd/service/UserService.java +++ b/core/src/main/java/org/lsposed/lspd/service/UserService.java @@ -29,6 +29,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; public class UserService { @@ -58,10 +60,10 @@ public class UserService { return um; } - public static int[] getUsers() throws RemoteException { + public static List getUsers() throws RemoteException { IUserManager um = getUserManager(); - if (um == null) return new int[0]; - List users; + List users = new LinkedList<>(); + if (um == null) return users; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { users = um.getUsers(true, true, true); } else { @@ -71,12 +73,7 @@ public class UserService { users = um.getUsers(true, true, true); } } - int[] userArray = new int[users.size()]; - for (int i = 0; i < users.size(); i++) { - UserInfo uh = users.get(i); - userArray[i] = uh.id; - } - return userArray; + return users; } public static int getProfileParent(int userId) throws RemoteException { diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java b/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java index 503920b5..2e73eec6 100644 --- a/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java +++ b/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java @@ -2,4 +2,5 @@ package android.content.pm; public class UserInfo { public int id; + public String name; } diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl index 29d00bbf..70fd25c6 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl @@ -1,6 +1,7 @@ package org.lsposed.lspd; import org.lsposed.lspd.utils.ParceledListSlice; +import org.lsposed.lspd.utils.UserInfo; import org.lsposed.lspd.Application; @@ -47,7 +48,7 @@ interface ILSPManagerService { boolean isSepolicyLoaded() = 26; - int[] getUsers() = 27; + List getUsers() = 27; int installExistingPackageAsUser(String packageName, int userId) = 28; diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl new file mode 100644 index 00000000..4f960932 --- /dev/null +++ b/manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl @@ -0,0 +1,6 @@ +package org.lsposed.lspd.utils; + +parcelable UserInfo { + int id; + String name; +}