From 0d330fc481f0ff849296d5af504fb892df614aca Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 20 Mar 2019 08:49:21 +0000 Subject: [PATCH] Search improvements --- .../eu/faircode/email/FragmentAccounts.java | 56 +++++++++++++ .../eu/faircode/email/FragmentContacts.java | 35 ++++---- .../eu/faircode/email/FragmentFolders.java | 84 +++++++++---------- .../eu/faircode/email/FragmentMessages.java | 37 ++++---- app/src/main/res/menu/menu_accounts.xml | 11 +++ 5 files changed, 140 insertions(+), 83 deletions(-) create mode 100644 app/src/main/res/menu/menu_accounts.xml diff --git a/app/src/main/java/eu/faircode/email/FragmentAccounts.java b/app/src/main/java/eu/faircode/email/FragmentAccounts.java index 7ec871c235..e958d41a62 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccounts.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccounts.java @@ -24,7 +24,11 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -35,6 +39,7 @@ import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.widget.SearchView; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.Observer; @@ -51,6 +56,7 @@ public class FragmentAccounts extends FragmentBase { private FloatingActionButton fabCompose; private ObjectAnimator animator; + private String searching = null; private AdapterAccount adapter; @Override @@ -64,6 +70,7 @@ public class FragmentAccounts extends FragmentBase { @Nullable public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { setSubtitle(R.string.title_list_accounts); + setHasOptionsMenu(true); View view = inflater.inflate(R.layout.fragment_accounts, container, false); @@ -155,10 +162,20 @@ public class FragmentAccounts extends FragmentBase { return view; } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putString("fair:searching", searching); + } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + if (savedInstanceState != null) + searching = savedInstanceState.getString("fair:searching"); + DB db = DB.getInstance(getContext()); // Observe accounts @@ -194,4 +211,43 @@ public class FragmentAccounts extends FragmentBase { } }); } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_folders, menu); + + final MenuItem menuSearch = menu.findItem(R.id.menu_search); + SearchView searchView = (SearchView) menuSearch.getActionView(); + + if (!TextUtils.isEmpty(searching)) { + menuSearch.expandActionView(); + searchView.setQuery(searching, false); + } + + searchView.setQueryHint(getString(R.string.title_search_device)); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextChange(String newText) { + searching = newText; + return true; + } + + @Override + public boolean onQueryTextSubmit(String query) { + searching = null; + menuSearch.collapseActionView(); + FragmentMessages.search(getContext(), getViewLifecycleOwner(), getFragmentManager(), -1, query); + return true; + } + }); + + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + menu.findItem(R.id.menu_search).setVisible(!settings); + + super.onPrepareOptionsMenu(menu); + } } diff --git a/app/src/main/java/eu/faircode/email/FragmentContacts.java b/app/src/main/java/eu/faircode/email/FragmentContacts.java index 32aaaf4636..134327a72d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentContacts.java +++ b/app/src/main/java/eu/faircode/email/FragmentContacts.java @@ -50,7 +50,7 @@ public class FragmentContacts extends FragmentBase { private ContentLoadingProgressBar pbWait; private Group grpReady; - private String search = null; + private String searching = null; private AdapterContact adapter; @Override @@ -82,13 +82,19 @@ public class FragmentContacts extends FragmentBase { return view; } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString("fair:searching", searching); + } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { - search = savedInstanceState.getString("fair:search"); - adapter.search(search); + searching = savedInstanceState.getString("fair:searching"); + adapter.search(searching); } DB db = DB.getInstance(getContext()); @@ -108,12 +114,6 @@ public class FragmentContacts extends FragmentBase { Shortcuts.update(getContext(), getViewLifecycleOwner()); } - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString("fair:search", search); - } - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_contacts, menu); @@ -121,24 +121,23 @@ public class FragmentContacts extends FragmentBase { MenuItem menuSearch = menu.findItem(R.id.menu_search); SearchView searchView = (SearchView) menuSearch.getActionView(); - if (!TextUtils.isEmpty(search)) { + if (!TextUtils.isEmpty(searching)) { menuSearch.expandActionView(); - searchView.setQuery(search, true); - searchView.clearFocus(); + searchView.setQuery(searching, true); } searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override - public boolean onQueryTextSubmit(String query) { - search = query; - adapter.search(query); + public boolean onQueryTextChange(String newText) { + searching = newText; + adapter.search(newText); return true; } @Override - public boolean onQueryTextChange(String newText) { - search = newText; - adapter.search(newText); + public boolean onQueryTextSubmit(String query) { + searching = query; + adapter.search(query); return true; } }); diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index fcbe93c95e..81cc2a2ade 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -65,7 +66,7 @@ public class FragmentFolders extends FragmentBase { private FloatingActionButton fab; private long account; - private boolean searching = false; + private String searching = null; private AdapterFolder adapter; private Map> parentChilds = new HashMap<>(); @@ -79,34 +80,11 @@ public class FragmentFolders extends FragmentBase { account = args.getLong("account", -1); } - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putLongArray("fair:parents", Helper.toLongArray(parentChilds.keySet())); - for (Long parent : parentChilds.keySet()) { - List childs = parentChilds.get(parent); - outState.putInt("fair:childs:" + parent + ":count", childs.size()); - for (int i = 0; i < childs.size(); i++) - outState.putSerializable("fair:childs:" + parent + ":" + i, childs.get(i)); - } - } - @Override @Nullable public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { setHasOptionsMenu(true); - if (savedInstanceState != null) { - for (long parent : savedInstanceState.getLongArray("fair:parents")) { - int count = savedInstanceState.getInt("fair:childs:" + parent + ":count"); - List childs = new ArrayList<>(count); - for (int i = 0; i < count; i++) - childs.add((TupleFolderEx) savedInstanceState.getSerializable("fair:childs:" + parent + ":" + i)); - parentChilds.put(parent, childs); - } - } - view = (ViewGroup) inflater.inflate(R.layout.fragment_folders, container, false); // Get controls @@ -225,10 +203,37 @@ public class FragmentFolders extends FragmentBase { return view; } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putString("fair:searching", searching); + + outState.putLongArray("fair:parents", Helper.toLongArray(parentChilds.keySet())); + for (Long parent : parentChilds.keySet()) { + List childs = parentChilds.get(parent); + outState.putInt("fair:childs:" + parent + ":count", childs.size()); + for (int i = 0; i < childs.size(); i++) + outState.putSerializable("fair:childs:" + parent + ":" + i, childs.get(i)); + } + } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + if (savedInstanceState != null) { + searching = savedInstanceState.getString("fair:searching"); + + for (long parent : savedInstanceState.getLongArray("fair:parents")) { + int count = savedInstanceState.getInt("fair:childs:" + parent + ":count"); + List childs = new ArrayList<>(count); + for (int i = 0; i < count; i++) + childs.add((TupleFolderEx) savedInstanceState.getSerializable("fair:childs:" + parent + ":" + i)); + parentChilds.put(parent, childs); + } + } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); grpHintActions.setVisibility(prefs.getBoolean("folder_actions", false) ? View.GONE : View.VISIBLE); grpHintSync.setVisibility(prefs.getBoolean("folder_sync", false) ? View.GONE : View.VISIBLE); @@ -339,36 +344,27 @@ public class FragmentFolders extends FragmentBase { inflater.inflate(R.menu.menu_folders, menu); final MenuItem menuSearch = menu.findItem(R.id.menu_search); - menuSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - searching = true; - return true; - } + SearchView searchView = (SearchView) menuSearch.getActionView(); - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - searching = false; - return true; - } - }); - if (searching) + if (!TextUtils.isEmpty(searching)) { menuSearch.expandActionView(); + searchView.setQuery(searching, false); + } - final SearchView searchView = (SearchView) menuSearch.getActionView(); searchView.setQueryHint(getString(R.string.title_search_device)); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override - public boolean onQueryTextSubmit(String query) { - searching = false; - menuSearch.collapseActionView(); - FragmentMessages.search(getContext(), getViewLifecycleOwner(), getFragmentManager(), -1, query); + public boolean onQueryTextChange(String newText) { + searching = newText; return true; } @Override - public boolean onQueryTextChange(String newText) { - return false; + public boolean onQueryTextSubmit(String query) { + searching = null; + menuSearch.collapseActionView(); + FragmentMessages.search(getContext(), getViewLifecycleOwner(), getFragmentManager(), -1, query); + return true; } }); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index c3aa06247d..8b739614b3 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -134,7 +134,7 @@ public class FragmentMessages extends FragmentBase { private long primary; private boolean outbox = false; private boolean connected; - private boolean searching = false; + private String searching = null; private boolean refresh = false; private boolean manual = false; private AdapterMessage adapter; @@ -1486,6 +1486,8 @@ public class FragmentMessages extends FragmentBase { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); + outState.putString("fair:searching", searching); + outState.putBoolean("fair:autoExpanded", autoExpanded); outState.putInt("fair:autoCloseCount", autoCloseCount); @@ -1515,6 +1517,8 @@ public class FragmentMessages extends FragmentBase { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { + searching = savedInstanceState.getString("fair:searching"); + autoExpanded = savedInstanceState.getBoolean("fair:autoExpanded"); autoCloseCount = savedInstanceState.getInt("fair:autoCloseCount"); @@ -1765,36 +1769,27 @@ public class FragmentMessages extends FragmentBase { inflater.inflate(R.menu.menu_messages, menu); final MenuItem menuSearch = menu.findItem(R.id.menu_search); - menuSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - searching = true; - return true; - } + SearchView searchView = (SearchView) menuSearch.getActionView(); - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - searching = false; - return true; - } - }); - if (searching) + if (!TextUtils.isEmpty(searching)) { menuSearch.expandActionView(); + searchView.setQuery(searching, false); + } - final SearchView searchView = (SearchView) menuSearch.getActionView(); searchView.setQueryHint(getString(folder < 0 ? R.string.title_search_device : R.string.title_search_hint)); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override - public boolean onQueryTextSubmit(String query) { - searching = false; - menuSearch.collapseActionView(); - search(getContext(), getViewLifecycleOwner(), getFragmentManager(), folder, query); + public boolean onQueryTextChange(String newText) { + searching = newText; return true; } @Override - public boolean onQueryTextChange(String newText) { - return false; + public boolean onQueryTextSubmit(String query) { + searching = null; + menuSearch.collapseActionView(); + search(getContext(), getViewLifecycleOwner(), getFragmentManager(), folder, query); + return true; } }); diff --git a/app/src/main/res/menu/menu_accounts.xml b/app/src/main/res/menu/menu_accounts.xml new file mode 100644 index 0000000000..38f71a0ad1 --- /dev/null +++ b/app/src/main/res/menu/menu_accounts.xml @@ -0,0 +1,11 @@ + + + + +