mirror of
https://github.com/android-password-store/Android-Password-Store
synced 2025-09-01 14:55:19 +00:00
Load icons & labels async beforehand as well
This commit is contained in:
@@ -4,6 +4,7 @@ import android.app.DialogFragment;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.NavUtils;
|
import android.support.v4.app.NavUtils;
|
||||||
@@ -13,12 +14,14 @@ import android.support.v7.app.AppCompatActivity;
|
|||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
|
import android.util.Pair;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.zeapo.pwdstore.R;
|
import com.zeapo.pwdstore.R;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class AutofillPreferenceActivity extends AppCompatActivity {
|
public class AutofillPreferenceActivity extends AppCompatActivity {
|
||||||
@@ -60,7 +63,14 @@ public class AutofillPreferenceActivity extends AppCompatActivity {
|
|||||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||||
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||||
List<ResolveInfo> allApps = pm.queryIntentActivities(intent, 0);
|
List<ResolveInfo> allApps = pm.queryIntentActivities(intent, 0);
|
||||||
recyclerAdapter = new AutofillRecyclerAdapter(allApps, pm, AutofillPreferenceActivity.this);
|
|
||||||
|
HashMap<String, Pair<Drawable, String>> iconMap = new HashMap<>(allApps.size());
|
||||||
|
for (ResolveInfo app : allApps) {
|
||||||
|
iconMap.put(app.activityInfo.packageName
|
||||||
|
, Pair.create(app.loadIcon(pm), app.loadLabel(pm).toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
recyclerAdapter = new AutofillRecyclerAdapter(allApps, iconMap, pm, AutofillPreferenceActivity.this);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,9 +4,11 @@ import android.content.Context;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.support.v7.util.SortedList;
|
import android.support.v7.util.SortedList;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.util.SortedListAdapterCallback;
|
import android.support.v7.widget.util.SortedListAdapterCallback;
|
||||||
|
import android.util.Pair;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -16,11 +18,13 @@ import android.widget.TextView;
|
|||||||
import com.zeapo.pwdstore.R;
|
import com.zeapo.pwdstore.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecyclerAdapter.ViewHolder> {
|
public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecyclerAdapter.ViewHolder> {
|
||||||
private SortedList<ResolveInfo> apps;
|
private SortedList<ResolveInfo> apps;
|
||||||
private ArrayList<ResolveInfo> allApps;
|
private ArrayList<ResolveInfo> allApps;
|
||||||
|
private HashMap<String, Pair<Drawable, String>> iconMap;
|
||||||
private PackageManager pm;
|
private PackageManager pm;
|
||||||
private AutofillPreferenceActivity activity;
|
private AutofillPreferenceActivity activity;
|
||||||
|
|
||||||
@@ -47,11 +51,12 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutofillRecyclerAdapter(List<ResolveInfo> allApps, final PackageManager pm, AutofillPreferenceActivity activity) {
|
public AutofillRecyclerAdapter(List<ResolveInfo> allApps, HashMap<String, Pair<Drawable, String>> iconMap
|
||||||
|
, final PackageManager pm, AutofillPreferenceActivity activity) {
|
||||||
SortedList.Callback<ResolveInfo> callback = new SortedListAdapterCallback<ResolveInfo>(this) {
|
SortedList.Callback<ResolveInfo> callback = new SortedListAdapterCallback<ResolveInfo>(this) {
|
||||||
@Override
|
@Override
|
||||||
public int compare(ResolveInfo o1, ResolveInfo o2) {
|
public int compare(ResolveInfo o1, ResolveInfo o2) {
|
||||||
return o1.loadLabel(pm).toString().compareTo(o2.loadLabel(pm).toString());
|
return o1.loadLabel(pm).toString().toLowerCase().compareTo(o2.loadLabel(pm).toString().toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -67,6 +72,7 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl
|
|||||||
this.apps = new SortedList<>(ResolveInfo.class, callback);
|
this.apps = new SortedList<>(ResolveInfo.class, callback);
|
||||||
this.apps.addAll(allApps);
|
this.apps.addAll(allApps);
|
||||||
this.allApps = new ArrayList<>(allApps);
|
this.allApps = new ArrayList<>(allApps);
|
||||||
|
this.iconMap = new HashMap<>(iconMap);
|
||||||
this.pm = pm;
|
this.pm = pm;
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
}
|
}
|
||||||
@@ -81,10 +87,11 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(AutofillRecyclerAdapter.ViewHolder holder, int position) {
|
public void onBindViewHolder(AutofillRecyclerAdapter.ViewHolder holder, int position) {
|
||||||
ResolveInfo app = apps.get(position);
|
ResolveInfo app = apps.get(position);
|
||||||
holder.name.setText(app.loadLabel(pm)); // 'No package identifier when getting value for resource number 0x00000000' 5+
|
|
||||||
holder.icon.setImageDrawable(app.loadIcon(pm));
|
|
||||||
holder.packageName = app.activityInfo.packageName;
|
holder.packageName = app.activityInfo.packageName;
|
||||||
|
|
||||||
|
holder.icon.setImageDrawable(iconMap.get(holder.packageName).first);
|
||||||
|
holder.name.setText(iconMap.get(holder.packageName).second);
|
||||||
|
|
||||||
holder.secondary.setVisibility(View.VISIBLE);
|
holder.secondary.setVisibility(View.VISIBLE);
|
||||||
holder.view.setBackgroundResource(R.color.grey_white_1000);
|
holder.view.setBackgroundResource(R.color.grey_white_1000);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user