diff options
author | Matthew Wong <wongma@protonmail.ch> | 2015-12-27 06:00:06 -0500 |
---|---|---|
committer | Matthew Wong <wongma@protonmail.ch> | 2015-12-27 06:00:06 -0500 |
commit | 5cb380bf471c6c7db1d165183296176d564c1ad3 (patch) | |
tree | ec9af3d86663c8e28955dc1d306b3e8f9f1b0a29 | |
parent | 94ee36a38d3b06422c25613c31b8e01e1ef9c4af (diff) |
Don't use ResolveInfo for app settings ui
5 files changed, 90 insertions, 41 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillFragment.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillFragment.java index e4986354..4a5a37cd 100644 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillFragment.java +++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillFragment.java @@ -38,6 +38,8 @@ public class AutofillFragment extends DialogFragment { // need to interact with the recyclerAdapter which is a member of activity final AutofillPreferenceActivity callingActivity = (AutofillPreferenceActivity) getActivity(); LayoutInflater inflater = callingActivity.getLayoutInflater(); + + // if... hide textview final View view = inflater.inflate(R.layout.fragment_autofill, null); builder.setView(view); @@ -74,6 +76,7 @@ public class AutofillFragment extends DialogFragment { } }); + // if... autofill_web SharedPreferences prefs = getActivity().getApplicationContext().getSharedPreferences("autofill", Context.MODE_PRIVATE); String preference = prefs.getString(packageName, ""); diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillPreferenceActivity.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillPreferenceActivity.java index adfce0b1..0c721012 100644 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillPreferenceActivity.java +++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillPreferenceActivity.java @@ -1,12 +1,14 @@ package com.zeapo.pwdstore.autofill; import android.app.DialogFragment; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.NavUtils; import android.support.v4.app.TaskStackBuilder; import android.support.v4.view.MenuItemCompat; @@ -14,15 +16,15 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; -import android.util.Pair; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.zeapo.pwdstore.R; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; +import java.util.Map; public class AutofillPreferenceActivity extends AppCompatActivity { @@ -58,6 +60,13 @@ public class AutofillPreferenceActivity extends AppCompatActivity { } setTitle("Autofill Apps"); + + final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); } private class populateTask extends AsyncTask<Void, Void, Void> { @@ -70,15 +79,25 @@ public class AutofillPreferenceActivity extends AppCompatActivity { protected Void doInBackground(Void... params) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); - List<ResolveInfo> allApps = pm.queryIntentActivities(intent, 0); + List<ResolveInfo> allAppsResolveInfo = pm.queryIntentActivities(intent, 0); + List<AutofillRecyclerAdapter.AppInfo> allApps = new ArrayList<>(); - 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())); + for (ResolveInfo app : allAppsResolveInfo) { + allApps.add(new AutofillRecyclerAdapter.AppInfo(app.loadLabel(pm).toString() + , app.activityInfo.packageName, app.loadIcon(pm))); + } + + SharedPreferences prefs = getSharedPreferences("autofill_web", Context.MODE_PRIVATE); + Map<String, ?> prefsMap = prefs.getAll(); + for (String key : prefsMap.keySet()) { + try { + allApps.add(new AutofillRecyclerAdapter.AppInfo(null, key, pm.getApplicationIcon("com.android.browser"))); + } catch (PackageManager.NameNotFoundException e) { + allApps.add(new AutofillRecyclerAdapter.AppInfo(null, key, null)); + } } - recyclerAdapter = new AutofillRecyclerAdapter(allApps, iconMap, pm, AutofillPreferenceActivity.this); + recyclerAdapter = new AutofillRecyclerAdapter(allApps, pm, AutofillPreferenceActivity.this); return null; } diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillRecyclerAdapter.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillRecyclerAdapter.java index eddf075e..e00f1c5b 100644 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillRecyclerAdapter.java +++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillRecyclerAdapter.java @@ -3,12 +3,10 @@ package com.zeapo.pwdstore.autofill; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.support.v7.util.SortedList; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.util.SortedListAdapterCallback; -import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,13 +16,12 @@ import android.widget.TextView; import com.zeapo.pwdstore.R; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecyclerAdapter.ViewHolder> { - private SortedList<ResolveInfo> apps; - private ArrayList<ResolveInfo> allApps; - private HashMap<String, Pair<Drawable, String>> iconMap; + + private SortedList<AppInfo> apps; + private ArrayList<AppInfo> allApps; private PackageManager pm; private AutofillPreferenceActivity activity; @@ -51,28 +48,39 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl } - public AutofillRecyclerAdapter(List<ResolveInfo> allApps, HashMap<String, Pair<Drawable, String>> iconMap - , final PackageManager pm, AutofillPreferenceActivity activity) { - SortedList.Callback<ResolveInfo> callback = new SortedListAdapterCallback<ResolveInfo>(this) { - @Override - public int compare(ResolveInfo o1, ResolveInfo o2) { - return o1.loadLabel(pm).toString().toLowerCase().compareTo(o2.loadLabel(pm).toString().toLowerCase()); - } + public static class AppInfo { + public String label; + public String packageName; + public Drawable icon; - @Override - public boolean areContentsTheSame(ResolveInfo oldItem, ResolveInfo newItem) { - return oldItem.loadLabel(pm).toString().equals(newItem.loadLabel(pm).toString()); - } + public AppInfo(String label, String packageName, Drawable icon) { + this.label = label; + this.packageName = packageName; + this.icon = icon; + } + } - @Override - public boolean areItemsTheSame(ResolveInfo item1, ResolveInfo item2) { - return item1.loadLabel(pm).toString().equals(item2.loadLabel(pm).toString()); - } + public AutofillRecyclerAdapter(List<AppInfo> allApps, final PackageManager pm + , AutofillPreferenceActivity activity) { + SortedList.Callback<AppInfo> callback = new SortedListAdapterCallback<AppInfo>(this) { + @Override + public int compare(AppInfo o1, AppInfo o2) { + return o1.label.toLowerCase().compareTo(o2.label.toLowerCase()); + } + + @Override + public boolean areContentsTheSame(AppInfo oldItem, AppInfo newItem) { + return oldItem.label.equals(newItem.label); + } + + @Override + public boolean areItemsTheSame(AppInfo item1, AppInfo item2) { + return item1.packageName.equals(item2.packageName); + } }; - this.apps = new SortedList<>(ResolveInfo.class, callback); + this.apps = new SortedList<>(AppInfo.class, callback); this.apps.addAll(allApps); this.allApps = new ArrayList<>(allApps); - this.iconMap = new HashMap<>(iconMap); this.pm = pm; this.activity = activity; } @@ -86,11 +94,11 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl @Override public void onBindViewHolder(AutofillRecyclerAdapter.ViewHolder holder, int position) { - ResolveInfo app = apps.get(position); - holder.packageName = app.activityInfo.packageName; + AppInfo app = apps.get(position); + holder.packageName = app.packageName; - holder.icon.setImageDrawable(iconMap.get(holder.packageName).first); - holder.name.setText(iconMap.get(holder.packageName).second); + holder.icon.setImageDrawable(app.icon); + holder.name.setText(app.label); holder.secondary.setVisibility(View.VISIBLE); holder.view.setBackgroundResource(R.color.grey_white_1000); @@ -126,7 +134,7 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl public int getPosition(String packageName) { for (int i = 0; i < apps.size(); i++) { - if (apps.get(i).activityInfo.packageName.equals(packageName)) { + if (apps.get(i).packageName.equals(packageName)) { return i; } } @@ -139,8 +147,8 @@ public class AutofillRecyclerAdapter extends RecyclerView.Adapter<AutofillRecycl return; } apps.beginBatchedUpdates(); - for (ResolveInfo app : allApps) { - if (app.loadLabel(pm).toString().toLowerCase().contains(s.toLowerCase())) { + for (AppInfo app : allApps) { + if (app.label.toLowerCase().contains(s.toLowerCase())) { apps.add(app); } else { apps.remove(app); diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java index 6a880ccc..58fe6609 100644 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java +++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java @@ -159,6 +159,9 @@ public class AutofillService extends AccessibilityService { } private String searchWebView(AccessibilityNodeInfo source) { + if (source == null) { + return null; + } for (int i = 0; i < source.getChildCount(); i++) { AccessibilityNodeInfo u = source.getChild(i); if (u == null) { diff --git a/app/src/main/res/layout/autofill_recycler_view.xml b/app/src/main/res/layout/autofill_recycler_view.xml index 5dc950c2..7991341d 100644 --- a/app/src/main/res/layout/autofill_recycler_view.xml +++ b/app/src/main/res/layout/autofill_recycler_view.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.v7.widget.RecyclerView android:id="@+id/autofill_recycler" @@ -17,4 +18,19 @@ android:layout_centerInParent="true" android:indeterminate="true" android:visibility="gone" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fab" + android:src="@drawable/ic_action_new" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + app:elevation="6dp" + app:pressedTranslationZ="12dp" + app:backgroundTint="@color/blue_grey_500" + app:rippleColor="@color/blue_grey_50" + app:borderWidth="0dp" + android:layout_margin="@dimen/fab_compat_margin" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true"/> </RelativeLayout>
\ No newline at end of file |