ImportKeys: Add auto complete to SearchView
This commit is contained in:
parent
0f996b012a
commit
9f424c07f1
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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" />
|
Loading…
Reference in a new issue