[app] Show user name (#688)
This commit is contained in:
parent
de98686532
commit
4035493602
|
|
@ -29,6 +29,7 @@ import android.util.Log;
|
||||||
|
|
||||||
import org.lsposed.lspd.Application;
|
import org.lsposed.lspd.Application;
|
||||||
import org.lsposed.lspd.utils.ParceledListSlice;
|
import org.lsposed.lspd.utils.ParceledListSlice;
|
||||||
|
import org.lsposed.lspd.utils.UserInfo;
|
||||||
import org.lsposed.manager.adapters.ScopeAdapter;
|
import org.lsposed.manager.adapters.ScopeAdapter;
|
||||||
import org.lsposed.manager.receivers.LSPManagerServiceClient;
|
import org.lsposed.manager.receivers.LSPManagerServiceClient;
|
||||||
|
|
||||||
|
|
@ -232,7 +233,7 @@ public class ConfigManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] getUsers() {
|
public static List<UserInfo> getUsers() {
|
||||||
try {
|
try {
|
||||||
return LSPManagerServiceClient.getUsers();
|
return LSPManagerServiceClient.getUsers();
|
||||||
} catch (RemoteException | NullPointerException e) {
|
} catch (RemoteException | NullPointerException e) {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import android.os.RemoteException;
|
||||||
import org.lsposed.lspd.Application;
|
import org.lsposed.lspd.Application;
|
||||||
import org.lsposed.lspd.ILSPManagerService;
|
import org.lsposed.lspd.ILSPManagerService;
|
||||||
import org.lsposed.lspd.utils.ParceledListSlice;
|
import org.lsposed.lspd.utils.ParceledListSlice;
|
||||||
|
import org.lsposed.lspd.utils.UserInfo;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -156,7 +157,7 @@ public class LSPManagerServiceClient {
|
||||||
return service.isSepolicyLoaded();
|
return service.isSepolicyLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] getUsers() throws RemoteException, NullPointerException {
|
public static List<UserInfo> getUsers() throws RemoteException, NullPointerException {
|
||||||
ensureService();
|
ensureService();
|
||||||
return service.getUsers();
|
return service.getUsers();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ import com.google.android.material.checkbox.MaterialCheckBox;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import com.google.android.material.tabs.TabLayoutMediator;
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
|
|
||||||
|
import org.lsposed.lspd.utils.UserInfo;
|
||||||
import org.lsposed.manager.ConfigManager;
|
import org.lsposed.manager.ConfigManager;
|
||||||
import org.lsposed.manager.R;
|
import org.lsposed.manager.R;
|
||||||
import org.lsposed.manager.adapters.AppHelper;
|
import org.lsposed.manager.adapters.AppHelper;
|
||||||
|
|
@ -138,23 +139,23 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
});
|
});
|
||||||
|
|
||||||
binding.fab.setOnClickListener(view -> {
|
binding.fab.setOnClickListener(view -> {
|
||||||
var pickAdaptor = new ModuleAdapter(0, true);
|
var pickAdaptor = new ModuleAdapter(null, true);
|
||||||
var position = binding.viewPager.getCurrentItem();
|
var position = binding.viewPager.getCurrentItem();
|
||||||
var snapshot = adapters.get(position).snapshot().stream().map(m -> m.packageName).collect(Collectors.toSet());
|
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.setFilter(m -> !snapshot.contains(m.packageName));
|
||||||
pickAdaptor.refresh();
|
pickAdaptor.refresh();
|
||||||
var v = DialogRecyclerviewBinding.inflate(getLayoutInflater()).getRoot();
|
var v = DialogRecyclerviewBinding.inflate(getLayoutInflater()).getRoot();
|
||||||
v.setAdapter(pickAdaptor);
|
v.setAdapter(pickAdaptor);
|
||||||
v.setLayoutManager(new LinearLayoutManagerFix(ModulesActivity.this));
|
v.setLayoutManager(new LinearLayoutManagerFix(ModulesActivity.this));
|
||||||
var dialog = new AlertDialog.Builder(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)
|
.setView(v)
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.show();
|
.show();
|
||||||
pickAdaptor.setOnPickListener(picked -> {
|
pickAdaptor.setOnPickListener(picked -> {
|
||||||
var module = (ModuleUtil.InstalledModule) picked.getTag();
|
var module = (ModuleUtil.InstalledModule) picked.getTag();
|
||||||
installModuleToUser(module, userId);
|
installModuleToUser(module, user);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -197,24 +198,24 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
int[] userIds = ConfigManager.getUsers();
|
var users = ConfigManager.getUsers();
|
||||||
if (userIds != null) {
|
if (users != null) {
|
||||||
if (userIds.length != adapters.size()) {
|
if (users.size() != adapters.size()) {
|
||||||
adapters.clear();
|
adapters.clear();
|
||||||
if (userIds.length != 1) {
|
if (users.size() != 1) {
|
||||||
binding.viewPager.setUserInputEnabled(true);
|
binding.viewPager.setUserInputEnabled(true);
|
||||||
ArrayList<String> titles = new ArrayList<>();
|
ArrayList<String> titles = new ArrayList<>();
|
||||||
for (int userId : userIds) {
|
for (var user : users) {
|
||||||
var adapter = new ModuleAdapter(userId);
|
var adapter = new ModuleAdapter(user);
|
||||||
adapter.setHasStableIds(true);
|
adapter.setHasStableIds(true);
|
||||||
adapters.add(adapter);
|
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();
|
new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach();
|
||||||
binding.tabLayout.setVisibility(View.VISIBLE);
|
binding.tabLayout.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
binding.viewPager.setUserInputEnabled(false);
|
binding.viewPager.setUserInputEnabled(false);
|
||||||
var adapter = new ModuleAdapter(0);
|
var adapter = new ModuleAdapter(null);
|
||||||
adapter.setHasStableIds(true);
|
adapter.setHasStableIds(true);
|
||||||
adapters.add(adapter);
|
adapters.add(adapter);
|
||||||
binding.tabLayout.setVisibility(View.GONE);
|
binding.tabLayout.setVisibility(View.GONE);
|
||||||
|
|
@ -251,15 +252,15 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void installModuleToUser(ModuleUtil.InstalledModule module, int userId) {
|
private void installModuleToUser(ModuleUtil.InstalledModule module, UserInfo user) {
|
||||||
new AlertDialog.Builder(this)
|
new AlertDialog.Builder(this)
|
||||||
.setTitle(getString(R.string.install_to_user, userId))
|
.setTitle(getString(R.string.install_to_user, user.name))
|
||||||
.setMessage(getString(R.string.install_to_user_message, module.getAppName(), userId))
|
.setMessage(getString(R.string.install_to_user_message, module.getAppName(), user.name))
|
||||||
.setPositiveButton(android.R.string.ok, (dialog, which) ->
|
.setPositiveButton(android.R.string.ok, (dialog, which) ->
|
||||||
workHandler.post(() -> {
|
workHandler.post(() -> {
|
||||||
var success = ConfigManager.installExistingPackageAsUser(module.packageName, userId);
|
var success = ConfigManager.installExistingPackageAsUser(module.packageName, user.id);
|
||||||
runOnUiThread(() -> {
|
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)) {
|
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
|
||||||
Snackbar.make(binding.snackbar, text, Snackbar.LENGTH_SHORT).show();
|
Snackbar.make(binding.snackbar, text, Snackbar.LENGTH_SHORT).show();
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -267,7 +268,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (success)
|
if (success)
|
||||||
moduleUtil.reloadSingleModule(module.packageName, userId);
|
moduleUtil.reloadSingleModule(module.packageName, user.id);
|
||||||
}))
|
}))
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.show();
|
.show();
|
||||||
|
|
@ -328,9 +329,6 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
intent.putExtra("moduleName", selectedModule.getAppName());
|
intent.putExtra("moduleName", selectedModule.getAppName());
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
} else if (item.getGroupId() == 1) {
|
|
||||||
installModuleToUser(selectedModule, itemId);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return super.onContextItemSelected(item);
|
return super.onContextItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
@ -383,24 +381,24 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<ModuleAdapter.ViewHolder> implements Filterable {
|
private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<ModuleAdapter.ViewHolder> implements Filterable {
|
||||||
private final ConcurrentLinkedQueue<ModuleUtil.InstalledModule> searchList = new ConcurrentLinkedQueue<>();
|
private final ConcurrentLinkedQueue<ModuleUtil.InstalledModule> searchList = new ConcurrentLinkedQueue<>();
|
||||||
private final List<ModuleUtil.InstalledModule> showList = new ArrayList<>();
|
private final List<ModuleUtil.InstalledModule> showList = new ArrayList<>();
|
||||||
private final int userId;
|
private final UserInfo user;
|
||||||
private final boolean isPick;
|
private final boolean isPick;
|
||||||
private boolean isLoaded;
|
private boolean isLoaded;
|
||||||
private View.OnClickListener onPickListener;
|
private View.OnClickListener onPickListener;
|
||||||
|
|
||||||
private Predicate<ModuleUtil.InstalledModule> customFilter = m -> true;
|
private Predicate<ModuleUtil.InstalledModule> customFilter = m -> true;
|
||||||
|
|
||||||
ModuleAdapter(int userId) {
|
ModuleAdapter(UserInfo user) {
|
||||||
this(userId, false);
|
this(user, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ModuleAdapter(int userId, boolean isPick) {
|
ModuleAdapter(UserInfo user, boolean isPick) {
|
||||||
this.userId = userId;
|
this.user = user;
|
||||||
this.isPick = isPick;
|
this.isPick = isPick;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getUserId() {
|
public UserInfo getUser() {
|
||||||
return userId;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|
@ -488,11 +486,14 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
|
||||||
menu.removeItem(R.id.menu_repo);
|
menu.removeItem(R.id.menu_repo);
|
||||||
}
|
}
|
||||||
if (item.userId == 0) {
|
if (item.userId == 0) {
|
||||||
int[] users = ConfigManager.getUsers();
|
var users = ConfigManager.getUsers();
|
||||||
if (users != null) {
|
if (users != null) {
|
||||||
for (int profile : users) {
|
for (var user : users) {
|
||||||
if (ModuleUtil.getInstance().getModule(item.packageName, profile) == null) {
|
if (ModuleUtil.getInstance().getModule(item.packageName, user.id) == null) {
|
||||||
menu.add(1, profile, 0, getString(R.string.install_to_user, profile));
|
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() {
|
private final Runnable reloadModules = new Runnable() {
|
||||||
public void run() {
|
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<PackageInfo> cmp = AppHelper.getAppListComparator(0, pm);
|
Comparator<PackageInfo> cmp = AppHelper.getAppListComparator(0, pm);
|
||||||
tmpList.sort((a, b) -> {
|
tmpList.sort((a, b) -> {
|
||||||
boolean aChecked = moduleUtil.isModuleEnabled(a.packageName);
|
boolean aChecked = moduleUtil.isModuleEnabled(a.packageName);
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,9 @@
|
||||||
<string name="module_uninstalled">Desinstalado %1$s</string>
|
<string name="module_uninstalled">Desinstalado %1$s</string>
|
||||||
<string name="module_uninstall_failed">Fallo en la desinstalación</string>
|
<string name="module_uninstall_failed">Fallo en la desinstalación</string>
|
||||||
<string name="user_title">Usuario %d</string>
|
<string name="user_title">Usuario %d</string>
|
||||||
<string name="install_to_user">Instalar al usuario %d</string>
|
<string name="install_to_user">Instalar al usuario %s</string>
|
||||||
<string name="install_to_user_message">¿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.</string>
|
<string name="install_to_user_message">¿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.</string>
|
||||||
<string name="module_installed">%1$s instalado %2$d</string>
|
<string name="module_installed">%1$s instalado %2$s</string>
|
||||||
<string name="module_install_failed">Fallo en la instalación</string>
|
<string name="module_install_failed">Fallo en la instalación</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@
|
||||||
<string name="module_uninstall_message">Voulez-vous installer ce module?</string>
|
<string name="module_uninstall_message">Voulez-vous installer ce module?</string>
|
||||||
<string name="module_uninstalled">Désinstallation de %1$s</string>
|
<string name="module_uninstalled">Désinstallation de %1$s</string>
|
||||||
<string name="module_uninstall_failed">Échec de la désinstallation</string>
|
<string name="module_uninstall_failed">Échec de la désinstallation</string>
|
||||||
<string name="module_installed">Ajout de %1$s à l’utilisateur %2$d</string>
|
<string name="module_installed">Ajout de %1$s à l’utilisateur %2$s</string>
|
||||||
<string name="module_install_failed">Échec de l\’ajout du module</string>
|
<string name="module_install_failed">Échec de l\’ajout du module</string>
|
||||||
<string name="user_title">Utilisateur %d</string>
|
<string name="user_title">Utilisateur %d</string>
|
||||||
<string name="install_to_user">Installation dans utilisateur %d</string>
|
<string name="install_to_user">Installation dans utilisateur %s</string>
|
||||||
<string name="install_to_user_message">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.</string>
|
<string name="install_to_user_message">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.</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
<string name="compile_speed">Ré-optimiser</string>
|
<string name="compile_speed">Ré-optimiser</string>
|
||||||
|
|
|
||||||
|
|
@ -87,11 +87,11 @@
|
||||||
<string name="module_uninstalled">%1$s 제거됨</string>
|
<string name="module_uninstalled">%1$s 제거됨</string>
|
||||||
<string name="module_uninstall_failed">제거 실패</string>
|
<string name="module_uninstall_failed">제거 실패</string>
|
||||||
|
|
||||||
<string name="module_installed">%2$d 사용자에 %1$s 추가</string>
|
<string name="module_installed">%2$s 사용자에 %1$s 추가</string>
|
||||||
<string name="module_install_failed">모듈 추가 실패</string>
|
<string name="module_install_failed">모듈 추가 실패</string>
|
||||||
<string name="user_title">사용자 %d</string>
|
<string name="user_title">사용자 %d</string>
|
||||||
<string name="install_to_user">%d 사용자에게 설치</string>
|
<string name="install_to_user">%s 사용자에게 설치</string>
|
||||||
<string name="install_to_user_message">%2$d 사용자에게 %1$s을(를) 설치하시겠습니까? 수동으로 설치하는 것이 좋습니다. LSPosed를 통해 강제로 설치하면 문제가 발생할 수 있습니다.</string>
|
<string name="install_to_user_message">%2$s 사용자에게 %1$s을(를) 설치하시겠습니까? 수동으로 설치하는 것이 좋습니다. LSPosed를 통해 강제로 설치하면 문제가 발생할 수 있습니다.</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
<string name="compile_speed">다시 최적화</string>
|
<string name="compile_speed">다시 최적화</string>
|
||||||
|
|
|
||||||
|
|
@ -178,10 +178,10 @@
|
||||||
<string name="copy_toast_msg">Gekopieerd</string>
|
<string name="copy_toast_msg">Gekopieerd</string>
|
||||||
<string name="list_empty">¯\\\\_(ツ)_\/¯\nNiets hier</string>
|
<string name="list_empty">¯\\\\_(ツ)_\/¯\nNiets hier</string>
|
||||||
<string name="add_module_to_user">Module toevoegen aan gebruiker</string>
|
<string name="add_module_to_user">Module toevoegen aan gebruiker</string>
|
||||||
<string name="module_installed">Toegevoegd %1$s naar gebruiker %2$d</string>
|
<string name="module_installed">Toegevoegd %1$s naar gebruiker %2$s</string>
|
||||||
<string name="module_install_failed">Het toevoegen van de module is mislukt</string>
|
<string name="module_install_failed">Het toevoegen van de module is mislukt</string>
|
||||||
<string name="user_title">Gebruiker %d</string>
|
<string name="user_title">Gebruiker %d</string>
|
||||||
<string name="install_to_user">Installeer naar gebruiker %d</string>
|
<string name="install_to_user">Installeer naar gebruiker %s</string>
|
||||||
<string name="install_to_user_message">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.</string>
|
<string name="install_to_user_message">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.</string>
|
||||||
<string name="translators"><![CDATA[<a href="https://github.com/Pandemic-XDA">Pandemic-XDA</a>]]></string>
|
<string name="translators"><![CDATA[<a href="https://github.com/Pandemic-XDA">Pandemic-XDA</a>]]></string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@
|
||||||
<string name="module_uninstall_message">Você quer desinstalar este módulo?</string>
|
<string name="module_uninstall_message">Você quer desinstalar este módulo?</string>
|
||||||
<string name="module_uninstalled">Desinstalado %1$s</string>
|
<string name="module_uninstalled">Desinstalado %1$s</string>
|
||||||
<string name="module_uninstall_failed">Falha ao desinstalar</string>
|
<string name="module_uninstall_failed">Falha ao desinstalar</string>
|
||||||
<string name="module_installed">Adicionado %1$s ao usuário %2$d</string>
|
<string name="module_installed">Adicionado %1$s ao usuário %2$s</string>
|
||||||
<string name="module_install_failed">Falha ao adicinar módulo</string>
|
<string name="module_install_failed">Falha ao adicinar módulo</string>
|
||||||
<string name="user_title">Usuário %d</string>
|
<string name="user_title">Usuário %d</string>
|
||||||
<string name="install_to_user">Instalar ao usuário %d</string>
|
<string name="install_to_user">Instalar ao usuário %s</string>
|
||||||
<string name="install_to_user_message">Deseja instalar %1$s ao usuário %2$d? Recomenda-se instalar manualmente, forçar a instalação via LSPosed pode causar problemas.</string>
|
<string name="install_to_user_message">Deseja instalar %1$s ao usuário %2$s? Recomenda-se instalar manualmente, forçar a instalação via LSPosed pode causar problemas.</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
<string name="compile_speed">Re-otimizar</string>
|
<string name="compile_speed">Re-otimizar</string>
|
||||||
|
|
|
||||||
|
|
@ -87,9 +87,9 @@
|
||||||
<string name="module_uninstalled">已卸载%1$s</string>
|
<string name="module_uninstalled">已卸载%1$s</string>
|
||||||
<string name="module_uninstall_failed">卸载失败</string>
|
<string name="module_uninstall_failed">卸载失败</string>
|
||||||
<string name="user_title">用户 %d</string>
|
<string name="user_title">用户 %d</string>
|
||||||
<string name="install_to_user">安装到用户 %d</string>
|
<string name="install_to_user">安装到用户 %s</string>
|
||||||
<string name="install_to_user_message">要安装 %1$s 到用户 %2$d 吗?建议手动安装或多开,通过 LSPosed 强制安装可能会出现问题。</string>
|
<string name="install_to_user_message">要安装 %1$s 到用户 %2$s 吗?建议手动安装或多开,通过 LSPosed 强制安装可能会出现问题。</string>
|
||||||
<string name="module_installed">已安装 %1$s 到用户 %2$d</string>
|
<string name="module_installed">已安装 %1$s 到用户 %2$s</string>
|
||||||
<string name="module_install_failed">安装失败</string>
|
<string name="module_install_failed">安装失败</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@
|
||||||
<string name="module_uninstall_message">您確定要移除此模組嗎?</string>
|
<string name="module_uninstall_message">您確定要移除此模組嗎?</string>
|
||||||
<string name="module_uninstalled">已移除 %1$s</string>
|
<string name="module_uninstalled">已移除 %1$s</string>
|
||||||
<string name="module_uninstall_failed">移除失敗</string>
|
<string name="module_uninstall_failed">移除失敗</string>
|
||||||
<string name="module_installed">已安裝 %1$s 到使用者 %2$d</string>
|
<string name="module_installed">已安裝 %1$s 到使用者 %2$s</string>
|
||||||
<string name="module_install_failed">安裝模組失敗</string>
|
<string name="module_install_failed">安裝模組失敗</string>
|
||||||
<string name="user_title">使用者 %d</string>
|
<string name="user_title">使用者 %d</string>
|
||||||
<string name="install_to_user">安裝到使用者 %d</string>
|
<string name="install_to_user">安裝到使用者 %s</string>
|
||||||
<string name="install_to_user_message">要安裝 %1$s 到使用者 %2$d 嗎?建議手動安裝或多開,透過 LSPosed 強制安裝可能會出現問題。</string>
|
<string name="install_to_user_message">要安裝 %1$s 到使用者 %2$s 嗎?建議手動安裝或多開,透過 LSPosed 強制安裝可能會出現問題。</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
<string name="compile_speed">重新最佳化</string>
|
<string name="compile_speed">重新最佳化</string>
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@
|
||||||
<string name="module_uninstall_message">Do you want to uninstall this module?</string>
|
<string name="module_uninstall_message">Do you want to uninstall this module?</string>
|
||||||
<string name="module_uninstalled">Uninstalled %1$s</string>
|
<string name="module_uninstalled">Uninstalled %1$s</string>
|
||||||
<string name="module_uninstall_failed">Uninstall unsuccessful</string>
|
<string name="module_uninstall_failed">Uninstall unsuccessful</string>
|
||||||
<string name="module_installed">Added %1$s to user %2$d</string>
|
<string name="module_installed">Added %1$s to user %2$s</string>
|
||||||
<string name="module_install_failed">Adding module failed</string>
|
<string name="module_install_failed">Adding module failed</string>
|
||||||
<string name="user_title">User %d</string>
|
<string name="user_title">User %d</string>
|
||||||
<string name="install_to_user">Install to user %d</string>
|
<string name="install_to_user">Install to user %s</string>
|
||||||
<string name="install_to_user_message">Want to install %1$s to user %2$d? It is recommended to install manually, forcing installation via LSPosed may cause problems.</string>
|
<string name="install_to_user_message">Want to install %1$s to user %2$s? It is recommended to install manually, forcing installation via LSPosed may cause problems.</string>
|
||||||
|
|
||||||
<!-- AppListActivity -->
|
<!-- AppListActivity -->
|
||||||
<string name="compile_speed">Re-optimize</string>
|
<string name="compile_speed">Re-optimize</string>
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ buildscript {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
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("org.eclipse.jgit:org.eclipse.jgit:5.10.0.202012080955-r")
|
||||||
classpath(kotlin("gradle-plugin", version = "1.4.32"))
|
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 defaultManagerPackageName by extra("org.lsposed.manager")
|
||||||
val verCode by extra(commitCount + 4200)
|
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 androidTargetSdkVersion by extra(30)
|
||||||
val androidMinSdkVersion by extra(27)
|
val androidMinSdkVersion by extra(27)
|
||||||
val androidBuildToolsVersion by extra("30.0.3")
|
val androidBuildToolsVersion by extra("30.0.3")
|
||||||
|
|
|
||||||
|
|
@ -420,7 +420,7 @@ public class ConfigManager {
|
||||||
if (module_pkg.equals(app.packageName)) {
|
if (module_pkg.equals(app.packageName)) {
|
||||||
var appId = processScope.uid % PER_USER_RANGE;
|
var appId = processScope.uid % PER_USER_RANGE;
|
||||||
for (var user : UserService.getUsers()) {
|
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);
|
ignored -> new HashMap<>()).put(module_pkg, apk_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,10 @@ import org.lsposed.lspd.Application;
|
||||||
import org.lsposed.lspd.BuildConfig;
|
import org.lsposed.lspd.BuildConfig;
|
||||||
import org.lsposed.lspd.ILSPManagerService;
|
import org.lsposed.lspd.ILSPManagerService;
|
||||||
import org.lsposed.lspd.utils.ParceledListSlice;
|
import org.lsposed.lspd.utils.ParceledListSlice;
|
||||||
|
import org.lsposed.lspd.utils.UserInfo;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
@ -206,8 +208,15 @@ public class LSPManagerService extends ILSPManagerService.Stub {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getUsers() throws RemoteException {
|
public List<UserInfo> getUsers() throws RemoteException {
|
||||||
return UserService.getUsers();
|
var users = new LinkedList<UserInfo>();
|
||||||
|
for(var user: UserService.getUsers()){
|
||||||
|
var info = new UserInfo();
|
||||||
|
info.id = user.id;
|
||||||
|
info.name = user.name;
|
||||||
|
users.add(info);
|
||||||
|
}
|
||||||
|
return users;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -112,9 +112,9 @@ public class PackageService {
|
||||||
IPackageManager pm = getPackageManager();
|
IPackageManager pm = getPackageManager();
|
||||||
Map<Integer, PackageInfo> res = new HashMap<>();
|
Map<Integer, PackageInfo> res = new HashMap<>();
|
||||||
if (pm == null) return res;
|
if (pm == null) return res;
|
||||||
for (int userId : UserService.getUsers()) {
|
for (var user : UserService.getUsers()) {
|
||||||
var info = pm.getPackageInfo(packageName, flags, userId);
|
var info = pm.getPackageInfo(packageName, flags, user.id);
|
||||||
if (info != null && info.applicationInfo != null) res.put(userId, info);
|
if (info != null && info.applicationInfo != null) res.put(user.id, info);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
@ -135,8 +135,8 @@ public class PackageService {
|
||||||
List<PackageInfo> res = new ArrayList<>();
|
List<PackageInfo> res = new ArrayList<>();
|
||||||
IPackageManager pm = getPackageManager();
|
IPackageManager pm = getPackageManager();
|
||||||
if (pm == null) return ParceledListSlice.emptyList();
|
if (pm == null) return ParceledListSlice.emptyList();
|
||||||
for (int userId : UserService.getUsers()) {
|
for (var user : UserService.getUsers()) {
|
||||||
res.addAll(pm.getInstalledPackages(flags, userId).getList());
|
res.addAll(pm.getInstalledPackages(flags, user.id).getList());
|
||||||
}
|
}
|
||||||
if (filterNoProcess) {
|
if (filterNoProcess) {
|
||||||
res = res.stream().filter(packageInfo -> {
|
res = res.stream().filter(packageInfo -> {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class UserService {
|
public class UserService {
|
||||||
|
|
@ -58,10 +60,10 @@ public class UserService {
|
||||||
return um;
|
return um;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] getUsers() throws RemoteException {
|
public static List<UserInfo> getUsers() throws RemoteException {
|
||||||
IUserManager um = getUserManager();
|
IUserManager um = getUserManager();
|
||||||
if (um == null) return new int[0];
|
List<UserInfo> users = new LinkedList<>();
|
||||||
List<UserInfo> users;
|
if (um == null) return users;
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
users = um.getUsers(true, true, true);
|
users = um.getUsers(true, true, true);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -71,12 +73,7 @@ public class UserService {
|
||||||
users = um.getUsers(true, true, true);
|
users = um.getUsers(true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int[] userArray = new int[users.size()];
|
return users;
|
||||||
for (int i = 0; i < users.size(); i++) {
|
|
||||||
UserInfo uh = users.get(i);
|
|
||||||
userArray[i] = uh.id;
|
|
||||||
}
|
|
||||||
return userArray;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getProfileParent(int userId) throws RemoteException {
|
public static int getProfileParent(int userId) throws RemoteException {
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,5 @@ package android.content.pm;
|
||||||
|
|
||||||
public class UserInfo {
|
public class UserInfo {
|
||||||
public int id;
|
public int id;
|
||||||
|
public String name;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package org.lsposed.lspd;
|
package org.lsposed.lspd;
|
||||||
|
|
||||||
import org.lsposed.lspd.utils.ParceledListSlice;
|
import org.lsposed.lspd.utils.ParceledListSlice;
|
||||||
|
import org.lsposed.lspd.utils.UserInfo;
|
||||||
import org.lsposed.lspd.Application;
|
import org.lsposed.lspd.Application;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -47,7 +48,7 @@ interface ILSPManagerService {
|
||||||
|
|
||||||
boolean isSepolicyLoaded() = 26;
|
boolean isSepolicyLoaded() = 26;
|
||||||
|
|
||||||
int[] getUsers() = 27;
|
List<UserInfo> getUsers() = 27;
|
||||||
|
|
||||||
int installExistingPackageAsUser(String packageName, int userId) = 28;
|
int installExistingPackageAsUser(String packageName, int userId) = 28;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package org.lsposed.lspd.utils;
|
||||||
|
|
||||||
|
parcelable UserInfo {
|
||||||
|
int id;
|
||||||
|
String name;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue