1
0
mirror of https://github.com/stom79/exodus-android-app synced 2025-02-16 21:40:38 +01:00

Merge branch 'borsini-fix/application_list_scrolling'

This commit is contained in:
Schoumi 2019-06-04 12:07:36 +02:00
commit c05baa4a04

View File

@ -23,7 +23,9 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.databinding.DataBindingUtil; import android.databinding.DataBindingUtil;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -44,7 +46,7 @@ import java.util.regex.Pattern;
public class ApplicationListAdapter extends RecyclerView.Adapter { public class ApplicationListAdapter extends RecyclerView.Adapter {
private List<PackageInfo> packages; private List<ApplicationViewModel> applicationViewModels;
private PackageManager packageManager; private PackageManager packageManager;
private OnAppClickListener onAppClickListener; private OnAppClickListener onAppClickListener;
private static final String gStore = "com.android.vending"; private static final String gStore = "com.android.vending";
@ -54,55 +56,95 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
private Context context; private Context context;
private Comparator<PackageInfo> alphaPackageComparator = new Comparator<PackageInfo>() { private Comparator<ApplicationViewModel> alphaPackageComparator = new Comparator<ApplicationViewModel>() {
@Override @Override
public int compare(PackageInfo pack1, PackageInfo pack2) { public int compare(ApplicationViewModel app1, ApplicationViewModel app2) {
String pkg1 = packageManager.getApplicationLabel(pack1.applicationInfo).toString(); return app1.label.toString().compareToIgnoreCase(app2.label.toString());
String pkg2 = packageManager.getApplicationLabel(pack2.applicationInfo).toString();
return pkg1.compareToIgnoreCase(pkg2);
} }
}; };
public ApplicationListAdapter(Context context, PackageManager manager, OnAppClickListener listener) { public ApplicationListAdapter(Context context, PackageManager manager, OnAppClickListener listener) {
applicationViewModels = new ArrayList<>();
onAppClickListener = listener; onAppClickListener = listener;
this.context = context; this.context = context;
setPackageManager(manager); setPackageManager(manager);
} }
private void setInstalledPackages(List<PackageInfo> installedPackages) { private void setInstalledPackages(List<PackageInfo> installedPackages) {
packages = installedPackages; List<ApplicationViewModel> viewModels = convertPackagesToViewModels(installedPackages);
applyStoreFilter(); applyStoreFilter(viewModels);
Collections.sort(packages, alphaPackageComparator); Collections.sort(viewModels, alphaPackageComparator);
applicationViewModels = viewModels;
notifyDataSetChanged(); notifyDataSetChanged();
} }
private void applyStoreFilter() { private void applyStoreFilter(List<ApplicationViewModel> apps) {
List<PackageInfo> toRemove = new ArrayList<>(); List<ApplicationViewModel> toRemove = new ArrayList<>();
for (PackageInfo pkg : packages) { for (ApplicationViewModel app : apps) {
if (!gStore.equals(packageManager.getInstallerPackageName(pkg.packageName))) { if (!gStore.equals(app.installerPackageName)) {
String auid = Utils.getCertificateSHA1Fingerprint(packageManager,pkg.packageName); String auid = Utils.getCertificateSHA1Fingerprint(packageManager,app.packageName);
String appuid = DatabaseManager.getInstance(context).getAUID(pkg.packageName); String appuid = DatabaseManager.getInstance(context).getAUID(app.packageName);
if(!auid.equalsIgnoreCase(appuid)) { if(!auid.equalsIgnoreCase(appuid)) {
toRemove.add(pkg); toRemove.add(app);
} }
} }
try { try {
ApplicationInfo info = packageManager.getApplicationInfo(pkg.packageName,0); ApplicationInfo info = packageManager.getApplicationInfo(app.packageName,0);
if(!info.enabled) { if(!info.enabled) {
toRemove.add(pkg); toRemove.add(app);
} }
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
packages.removeAll(toRemove); apps.removeAll(toRemove);
}
private List<ApplicationViewModel> convertPackagesToViewModels(List<PackageInfo> infos) {
ArrayList<ApplicationViewModel> appsToBuild = new ArrayList<>(infos.size());
for (PackageInfo pi : infos) {
appsToBuild.add(buildViewModelFromPackageInfo(pi));
}
return appsToBuild;
}
private ApplicationViewModel buildViewModelFromPackageInfo(PackageInfo pi) {
ApplicationViewModel vm = new ApplicationViewModel();
vm.versionName = pi.versionName;
vm.packageName = pi.packageName;
vm.versionCode = pi.versionCode;
vm.requestedPermissions = pi.requestedPermissions;
DatabaseManager dm = DatabaseManager.getInstance(context);
if(vm.versionName != null)
vm.report = dm.getReportFor(vm.packageName, vm.versionName);
else {
vm.report = dm.getReportFor(vm.packageName, vm.versionCode);
}
if(vm.report != null) {
vm.trackers = dm.getTrackers(vm.report.trackers);
}
try {
vm.icon = packageManager.getApplicationIcon(vm.packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
vm.label = packageManager.getApplicationLabel(pi.applicationInfo);
vm.installerPackageName = packageManager.getInstallerPackageName(vm.packageName);
vm.isVisible = true;
return vm;
} }
@Override @Override
public int getItemViewType(int position){ public int getItemViewType(int position){
return (Pattern.compile(Pattern.quote(filter.trim()), Pattern.CASE_INSENSITIVE).matcher(packageManager.getApplicationLabel(packages.get(position).applicationInfo)).find())?DISPLAYED_APP:HIDDEN_APP; return applicationViewModels.get(position).isVisible ? DISPLAYED_APP : HIDDEN_APP;
} }
@NonNull @NonNull
@ -119,12 +161,17 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if( viewHolder.getItemViewType() == DISPLAYED_APP) { if( viewHolder.getItemViewType() == DISPLAYED_APP) {
final ApplicationListViewHolder holder = (ApplicationListViewHolder) viewHolder; final ApplicationListViewHolder holder = (ApplicationListViewHolder) viewHolder;
holder.setData(packages.get(position)); holder.setViewModel(applicationViewModels.get(position));
//noinspection Convert2Lambda //noinspection Convert2Lambda
holder.itemView.setOnClickListener(new View.OnClickListener() { holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
onAppClickListener.onAppClick(holder.packageInfo); try {
PackageInfo packageInfo = packageManager.getPackageInfo(holder.viewModel.packageName, PackageManager.GET_PERMISSIONS);
onAppClickListener.onAppClick(packageInfo);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
} }
}); });
}else { }else {
@ -134,10 +181,9 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
} }
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return packages.size(); return applicationViewModels.size();
} }
public void setPackageManager(PackageManager manager) { public void setPackageManager(PackageManager manager) {
@ -148,16 +194,31 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
} }
} }
/**
* This class holds the data needed to display an application cell in the RecyclerView
*/
public class ApplicationViewModel {
public String packageName;
public String versionName;
public int versionCode;
public String[] requestedPermissions;
public @Nullable Report report;
public Set<Tracker> trackers;
public @Nullable Drawable icon;
public CharSequence label;
public String installerPackageName;
public boolean isVisible;
}
class ApplicationEmptyViewHolder extends RecyclerView.ViewHolder{ class ApplicationEmptyViewHolder extends RecyclerView.ViewHolder{
ApplicationEmptyViewHolder(View itemView) { ApplicationEmptyViewHolder(View itemView) {
super(itemView); super(itemView);
} }
} }
class ApplicationListViewHolder extends RecyclerView.ViewHolder { class ApplicationListViewHolder extends RecyclerView.ViewHolder {
PackageInfo packageInfo; ApplicationViewModel viewModel;
AppItemBinding appItemBinding; AppItemBinding appItemBinding;
ApplicationListViewHolder(AppItemBinding binding) { ApplicationListViewHolder(AppItemBinding binding) {
@ -165,8 +226,8 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
appItemBinding = binding; appItemBinding = binding;
} }
public void setData(PackageInfo data) { void setViewModel(ApplicationViewModel vm) {
packageInfo = data; viewModel = vm;
Context context = appItemBinding.getRoot().getContext(); Context context = appItemBinding.getRoot().getContext();
@ -176,22 +237,14 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
appItemBinding.appTrackerNb.setVisibility(View.VISIBLE); appItemBinding.appTrackerNb.setVisibility(View.VISIBLE);
appItemBinding.appTracker.setVisibility(View.VISIBLE); appItemBinding.appTracker.setVisibility(View.VISIBLE);
String versionName = viewModel.versionName;
long versionCode = viewModel.versionCode;
String packageName = packageInfo.packageName; appItemBinding.appLogo.setImageDrawable(viewModel.icon);
String versionName = packageInfo.versionName;
long versionCode = packageInfo.versionCode;
//get logo appItemBinding.appName.setText(viewModel.label);
try {
appItemBinding.appLogo.setImageDrawable(packageManager.getApplicationIcon(packageName));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
//get name
appItemBinding.appName.setText(packageManager.getApplicationLabel(packageInfo.applicationInfo));
//get permissions long size = viewModel.requestedPermissions != null ? viewModel.requestedPermissions.length : 0;
long size = packageInfo.requestedPermissions != null ? data.requestedPermissions.length : 0;
appItemBinding.appPermissionNb.setText(String.valueOf(size)); appItemBinding.appPermissionNb.setText(String.valueOf(size));
if(size == 0) if(size == 0)
appItemBinding.appPermissionNb.setBackgroundResource(R.drawable.square_green); appItemBinding.appPermissionNb.setBackgroundResource(R.drawable.square_green);
@ -200,14 +253,9 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
else else
appItemBinding.appPermissionNb.setBackgroundResource(R.drawable.square_red); appItemBinding.appPermissionNb.setBackgroundResource(R.drawable.square_red);
//get reports Report report = viewModel.report;
Report report;
if(versionName != null)
report = DatabaseManager.getInstance(context).getReportFor(packageName, versionName);
else
report = DatabaseManager.getInstance(context).getReportFor(packageName, versionCode);
if(report != null) { if(report != null) {
Set<Tracker> trackers = DatabaseManager.getInstance(context).getTrackers(report.trackers); Set<Tracker> trackers = viewModel.trackers;
size = trackers.size(); size = trackers.size();
appItemBinding.appTrackerNb.setText(String.valueOf(size)); appItemBinding.appTrackerNb.setText(String.valueOf(size));
@ -218,8 +266,8 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
else else
appItemBinding.appTrackerNb.setBackgroundResource(R.drawable.square_red); appItemBinding.appTrackerNb.setBackgroundResource(R.drawable.square_red);
if(versionName != null && !report.version.equals(data.versionName)) { if(versionName != null && !report.version.equals(viewModel.versionName)) {
String string = context.getString(R.string.tested,versionName,report.version); String string = context.getString(R.string.tested,versionName, report.version);
appItemBinding.otherVersion.setText(string); appItemBinding.otherVersion.setText(string);
appItemBinding.otherVersion.setVisibility(View.VISIBLE); appItemBinding.otherVersion.setVisibility(View.VISIBLE);
} else if (versionName == null && report.versionCode != versionCode) { } else if (versionName == null && report.versionCode != versionCode) {
@ -227,7 +275,6 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
appItemBinding.otherVersion.setText(string); appItemBinding.otherVersion.setText(string);
appItemBinding.otherVersion.setVisibility(View.VISIBLE); appItemBinding.otherVersion.setVisibility(View.VISIBLE);
} }
} else { } else {
appItemBinding.appTrackerNb.setVisibility(View.GONE); appItemBinding.appTrackerNb.setVisibility(View.GONE);
appItemBinding.appTracker.setVisibility(View.GONE); appItemBinding.appTracker.setVisibility(View.GONE);
@ -243,6 +290,12 @@ public class ApplicationListAdapter extends RecyclerView.Adapter {
public void filter(String text) { public void filter(String text) {
filter = text; filter = text;
Pattern p = Pattern.compile(Pattern.quote(filter.trim()), Pattern.CASE_INSENSITIVE);
for (ApplicationViewModel app : applicationViewModels) {
app.isVisible = p.matcher(app.label).find();
}
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }