Improve app list loading
This commit is contained in:
parent
84ad87abf0
commit
1899c82eab
|
|
@ -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<AppAdapter.ViewHolder> implements Filterable {
|
||||
|
||||
protected AppListActivity activity;
|
||||
private final ApplicationInfo.DisplayNameComparator displayNameComparator;
|
||||
protected List<ApplicationInfo> fullList, showList;
|
||||
protected List<PackageInfo> fullList, showList;
|
||||
private final DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
|
||||
private List<String> checkedList;
|
||||
private final PackageManager pm;
|
||||
private final ApplicationFilter filter;
|
||||
private Comparator<ApplicationInfo> cmp;
|
||||
private Comparator<PackageInfo> cmp;
|
||||
private final SharedPreferences preferences;
|
||||
|
||||
AppAdapter(AppListActivity activity) {
|
||||
|
|
@ -63,7 +62,6 @@ public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> impl
|
|||
}
|
||||
|
||||
private void loadApps() {
|
||||
fullList = pm.getInstalledApplications(PackageManager.GET_META_DATA);
|
||||
List<ApplicationInfo> rmList = new ArrayList<>();
|
||||
for (ApplicationInfo info : fullList) {
|
||||
fullList = pm.getInstalledPackages(PackageManager.GET_META_DATA);
|
||||
List<PackageInfo> rmList = new ArrayList<>();
|
||||
for (PackageInfo info : fullList) {
|
||||
if (this instanceof ScopeAdapter) {
|
||||
boolean white = AppHelper.isWhiteListMode();
|
||||
List<String> list = AppHelper.getAppList(white);
|
||||
|
|
@ -97,11 +95,11 @@ public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> 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<AppAdapter.ViewHolder> impl
|
|||
if (constraint.toString().isEmpty()) {
|
||||
showList = fullList;
|
||||
} else {
|
||||
ArrayList<ApplicationInfo> filtered = new ArrayList<>();
|
||||
ArrayList<PackageInfo> 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<AppAdapter.ViewHolder> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<String> scopeList = AppHelper.getScopeList(modulePackageName);
|
||||
List<String> 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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue