diff --git a/manager/app/build.gradle.kts b/manager/app/build.gradle.kts index fc19fd2d..a7c14024 100644 --- a/manager/app/build.gradle.kts +++ b/manager/app/build.gradle.kts @@ -84,6 +84,8 @@ dependencies { val libsuVersion = "5.0.4" implementation("com.github.topjohnwu.libsu:core:$libsuVersion") implementation("com.github.topjohnwu.libsu:service:$libsuVersion") + implementation("dev.rikka.rikkax.parcelablelist:parcelablelist:2.0.0") + implementation("com.github.alorma:compose-settings-ui-m3:0.22.0") ksp("io.github.raamcosta.compose-destinations:ksp:$composeDestinationsVersion") diff --git a/manager/app/src/main/AndroidManifest.xml b/manager/app/src/main/AndroidManifest.xml index 7794d8e9..e41431b5 100644 --- a/manager/app/src/main/AndroidManifest.xml +++ b/manager/app/src/main/AndroidManifest.xml @@ -2,10 +2,6 @@ - - getPackages(); + ParcelableListSlice getPackages(int flags); } \ No newline at end of file diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/KsuService.java b/manager/app/src/main/java/me/weishu/kernelsu/ui/KsuService.java index 5159622b..2ebcc786 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/KsuService.java +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/KsuService.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; import me.weishu.kernelsu.IKsuInterface; +import rikka.parcelablelist.ParcelableListSlice; /** * @author weishu @@ -30,10 +31,10 @@ public class KsuService extends RootService { class Stub extends IKsuInterface.Stub { @Override - public List getPackages() { - List list = getInstalledPackagesAll(); + public ParcelableListSlice getPackages(int flags) { + List list = getInstalledPackagesAll(flags); Log.i(TAG, "getPackages: " + list.size()); - return list; + return new ParcelableListSlice<>(list); } } @@ -48,28 +49,25 @@ public class KsuService extends RootService { List userProfiles = um.getUserProfiles(); for (UserHandle userProfile : userProfiles) { int userId = userProfile.hashCode(); - if (userId == 0) { - continue; - } result.add(userProfile.hashCode()); } return result; } - ArrayList getInstalledPackagesAll() { + ArrayList getInstalledPackagesAll(int flags) { ArrayList packages = new ArrayList<>(); for (Integer userId : getUserIds()) { Log.i(TAG, "getInstalledPackagesAll: " + userId); - packages.addAll(getInstalledPackagesAsUser(userId)); + packages.addAll(getInstalledPackagesAsUser(flags, userId)); } return packages; } - List getInstalledPackagesAsUser(int userId) { + List getInstalledPackagesAsUser(int flags, int userId) { try { PackageManager pm = getPackageManager(); Method getInstalledPackagesAsUser = pm.getClass().getDeclaredMethod("getInstalledPackagesAsUser", int.class, int.class); - return (List) getInstalledPackagesAsUser.invoke(pm, 0, userId); + return (List) getInstalledPackagesAsUser.invoke(pm, flags, userId); } catch (Throwable e) { Log.e(TAG, "err", e); } diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt index e0300346..9ebc5d84 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt @@ -105,9 +105,6 @@ class SuperUserViewModel : ViewModel() { val result = connectKsuService { Log.w(TAG, "KsuService disconnected") } - val binder = result.first - val extraPackages = IKsuInterface.Stub.asInterface(binder).packages - stopKsuService() withContext(Dispatchers.IO) { isRefreshing = true @@ -118,8 +115,14 @@ class SuperUserViewModel : ViewModel() { Log.i(TAG, "denyList: $denyList") val start = SystemClock.elapsedRealtime() - val packages = pm.getInstalledPackages(0) - packages.addAll(extraPackages) + val binder = result.first + val allPackages = IKsuInterface.Stub.asInterface(binder).getPackages(0) + + withContext(Dispatchers.Main) { + stopKsuService() + } + + val packages = allPackages.list apps = packages.map { val appInfo = it.applicationInfo