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;