From a8eaa1a7ebf894ef3f75ed4bad9596db7ace53fd Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 12 Aug 2019 18:33:03 +0200 Subject: [PATCH] Refactoring Refs #160 --- .../eu/faircode/email/FragmentAccounts.java | 25 +--- .../eu/faircode/email/FragmentFolders.java | 25 +--- .../eu/faircode/email/FragmentMessages.java | 97 +------------ .../java/eu/faircode/email/SearchViewEx.java | 134 ++++++++++++++++++ app/src/main/res/menu/menu_accounts.xml | 2 +- app/src/main/res/menu/menu_folders.xml | 2 +- app/src/main/res/menu/menu_messages.xml | 2 +- 7 files changed, 156 insertions(+), 131 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/SearchViewEx.java diff --git a/app/src/main/java/eu/faircode/email/FragmentAccounts.java b/app/src/main/java/eu/faircode/email/FragmentAccounts.java index c461705519..406bb6047c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccounts.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccounts.java @@ -24,7 +24,6 @@ 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; @@ -34,7 +33,6 @@ import android.view.ViewGroup; 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; @@ -220,30 +218,19 @@ public class FragmentAccounts extends FragmentBase { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_accounts, menu); - final MenuItem menuSearch = menu.findItem(R.id.menu_search); - SearchView searchView = (SearchView) menuSearch.getActionView(); - searchView.setQueryHint(getString(R.string.title_search)); - - if (!TextUtils.isEmpty(searching)) { - menuSearch.expandActionView(); - searchView.setQuery(searching, false); - } - - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + MenuItem menuSearch = menu.findItem(R.id.menu_search); + SearchViewEx searchView = (SearchViewEx) menuSearch.getActionView(); + searchView.setup(getViewLifecycleOwner(), menuSearch, searching, new SearchViewEx.ISearch() { @Override - public boolean onQueryTextChange(String newText) { - searching = newText; - return true; + public void onSave(String query) { + searching = query; } @Override - public boolean onQueryTextSubmit(String query) { - searching = null; - menuSearch.collapseActionView(); + public void onSearch(String query) { FragmentMessages.search( getContext(), getViewLifecycleOwner(), getFragmentManager(), -1, false, 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 61d074d0b2..4c3e7d8480 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -25,7 +25,6 @@ import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.Rect; import android.os.Bundle; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -37,7 +36,6 @@ import android.widget.Toast; 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; @@ -373,30 +371,19 @@ public class FragmentFolders extends FragmentBase { 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(); - searchView.setQueryHint(getString(R.string.title_search)); - - if (!TextUtils.isEmpty(searching)) { - menuSearch.expandActionView(); - searchView.setQuery(searching, false); - } - - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + MenuItem menuSearch = menu.findItem(R.id.menu_search); + SearchViewEx searchView = (SearchViewEx) menuSearch.getActionView(); + searchView.setup(getViewLifecycleOwner(), menuSearch, searching, new SearchViewEx.ISearch() { @Override - public boolean onQueryTextChange(String newText) { - searching = newText; - return true; + public void onSave(String query) { + searching = query; } @Override - public boolean onQueryTextSubmit(String query) { - searching = null; - menuSearch.collapseActionView(); + public void onSearch(String query) { FragmentMessages.search( getContext(), getViewLifecycleOwner(), getFragmentManager(), -1, false, 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 73f1b021eb..5c23eb9c2c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -30,8 +30,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; import android.content.SharedPreferences; -import android.database.Cursor; -import android.database.MatrixCursor; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.PorterDuff; @@ -69,7 +67,6 @@ import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ArrayAdapter; -import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageButton; @@ -81,10 +78,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.PopupMenu; -import androidx.appcompat.widget.SearchView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; -import androidx.cursoradapter.widget.SimpleCursorAdapter; import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; @@ -2326,97 +2321,19 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_messages, menu); - final MenuItem menuSearch = menu.findItem(R.id.menu_search); - final SearchView searchView = (SearchView) menuSearch.getActionView(); - searchView.setQueryHint(getString(R.string.title_search)); - - if (!TextUtils.isEmpty(searching)) { - menuSearch.expandActionView(); - searchView.setQuery(searching, false); - } - - AutoCompleteTextView autoCompleteTextView = searchView.findViewById(androidx.appcompat.R.id.search_src_text); - autoCompleteTextView.setThreshold(0); - - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + MenuItem menuSearch = menu.findItem(R.id.menu_search); + SearchViewEx searchView = (SearchViewEx) menuSearch.getActionView(); + searchView.setup(getViewLifecycleOwner(), menuSearch, searching, new SearchViewEx.ISearch() { @Override - public boolean onQueryTextChange(String newText) { - searching = newText; - - if (TextUtils.isEmpty(newText)) { - MatrixCursor cursor = new MatrixCursor(new String[]{"_id", "suggestion"}); - String prefix = getString(R.string.title_search_special_prefix); - cursor.addRow(new Object[]{-1, prefix + ":" + getString(R.string.title_search_special_unseen)}); - cursor.addRow(new Object[]{-2, prefix + ":" + getString(R.string.title_search_special_flagged)}); - cursor.addRow(new Object[]{-3, prefix + ":" + getString(R.string.title_search_special_snoozed)}); - SimpleCursorAdapter adapter = new SimpleCursorAdapter( - getContext(), - R.layout.search_suggestion, - cursor, - new String[]{"suggestion"}, - new int[]{android.R.id.text1}, - 0); - searchView.setSuggestionsAdapter(adapter); - adapter.notifyDataSetChanged(); - } else { - Bundle args = new Bundle(); - args.putString("query", newText); - - new SimpleTask() { - @Override - protected Cursor onExecute(Context context, Bundle args) { - String query = args.getString("query"); - - DB db = DB.getInstance(context); - return db.message().getSuggestions("%" + query + "%"); - } - - @Override - protected void onExecuted(Bundle args, Cursor cursor) { - Log.i("Suggestions=" + cursor.getCount()); - SimpleCursorAdapter adapter = new SimpleCursorAdapter( - getContext(), - R.layout.search_suggestion, - cursor, - new String[]{"suggestion"}, - new int[]{android.R.id.text1}, - 0); - searchView.setSuggestionsAdapter(adapter); - adapter.notifyDataSetChanged(); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getFragmentManager(), ex); - } - }.execute(FragmentMessages.this, args, "messages:suggestions"); - } - - return true; + public void onSave(String query) { + searching = query; } @Override - public boolean onQueryTextSubmit(String query) { - searching = null; - menuSearch.collapseActionView(); - search( + public void onSearch(String query) { + FragmentMessages.search( getContext(), getViewLifecycleOwner(), getFragmentManager(), folder, false, query); - return true; - } - }); - - searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { - @Override - public boolean onSuggestionSelect(int position) { - return false; - } - - @Override - public boolean onSuggestionClick(int position) { - Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(position); - searchView.setQuery(cursor.getString(1), true); - return false; } }); diff --git a/app/src/main/java/eu/faircode/email/SearchViewEx.java b/app/src/main/java/eu/faircode/email/SearchViewEx.java new file mode 100644 index 0000000000..3e6c0f82d4 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/SearchViewEx.java @@ -0,0 +1,134 @@ +package eu.faircode.email; + +import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.MenuItem; +import android.widget.AutoCompleteTextView; +import android.widget.Toast; + +import androidx.appcompat.widget.SearchView; +import androidx.cursoradapter.widget.SimpleCursorAdapter; +import androidx.lifecycle.LifecycleOwner; + +public class SearchViewEx extends SearchView { + private String _searching = null; + + public SearchViewEx(Context context) { + super(context); + } + + public SearchViewEx(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SearchViewEx(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + void setup(LifecycleOwner owner, MenuItem menuSearch, String searching, ISearch intf) { + _searching = searching; + Log.i("SearchView searching=" + _searching); + + setQueryHint(getContext().getString(R.string.title_search)); + + if (!TextUtils.isEmpty(_searching)) { + menuSearch.expandActionView(); + setQuery(_searching, false); + } + + AutoCompleteTextView autoCompleteTextView = findViewById(androidx.appcompat.R.id.search_src_text); + autoCompleteTextView.setThreshold(0); + + setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextChange(String newText) { + _searching = newText; + intf.onSave(_searching); + + if (TextUtils.isEmpty(newText)) { + MatrixCursor cursor = new MatrixCursor(new String[]{"_id", "suggestion"}); + String prefix = getContext().getString(R.string.title_search_special_prefix); + cursor.addRow(new Object[]{-1, prefix + ":" + getContext().getString(R.string.title_search_special_unseen)}); + cursor.addRow(new Object[]{-2, prefix + ":" + getContext().getString(R.string.title_search_special_flagged)}); + cursor.addRow(new Object[]{-3, prefix + ":" + getContext().getString(R.string.title_search_special_snoozed)}); + SimpleCursorAdapter adapter = new SimpleCursorAdapter( + getContext(), + R.layout.search_suggestion, + cursor, + new String[]{"suggestion"}, + new int[]{android.R.id.text1}, + 0); + setSuggestionsAdapter(adapter); + adapter.notifyDataSetChanged(); + } else { + Bundle args = new Bundle(); + args.putString("query", newText); + + new SimpleTask() { + @Override + protected Cursor onExecute(Context context, Bundle args) { + String query = args.getString("query"); + + DB db = DB.getInstance(context); + return db.message().getSuggestions("%" + query + "%"); + } + + @Override + protected void onExecuted(Bundle args, Cursor cursor) { + Log.i("Suggestions=" + cursor.getCount()); + SimpleCursorAdapter adapter = new SimpleCursorAdapter( + getContext(), + R.layout.search_suggestion, + cursor, + new String[]{"suggestion"}, + new int[]{android.R.id.text1}, + 0); + setSuggestionsAdapter(adapter); + adapter.notifyDataSetChanged(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + ToastEx.makeText(getContext(), Helper.formatThrowable(ex), Toast.LENGTH_LONG).show(); + } + }.execute(getContext(), owner, args, "messages:suggestions"); + } + + return true; + } + + @Override + public boolean onQueryTextSubmit(String query) { + _searching = null; + intf.onSave(_searching); + menuSearch.collapseActionView(); + intf.onSearch(query); + return true; + } + }); + + setOnSuggestionListener(new SearchView.OnSuggestionListener() { + @Override + public boolean onSuggestionSelect(int position) { + return false; + } + + @Override + public boolean onSuggestionClick(int position) { + Cursor cursor = (Cursor) getSuggestionsAdapter().getItem(position); + setQuery(cursor.getString(1), true); + return false; + } + }); + } + + interface ISearch { + void onSave(String query); + + void onSearch(String query); + } +} diff --git a/app/src/main/res/menu/menu_accounts.xml b/app/src/main/res/menu/menu_accounts.xml index 38f71a0ad1..22693194be 100644 --- a/app/src/main/res/menu/menu_accounts.xml +++ b/app/src/main/res/menu/menu_accounts.xml @@ -6,6 +6,6 @@ android:id="@+id/menu_search" android:icon="@drawable/baseline_search_24" android:title="@string/title_search" - app:actionViewClass="androidx.appcompat.widget.SearchView" + app:actionViewClass="eu.faircode.email.SearchViewEx" app:showAsAction="collapseActionView|always" /> diff --git a/app/src/main/res/menu/menu_folders.xml b/app/src/main/res/menu/menu_folders.xml index b621a2ae0d..c0e56f23a6 100644 --- a/app/src/main/res/menu/menu_folders.xml +++ b/app/src/main/res/menu/menu_folders.xml @@ -6,7 +6,7 @@ android:id="@+id/menu_search" android:icon="@drawable/baseline_search_24" android:title="@string/title_search" - app:actionViewClass="androidx.appcompat.widget.SearchView" + app:actionViewClass="eu.faircode.email.SearchViewEx" app:showAsAction="collapseActionView|always" />