diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java index 97f7716ef..8d603db10 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java @@ -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 mNamesAndEmails; + private SimpleCursorAdapter mSearchAdapter; + + private List 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 diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java index f8b1b29c7..170221df5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java @@ -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; } diff --git a/OpenKeychain/src/main/res/layout/import_keys_cloud_suggestions_item.xml b/OpenKeychain/src/main/res/layout/import_keys_cloud_suggestions_item.xml new file mode 100644 index 000000000..bd3b9e02a --- /dev/null +++ b/OpenKeychain/src/main/res/layout/import_keys_cloud_suggestions_item.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file