diff --git a/res/drawable-xhdpi/ic_search_down.png b/res/drawable-xhdpi/ic_search_down.png new file mode 100644 index 000000000..23e4d7c4f Binary files /dev/null and b/res/drawable-xhdpi/ic_search_down.png differ diff --git a/res/drawable-xhdpi/ic_search_up.png b/res/drawable-xhdpi/ic_search_up.png new file mode 100644 index 000000000..b2286ea5a Binary files /dev/null and b/res/drawable-xhdpi/ic_search_up.png differ diff --git a/res/menu/local_help.xml b/res/menu/local_help.xml index af044845a..b3fd9ecad 100644 --- a/res/menu/local_help.xml +++ b/res/menu/local_help.xml @@ -7,6 +7,18 @@ app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="collapseActionView|never" /> + + + + diff --git a/src/org/thoughtcrime/securesms/BaseActionBarActivity.java b/src/org/thoughtcrime/securesms/BaseActionBarActivity.java index f82915532..f7595809b 100644 --- a/src/org/thoughtcrime/securesms/BaseActionBarActivity.java +++ b/src/org/thoughtcrime/securesms/BaseActionBarActivity.java @@ -9,6 +9,8 @@ import androidx.core.app.ActivityOptionsCompat; import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager; @@ -156,4 +158,16 @@ public abstract class BaseActionBarActivity extends AppCompatActivity { isWaitingForResult = true; } } + + public void makeSearchMenuVisible(final Menu menu, final MenuItem exception, boolean visible) { + for (int i = 0; i < menu.size(); ++i) { + MenuItem item = menu.getItem(i); + int id = item.getItemId(); + if (id==R.id.menu_search_up || id==R.id.menu_search_down) { + item.setVisible(!visible); + } else if (item != exception) { + item.setVisible(visible); + } + } + } } diff --git a/src/org/thoughtcrime/securesms/LocalHelpActivity.java b/src/org/thoughtcrime/securesms/LocalHelpActivity.java index 6ec18f869..cbf6b399a 100644 --- a/src/org/thoughtcrime/securesms/LocalHelpActivity.java +++ b/src/org/thoughtcrime/securesms/LocalHelpActivity.java @@ -5,11 +5,13 @@ import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.widget.ImageView; import android.widget.Toast; import androidx.appcompat.widget.SearchView; @@ -24,6 +26,8 @@ public class LocalHelpActivity extends PassphraseRequiredActionBarActivity implements SearchView.OnQueryTextListener, WebView.FindListener { + private static final String TAG = LocalHelpActivity.class.getSimpleName(); + private WebView webView; private final DynamicTheme dynamicTheme = new DynamicTheme(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); @@ -106,10 +110,36 @@ public class LocalHelpActivity extends PassphraseRequiredActionBarActivity inflater.inflate(R.menu.local_help, menu); - MenuItem searchItem = menu.findItem(R.id.menu_search_localhelp); - SearchView searchView = (SearchView) searchItem.getActionView(); - searchView.setOnQueryTextListener(this); - searchView.setQueryHint(getString(R.string.search)); + try { + MenuItem searchItem = menu.findItem(R.id.menu_search_localhelp); + searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(final MenuItem item) { + LocalHelpActivity.this.lastQuery = ""; + LocalHelpActivity.this.makeSearchMenuVisible(menu, searchItem, false); + return true; + } + + @Override + public boolean onMenuItemActionCollapse(final MenuItem item) { + LocalHelpActivity.this.makeSearchMenuVisible(menu, searchItem, true); + return true; + } + }); + SearchView searchView = (SearchView) searchItem.getActionView(); + searchView.setOnQueryTextListener(this); + searchView.setQueryHint(getString(R.string.search)); + searchView.setIconifiedByDefault(true); + + // hide the [X] beside the search field - this is too much noise, search can be aborted eg. by "back" + ImageView closeBtn = searchView.findViewById(R.id.search_close_btn); + if (closeBtn!=null) { + closeBtn.setEnabled(false); + closeBtn.setImageDrawable(null); + } + } catch (Exception e) { + Log.e(TAG, "cannot set up help-search: ", e); + } super.onPrepareOptionsMenu(menu); return true; @@ -120,7 +150,6 @@ public class LocalHelpActivity extends PassphraseRequiredActionBarActivity @Override public boolean onQueryTextSubmit(String query) { - webView.findNext(true); return true; // action handled by listener } @@ -156,6 +185,20 @@ public class LocalHelpActivity extends PassphraseRequiredActionBarActivity case android.R.id.home: finish(); return true; + case R.id.menu_search_up: + if (lastQuery.isEmpty()) { + webView.scrollTo(0, 0); + } else { + webView.findNext(false); + } + return true; + case R.id.menu_search_down: + if (lastQuery.isEmpty()) { + webView.scrollTo(0, 1000000000); + } else { + webView.findNext(true); + } + return true; case R.id.log_scroll_up: webView.scrollTo(0, 0); return true;