From 709bf6f627e7b13e135e1977efe4cc227fcb393f Mon Sep 17 00:00:00 2001 From: ekager Date: Fri, 6 Mar 2020 00:12:55 -0800 Subject: [PATCH] For #7087 - Add SearchView to Logins Fragment --- .../settings/logins/SavedLoginsFragment.kt | 31 ++++++++++++++++++- .../logins/SavedLoginsFragmentStore.kt | 21 +++++++++++-- .../fenix/settings/logins/SavedLoginsView.kt | 2 +- app/src/main/res/layout/logins_item.xml | 7 +++-- app/src/main/res/menu/login_list.xml | 14 +++++++++ app/src/main/res/values/styles.xml | 6 ++++ 6 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/menu/login_list.xml diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt index 05082a6d3..1629674e9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragment.kt @@ -6,9 +6,13 @@ package org.mozilla.fenix.settings.logins import android.os.Bundle import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager +import android.view.inputmethod.EditorInfo +import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -47,6 +51,11 @@ class SavedLoginsFragment : Fragment() { showToolbar(getString(R.string.preferences_passwords_saved_logins)) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(true) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -56,7 +65,8 @@ class SavedLoginsFragment : Fragment() { savedLoginsStore = StoreProvider.get(this) { SavedLoginsFragmentStore( SavedLoginsFragmentState( - items = listOf() + items = listOf(), + filteredItems = listOf() ) ) } @@ -75,6 +85,25 @@ class SavedLoginsFragment : Fragment() { } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.login_list, menu) + val searchItem = menu.findItem(R.id.search) + val searchView: SearchView = searchItem.actionView as SearchView + searchView.imeOptions = EditorInfo.IME_ACTION_DONE + searchView.queryHint = getString(R.string.preferences_passwords_saved_logins_search) + + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + savedLoginsStore.dispatch(SavedLoginsFragmentAction.FilterLogins(newText)) + return false + } + }) + } + /** * If we pause this fragment, we want to pop users back to reauth */ diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt index 8c7d6566d..86f9842bb 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsFragmentStore.kt @@ -38,14 +38,19 @@ class SavedLoginsFragmentStore(initialState: SavedLoginsFragmentState) : * Actions to dispatch through the `SavedLoginsStore` to modify `SavedLoginsFragmentState` through the reducer. */ sealed class SavedLoginsFragmentAction : Action { + data class FilterLogins(val newText: String?) : SavedLoginsFragmentAction() data class UpdateLogins(val list: List) : SavedLoginsFragmentAction() } /** * The state for the Saved Logins Screen - * @property items List of logins to display + * @property items Source of truth of list of logins + * @property items Filtered (or not) list of logins to display */ -data class SavedLoginsFragmentState(val items: List) : State +data class SavedLoginsFragmentState( + val items: List, + val filteredItems: List +) : State /** * The SavedLoginsState Reducer. @@ -55,6 +60,16 @@ private fun savedLoginsStateReducer( action: SavedLoginsFragmentAction ): SavedLoginsFragmentState { return when (action) { - is SavedLoginsFragmentAction.UpdateLogins -> state.copy(items = action.list) + is SavedLoginsFragmentAction.UpdateLogins -> state.copy( + items = action.list, + filteredItems = action.list + ) + is SavedLoginsFragmentAction.FilterLogins -> { + if (action.newText.isNullOrBlank()) { + state.copy(filteredItems = state.items) + } else { + state.copy(filteredItems = state.items.filter { it.url.contains(action.newText) }) + } + } } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt index b19eafab5..293ea31a0 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsView.kt @@ -71,6 +71,6 @@ class SavedLoginsView( fun update(state: SavedLoginsFragmentState) { view.saved_logins_list.isVisible = state.items.isNotEmpty() view.saved_passwords_empty_view.isVisible = state.items.isEmpty() - loginsAdapter.submitList(state.items) + loginsAdapter.submitList(state.filteredItems) } } diff --git a/app/src/main/res/layout/logins_item.xml b/app/src/main/res/layout/logins_item.xml index eb4eb07f6..9a2f37b3b 100644 --- a/app/src/main/res/layout/logins_item.xml +++ b/app/src/main/res/layout/logins_item.xml @@ -9,7 +9,7 @@ android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" - android:minHeight="?android:attr/listPreferredItemHeightSmall"> + android:minHeight="?android:attr/listPreferredItemHeight"> diff --git a/app/src/main/res/menu/login_list.xml b/app/src/main/res/menu/login_list.xml new file mode 100644 index 000000000..e6e0c6959 --- /dev/null +++ b/app/src/main/res/menu/login_list.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9376da789..3744700ba 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,6 +6,7 @@ + +