aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java
diff options
context:
space:
mode:
authorMatthew Wong <wongma@protonmail.ch>2015-08-09 16:04:09 -0400
committerMatthew Wong <wongma@protonmail.ch>2015-08-14 17:36:48 -0400
commitad173d9d05c29790d6f647df641e5de28e32fd58 (patch)
tree4cbf4579d39392c2d647459eec10ff7f95466a7e /app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java
parent51a05087e5a349afa3f4e0febdc3a339179e9bbd (diff)
downloadHardenedPass-ad173d9d05c29790d6f647df641e5de28e32fd58.tar.gz
HardenedPass-ad173d9d05c29790d6f647df641e5de28e32fd58.zip
Autofill per-app settings dialog opens on click on suggestion or on existing app
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java49
1 files changed, 42 insertions, 7 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java
index 5c42ab8d..77a44c7a 100644
--- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java
+++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillActivity.java
@@ -1,5 +1,6 @@
package com.zeapo.pwdstore.autofill;
+import android.app.DialogFragment;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -33,7 +34,7 @@ public class AutofillActivity extends AppCompatActivity {
private boolean bound = false;
private RecyclerView recyclerView;
- private AutofillRecyclerAdapter recyclerAdapter;
+ AutofillRecyclerAdapter recyclerAdapter; // let fragment have access
private RecyclerView.LayoutManager layoutManager;
@Override
@@ -41,6 +42,7 @@ public class AutofillActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
+
// if called by service just for startIntentSenderForResult
if (extras != null) {
try {
@@ -64,21 +66,26 @@ public class AutofillActivity extends AppCompatActivity {
// apps for which the user has custom settings should be in the recycler
final PackageManager pm = getPackageManager();
- final List<ApplicationInfo> allApps = pm.getInstalledApplications(0);
SharedPreferences prefs
= getSharedPreferences("autofill", Context.MODE_PRIVATE);
Map<String, ?> prefApps = prefs.getAll();
ArrayList<ApplicationInfo> apps = new ArrayList<>();
- for (ApplicationInfo applicationInfo : allApps) {
- if (prefApps.containsKey(applicationInfo.packageName)) {
- apps.add(applicationInfo);
+ for (String packageName : prefApps.keySet()) {
+ try {
+ apps.add(pm.getApplicationInfo(packageName, 0));
+ } catch (PackageManager.NameNotFoundException e) {
+ // remove invalid entries (from uninstalled apps?)
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.remove(packageName).apply();
}
}
- recyclerAdapter = new AutofillRecyclerAdapter(apps, pm);
+ recyclerAdapter = new AutofillRecyclerAdapter(apps, pm, this);
recyclerView.setAdapter(recyclerAdapter);
+ // show the search bar by default but don't open the keyboard
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
final SearchView searchView = (SearchView) findViewById(R.id.app_search);
+ searchView.clearFocus();
// create search suggestions of apps with icons & names
final SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() {
@@ -97,6 +104,8 @@ public class AutofillActivity extends AppCompatActivity {
return true;
}
};
+
+ final List<ApplicationInfo> allApps = pm.getInstalledApplications(0);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
@@ -108,7 +117,9 @@ public class AutofillActivity extends AppCompatActivity {
// should be a better/faster way to do this?
MatrixCursor matrixCursor = new MatrixCursor(new String[]{"_id", "package", "label"});
for (ApplicationInfo applicationInfo : allApps) {
- if (applicationInfo.loadLabel(pm).toString().toLowerCase().contains(newText.toLowerCase())) {
+ // exclude apps that already have settings; the search is just for adding
+ if (applicationInfo.loadLabel(pm).toString().toLowerCase().contains(newText.toLowerCase())
+ && !recyclerAdapter.contains(applicationInfo.packageName)) {
matrixCursor.addRow(new Object[]{0, applicationInfo.packageName, applicationInfo.loadLabel(pm)});
}
}
@@ -121,6 +132,30 @@ public class AutofillActivity extends AppCompatActivity {
}
});
+ searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
+ @Override
+ public boolean onSuggestionSelect(int position) {
+ return false;
+ }
+
+ @Override
+ public boolean onSuggestionClick(int position) {
+ Cursor cursor = searchView.getSuggestionsAdapter().getCursor();
+ String packageName = cursor.getString(1);
+ String appName = cursor.getString(2);
+
+ // similar to what happens in ViewHolder.onClick but position -1
+ DialogFragment df = new AutofillFragment();
+ Bundle args = new Bundle();
+ args.putString("packageName", packageName);
+ args.putString("appName", appName);
+ args.putInt("position", -1);
+ df.setArguments(args);
+ df.show(getFragmentManager(), "autofill_dialog");
+ return false;
+ }
+ });
+
setTitle("Autofill Apps");
}