ImportKeys: Add auto complete to SearchView

This commit is contained in:
Andrea Torlaschi 2016-08-21 19:48:14 +02:00
parent 0f996b012a
commit 9f424c07f1
3 changed files with 75 additions and 6 deletions

View file

@ -20,11 +20,15 @@ package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.provider.BaseColumns;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.MenuItemCompat.OnActionExpandListener;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
@ -37,7 +41,15 @@ import android.view.inputmethod.InputMethodManager;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState;
import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener;
import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.Preferences.CloudSearchPrefs;
import java.util.ArrayList;
import java.util.List;
import static android.support.v7.widget.SearchView.OnQueryTextListener;
import static android.support.v7.widget.SearchView.OnSuggestionListener;
/**
* Consists of the search bar, search button, and search settings button
@ -48,9 +60,16 @@ public class ImportKeysCloudFragment extends Fragment {
public static final String ARG_DISABLE_QUERY_EDIT = "disable_query_edit";
public static final String ARG_CLOUD_SEARCH_PREFS = "cloud_search_prefs";
private static final String CURSOR_SUGGESTION = "suggestion";
private Activity mActivity;
private ImportKeysListener mCallback;
private List<String> mNamesAndEmails;
private SimpleCursorAdapter mSearchAdapter;
private List<String> mCurrentSuggestions = new ArrayList<>();
/**
* Creates new instance of this fragment
*
@ -60,8 +79,8 @@ public class ImportKeysCloudFragment extends Fragment {
* preferences.
*/
public static ImportKeysCloudFragment newInstance(String query, boolean disableQueryEdit,
Preferences.CloudSearchPrefs
cloudSearchPrefs) {
CloudSearchPrefs cloudSearchPrefs) {
ImportKeysCloudFragment frag = new ImportKeysCloudFragment();
Bundle args = new Bundle();
@ -75,7 +94,15 @@ public class ImportKeysCloudFragment extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) {
ContactHelper contactHelper = new ContactHelper(mActivity);
mNamesAndEmails = contactHelper.getContactNames();
mNamesAndEmails.addAll(contactHelper.getContactMails());
mSearchAdapter = new SimpleCursorAdapter(mActivity,
R.layout.import_keys_cloud_suggestions_item, null, new String[]{CURSOR_SUGGESTION},
new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
setHasOptionsMenu(true);
return null;
}
@ -100,7 +127,23 @@ public class ImportKeysCloudFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.menu_import_keys_cloud_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
searchView.setSuggestionsAdapter(mSearchAdapter);
searchView.setOnSuggestionListener(new OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
searchView.setQuery(mCurrentSuggestions.get(position), true);
return true;
}
@Override
public boolean onSuggestionClick(int position) {
searchView.setQuery(mCurrentSuggestions.get(position), true);
return true;
}
});
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
@ -110,6 +153,7 @@ public class ImportKeysCloudFragment extends Fragment {
@Override
public boolean onQueryTextChange(String newText) {
updateAdapter(newText);
return false;
}
});
@ -130,6 +174,20 @@ public class ImportKeysCloudFragment extends Fragment {
super.onCreateOptionsMenu(menu, inflater);
}
private void updateAdapter(String query) {
mCurrentSuggestions.clear();
MatrixCursor c = new MatrixCursor(new String[]{BaseColumns._ID, CURSOR_SUGGESTION});
for (int i = 0; i < mNamesAndEmails.size(); i++) {
String s = mNamesAndEmails.get(i);
if (s.toLowerCase().startsWith(query.toLowerCase())) {
mCurrentSuggestions.add(s);
c.addRow(new Object[]{i, s});
}
}
mSearchAdapter.changeCursor(c);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
@ -146,7 +204,7 @@ public class ImportKeysCloudFragment extends Fragment {
}
private void search(String query) {
Preferences.CloudSearchPrefs cloudSearchPrefs
CloudSearchPrefs cloudSearchPrefs
= getArguments().getParcelable(ARG_CLOUD_SEARCH_PREFS);
// no explicit search preferences passed

View file

@ -69,7 +69,7 @@ public class ImportKeysFileFragment extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) {
setHasOptionsMenu(true);
return null;
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="center_vertical"
android:minHeight="56dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textAppearance="?android:attr/textAppearanceListItemSmall" />