From 1899c82eab6f6f58199a98a7f72a6fb1366b31a1 Mon Sep 17 00:00:00 2001 From: tehcneko <7764726+tehcneko@users.noreply.github.com> Date: Fri, 29 Jan 2021 12:11:20 +0800 Subject: [PATCH] Improve app list loading --- .../lsposed/manager/adapters/AppAdapter.java | 91 ++++++------------- .../manager/adapters/BlackListAdapter.java | 13 ++- .../manager/adapters/ScopeAdapter.java | 20 ++-- 3 files changed, 42 insertions(+), 82 deletions(-) diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java index 1e4998c4..980ac884 100644 --- a/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java +++ b/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java @@ -5,7 +5,6 @@ import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.text.TextUtils; @@ -29,11 +28,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; -import io.github.lsposed.manager.App; -import io.github.lsposed.manager.R; -import io.github.lsposed.manager.ui.activity.AppListActivity; -import io.github.lsposed.manager.util.GlideApp; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -43,16 +37,21 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import io.github.lsposed.manager.App; +import io.github.lsposed.manager.R; +import io.github.lsposed.manager.ui.activity.AppListActivity; +import io.github.lsposed.manager.util.GlideApp; + public class AppAdapter extends RecyclerView.Adapter implements Filterable { protected AppListActivity activity; private final ApplicationInfo.DisplayNameComparator displayNameComparator; - protected List fullList, showList; + protected List fullList, showList; private final DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); private List checkedList; private final PackageManager pm; private final ApplicationFilter filter; - private Comparator cmp; + private Comparator cmp; private final SharedPreferences preferences; AppAdapter(AppListActivity activity) { @@ -63,7 +62,6 @@ public class AppAdapter extends RecyclerView.Adapter impl filter = new ApplicationFilter(); pm = activity.getPackageManager(); displayNameComparator = new ApplicationInfo.DisplayNameComparator(pm); - cmp = displayNameComparator; refresh(); } @@ -75,9 +73,9 @@ public class AppAdapter extends RecyclerView.Adapter impl } private void loadApps() { - fullList = pm.getInstalledApplications(PackageManager.GET_META_DATA); - List rmList = new ArrayList<>(); - for (ApplicationInfo info : fullList) { + fullList = pm.getInstalledPackages(PackageManager.GET_META_DATA); + List rmList = new ArrayList<>(); + for (PackageInfo info : fullList) { if (this instanceof ScopeAdapter) { boolean white = AppHelper.isWhiteListMode(); List list = AppHelper.getAppList(white); @@ -97,11 +95,11 @@ public class AppAdapter extends RecyclerView.Adapter impl } } if (!preferences.getBoolean("show_modules", true)) { - if (info.metaData != null && info.metaData.containsKey("xposedmodule") || AppHelper.forceWhiteList.contains(info.packageName)) { + if (info.applicationInfo.metaData != null && info.applicationInfo.metaData.containsKey("xposedmodule") || AppHelper.forceWhiteList.contains(info.packageName)) { rmList.add(info); } } - if (!preferences.getBoolean("show_system_apps", true) && (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + if (!preferences.getBoolean("show_system_apps", true) && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { rmList.add(info); } } @@ -129,44 +127,16 @@ public class AppAdapter extends RecyclerView.Adapter impl private void sortApps() { switch (preferences.getInt("list_sort", 0)) { case 7: - cmp = Collections.reverseOrder((ApplicationInfo a, ApplicationInfo b) -> { - try { - return Long.compare(pm.getPackageInfo(a.packageName, 0).lastUpdateTime, pm.getPackageInfo(b.packageName, 0).lastUpdateTime); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return displayNameComparator.compare(a, b); - } - }); + cmp = Collections.reverseOrder((PackageInfo a, PackageInfo b) -> Long.compare(a.lastUpdateTime, b.lastUpdateTime)); break; case 6: - cmp = (ApplicationInfo a, ApplicationInfo b) -> { - try { - return Long.compare(pm.getPackageInfo(a.packageName, 0).lastUpdateTime, pm.getPackageInfo(b.packageName, 0).lastUpdateTime); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return displayNameComparator.compare(a, b); - } - }; + cmp = (PackageInfo a, PackageInfo b) -> Long.compare(a.lastUpdateTime, b.lastUpdateTime); break; case 5: - cmp = Collections.reverseOrder((ApplicationInfo a, ApplicationInfo b) -> { - try { - return Long.compare(pm.getPackageInfo(a.packageName, 0).firstInstallTime, pm.getPackageInfo(b.packageName, 0).firstInstallTime); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return displayNameComparator.compare(a, b); - } - }); + cmp = Collections.reverseOrder((PackageInfo a, PackageInfo b) -> Long.compare(a.firstInstallTime, b.firstInstallTime)); break; case 4: - cmp = (ApplicationInfo a, ApplicationInfo b) -> { - try { - return Long.compare(pm.getPackageInfo(a.packageName, 0).firstInstallTime, pm.getPackageInfo(b.packageName, 0).firstInstallTime); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return displayNameComparator.compare(a, b); - } - }; + cmp = (PackageInfo a, PackageInfo b) -> Long.compare(a.firstInstallTime, b.firstInstallTime); break; case 3: cmp = Collections.reverseOrder((a, b) -> a.packageName.compareTo(b.packageName)); @@ -175,11 +145,11 @@ public class AppAdapter extends RecyclerView.Adapter impl cmp = (a, b) -> a.packageName.compareTo(b.packageName); break; case 1: - cmp = Collections.reverseOrder(displayNameComparator); + cmp = Collections.reverseOrder((PackageInfo a, PackageInfo b) -> displayNameComparator.compare(a.applicationInfo, b.applicationInfo)); break; case 0: default: - cmp = displayNameComparator; + cmp = (PackageInfo a, PackageInfo b) -> displayNameComparator.compare(a.applicationInfo, b.applicationInfo); break; } fullList.sort((a, b) -> { @@ -270,8 +240,8 @@ public class AppAdapter extends RecyclerView.Adapter impl @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - ApplicationInfo info = showList.get(position); - holder.appName.setText(getAppLabel(info, pm)); + PackageInfo info = showList.get(position); + holder.appName.setText(getAppLabel(info.applicationInfo, pm)); try { PackageInfo packageInfo = pm.getPackageInfo(info.packageName, 0); GlideApp.with(holder.appIcon) @@ -305,10 +275,8 @@ public class AppAdapter extends RecyclerView.Adapter impl holder.mSwitch.setEnabled(true); } holder.mSwitch.setOnCheckedChangeListener((v, isChecked) -> - onCheckedChange(v, isChecked, info)); - holder.itemView.setOnClickListener(v -> { - AppHelper.showMenu(activity, activity.getSupportFragmentManager(), v, info); - }); + onCheckedChange(v, isChecked, info.packageName)); + holder.itemView.setOnClickListener(v -> AppHelper.showMenu(activity, activity.getSupportFragmentManager(), v, info.applicationInfo)); } @Override @@ -335,7 +303,7 @@ public class AppAdapter extends RecyclerView.Adapter impl AsyncTask.THREAD_POOL_EXECUTOR.execute(this::loadApps); } - protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, ApplicationInfo info) { + protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, String packageName) { // override this to implements your functions } @@ -370,10 +338,10 @@ public class AppAdapter extends RecyclerView.Adapter impl if (constraint.toString().isEmpty()) { showList = fullList; } else { - ArrayList filtered = new ArrayList<>(); + ArrayList filtered = new ArrayList<>(); String filter = constraint.toString().toLowerCase(); - for (ApplicationInfo info : fullList) { - if (lowercaseContains(getAppLabel(info, pm), filter) + for (PackageInfo info : fullList) { + if (lowercaseContains(getAppLabel(info.applicationInfo, pm), filter) || lowercaseContains(info.packageName, filter)) { filtered.add(info); } @@ -390,13 +358,6 @@ public class AppAdapter extends RecyclerView.Adapter impl } public static String getAppLabel(ApplicationInfo info, PackageManager pm) { - try { - if (info.labelRes > 0) { - Resources res = pm.getResourcesForApplication(info); - return res.getString(info.labelRes); - } - } catch (Exception ignored) { - } return info.loadLabel(pm).toString(); } } diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/BlackListAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/BlackListAdapter.java index 4adfe68f..10126022 100644 --- a/app/src/main/java/io/github/lsposed/manager/adapters/BlackListAdapter.java +++ b/app/src/main/java/io/github/lsposed/manager/adapters/BlackListAdapter.java @@ -1,15 +1,14 @@ package io.github.lsposed.manager.adapters; -import android.content.pm.ApplicationInfo; import android.widget.CompoundButton; import com.google.android.material.snackbar.Snackbar; +import java.util.List; + import io.github.lsposed.manager.R; import io.github.lsposed.manager.ui.activity.AppListActivity; -import java.util.List; - public class BlackListAdapter extends AppAdapter { @@ -26,13 +25,13 @@ public class BlackListAdapter extends AppAdapter { } @Override - protected void onCheckedChange(CompoundButton view, boolean isChecked, ApplicationInfo info) { - boolean success = AppHelper.setPackageAppList(info.packageName, isChecked); + protected void onCheckedChange(CompoundButton view, boolean isChecked, String packageName) { + boolean success = AppHelper.setPackageAppList(packageName, isChecked); if (success) { if (isChecked) { - checkedList.add(info.packageName); + checkedList.add(packageName); } else { - checkedList.remove(info.packageName); + checkedList.remove(packageName); } } else { activity.makeSnackBar(R.string.add_package_failed, Snackbar.LENGTH_SHORT); diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java index f433fcf2..ccb0e6b6 100644 --- a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java @@ -1,17 +1,17 @@ package io.github.lsposed.manager.adapters; -import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.widget.CompoundButton; import com.google.android.material.snackbar.Snackbar; +import java.util.ArrayList; +import java.util.List; + import io.github.lsposed.manager.R; import io.github.lsposed.manager.ui.activity.AppListActivity; import io.github.lsposed.manager.ui.widget.MasterSwitch; -import java.util.ArrayList; -import java.util.List; - public class ScopeAdapter extends AppAdapter { protected final String modulePackageName; @@ -38,7 +38,7 @@ public class ScopeAdapter extends AppAdapter { AppHelper.makeSurePath(); List scopeList = AppHelper.getScopeList(modulePackageName); List list = new ArrayList<>(); - for (ApplicationInfo info : fullList) { + for (PackageInfo info : fullList) { list.add(info.packageName); } scopeList.retainAll(list); @@ -49,18 +49,18 @@ public class ScopeAdapter extends AppAdapter { } @Override - protected void onCheckedChange(CompoundButton view, boolean isChecked, ApplicationInfo info) { + protected void onCheckedChange(CompoundButton view, boolean isChecked, String packageName) { if (isChecked) { - checkedList.add(info.packageName); + checkedList.add(packageName); } else { - checkedList.remove(info.packageName); + checkedList.remove(packageName); } if (!AppHelper.saveScopeList(modulePackageName, checkedList)) { activity.makeSnackBar(R.string.add_package_failed, Snackbar.LENGTH_SHORT); if (!isChecked) { - checkedList.add(info.packageName); + checkedList.add(packageName); } else { - checkedList.remove(info.packageName); + checkedList.remove(packageName); } view.setChecked(!isChecked); }