Dbrant has submitted this change and it was merged.
Change subject: Prohibit context action bar and fix rotation bugs
......................................................................
Prohibit context action bar and fix rotation bugs
- Prohibit CAB in toolbar fields, "search Wikipedia" and "find in
page". Add "CabSearchView" which exposes this functionality.
- Permit CAB in non-toolbar fields including the article, history
search, and saved pages search.
- Don't extract EditText input field UI everywhere. This change
effects landscape mode only.
- Fix bug wherein the search box disappeared on rotation with nonempty
query text yielding no results. This was caused by successfully
preserving UI state but not Fragment state.
- Fix bug wherein the "find in page" search box did not fill the
available space. This was caused by an obscure option on the poorly
conceived SearchView.
- Add "ApiUtil".
- Be more precise about the source of action bar mode.
- Specify soft keyboard done button for edit preview, create account,
create account captcha, and find in page.
- Fix comments around action bar mode.
- Rename activity_main.xml layout to activity_page.xml layout to match
Java structure.
- Minor adjustment to use Map instead of HashMap in
CommunicationBridge.
- Add missing Java override annotation on method.
Bug: T88768
Change-Id: Ia25dbfbd7cbc2e72e0da7c136fb3124a6196fb80
---
M wikipedia/res/layout/activity_create_account.xml
M wikipedia/res/layout/activity_langlinks.xml
M wikipedia/res/layout/activity_login.xml
R wikipedia/res/layout/activity_page.xml
M wikipedia/res/layout/dialog_preference_languages.xml
M wikipedia/res/layout/fragment_history.xml
M wikipedia/res/layout/fragment_preview_summary.xml
M wikipedia/res/layout/fragment_saved_pages.xml
M wikipedia/res/layout/group_captcha.xml
M wikipedia/res/layout/group_find_in_page.xml
M wikipedia/res/values/attrs.xml
M wikipedia/src/main/java/org/wikipedia/bridge/CommunicationBridge.java
M wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
M wikipedia/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
M wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
M wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
A wikipedia/src/main/java/org/wikipedia/util/ApiUtil.java
A wikipedia/src/main/java/org/wikipedia/views/CabSearchView.java
18 files changed, 198 insertions(+), 18 deletions(-)
Approvals:
Dbrant: Looks good to me, approved
diff --git a/wikipedia/res/layout/activity_create_account.xml
b/wikipedia/res/layout/activity_create_account.xml
index 8317ed9..4ac2dc7 100644
--- a/wikipedia/res/layout/activity_create_account.xml
+++ b/wikipedia/res/layout/activity_create_account.xml
@@ -22,6 +22,7 @@
android:layout_height="wrap_content"
android:hint="@string/create_account_username_hint"
android:singleLine="true"
+ android:imeOptions="flagNoExtractUi"
android:inputType="textVisiblePassword|textNoSuggestions"
/>
@@ -31,6 +32,7 @@
android:layout_height="wrap_content"
android:hint="@string/create_account_password_hint"
android:singleLine="true"
+ android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
/>
@@ -40,6 +42,7 @@
android:layout_height="wrap_content"
android:hint="@string/create_account_password_repeat_hint"
android:singleLine="true"
+ android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
/>
@@ -56,6 +59,7 @@
android:layout_height="wrap_content"
android:hint="@string/create_account_email_hint"
android:singleLine="true"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:inputType="textEmailAddress"
/>
diff --git a/wikipedia/res/layout/activity_langlinks.xml
b/wikipedia/res/layout/activity_langlinks.xml
index 40d1f80..df16066 100644
--- a/wikipedia/res/layout/activity_langlinks.xml
+++ b/wikipedia/res/layout/activity_langlinks.xml
@@ -73,7 +73,7 @@
android:layout_marginRight="8dp"
android:hint="@string/langlinks_filter_hint"
android:singleLine="true"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi"
/>
<ListView android:id="@+id/langlinks_list"
android:layout_width="fill_parent"
diff --git a/wikipedia/res/layout/activity_login.xml
b/wikipedia/res/layout/activity_login.xml
index 0389396..88dac96 100644
--- a/wikipedia/res/layout/activity_login.xml
+++ b/wikipedia/res/layout/activity_login.xml
@@ -20,6 +20,7 @@
android:hint="@string/login_username_hint"
android:inputType="textVisiblePassword|textNoSuggestions"
android:singleLine="true"
+ android:imeOptions="flagNoExtractUi"
/>
<org.wikipedia.views.PlainPasteEditText
android:id="@+id/login_password_text"
@@ -28,7 +29,7 @@
android:inputType="textPassword"
style="?android:textAppearanceMedium"
android:hint="@string/login_password_hint"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi"
/>
<Button
diff --git a/wikipedia/res/layout/activity_main.xml
b/wikipedia/res/layout/activity_page.xml
similarity index 96%
rename from wikipedia/res/layout/activity_main.xml
rename to wikipedia/res/layout/activity_page.xml
index 94760b2..5f8d4f5 100644
--- a/wikipedia/res/layout/activity_main.xml
+++ b/wikipedia/res/layout/activity_page.xml
@@ -1,6 +1,7 @@
<org.wikipedia.views.WikiDrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:saveEnabled="false"
@@ -87,7 +88,7 @@
android:shadowRadius="2"
android:layout_gravity="center_vertical"/>
</LinearLayout>
- <android.support.v7.widget.SearchView
+ <org.wikipedia.views.CabSearchView
android:id="@+id/main_search_view"
android:layout_width="match_parent"
android:layout_height="36dp"
@@ -98,8 +99,9 @@
android:visibility="gone"
android:focusable="true"
android:inputType="text"
- android:imeOptions="actionGo"
+ android:imeOptions="actionGo|flagNoExtractUi"
style="@style/AppTheme.SearchViewStyle"
+ app:cabEnabled="false"
/>
</FrameLayout>
</android.support.v7.widget.Toolbar>
diff --git a/wikipedia/res/layout/dialog_preference_languages.xml
b/wikipedia/res/layout/dialog_preference_languages.xml
index 98fcada..08ec1f2 100644
--- a/wikipedia/res/layout/dialog_preference_languages.xml
+++ b/wikipedia/res/layout/dialog_preference_languages.xml
@@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="@string/preference_languages_filter_hint"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:singleLine="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
diff --git a/wikipedia/res/layout/fragment_history.xml
b/wikipedia/res/layout/fragment_history.xml
index b95184b..5394ebf 100644
--- a/wikipedia/res/layout/fragment_history.xml
+++ b/wikipedia/res/layout/fragment_history.xml
@@ -48,7 +48,7 @@
<org.wikipedia.views.PlainPasteEditText
android:id="@+id/history_search_list"
android:hint="@string/history_search_list_hint"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="48dp"
diff --git a/wikipedia/res/layout/fragment_preview_summary.xml
b/wikipedia/res/layout/fragment_preview_summary.xml
index 818e6d6..d7d98f2 100644
--- a/wikipedia/res/layout/fragment_preview_summary.xml
+++ b/wikipedia/res/layout/fragment_preview_summary.xml
@@ -19,6 +19,7 @@
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:maxLength="255"
android:textColor="?attr/edit_text_color"
android:hint="@string/edit_summary_tag_other_hint"/>
diff --git a/wikipedia/res/layout/fragment_saved_pages.xml
b/wikipedia/res/layout/fragment_saved_pages.xml
index 4fa84cb..6f2fada 100644
--- a/wikipedia/res/layout/fragment_saved_pages.xml
+++ b/wikipedia/res/layout/fragment_saved_pages.xml
@@ -48,7 +48,7 @@
android:layout_width="match_parent"
android:layout_height="48dp"
android:hint="@string/saved_pages_search_list_hint"
- android:imeOptions="actionDone"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:singleLine="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
diff --git a/wikipedia/res/layout/group_captcha.xml
b/wikipedia/res/layout/group_captcha.xml
index 60bff0d..3e645a1 100644
--- a/wikipedia/res/layout/group_captcha.xml
+++ b/wikipedia/res/layout/group_captcha.xml
@@ -52,6 +52,7 @@
android:layout_gravity="center_horizontal"
android:hint="@string/edit_section_captcha_hint"
android:singleLine="true"
+ android:imeOptions="actionDone|flagNoExtractUi"
android:inputType="textVisiblePassword|textNoSuggestions"
/>
<Button
diff --git a/wikipedia/res/layout/group_find_in_page.xml
b/wikipedia/res/layout/group_find_in_page.xml
index e0763f3..6e318c9 100644
--- a/wikipedia/res/layout/group_find_in_page.xml
+++ b/wikipedia/res/layout/group_find_in_page.xml
@@ -2,12 +2,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/find_in_page_container"
android:layout_gravity="top"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
- <android.support.v7.widget.SearchView
+ <org.wikipedia.views.CabSearchView
android:id="@+id/find_in_page_input"
android:inputType="text"
android:layout_width="0dp"
@@ -16,7 +17,9 @@
android:hint="@string/find_in_page"
android:layout_gravity="center_vertical"
android:singleLine="true"
+ android:imeOptions="actionDone|flagNoExtractUi"
style="@style/AppTheme.SearchViewStyle"
+ app:cabEnabled="false"
/>
<TextView
android:id="@+id/find_in_page_match"
diff --git a/wikipedia/res/values/attrs.xml b/wikipedia/res/values/attrs.xml
index f34eaef..b939853 100644
--- a/wikipedia/res/values/attrs.xml
+++ b/wikipedia/res/values/attrs.xml
@@ -15,4 +15,8 @@
<attr name="syntax_highlight_template_color" format="reference"/>
<attr name="subtle_gray_color" format="reference"/>
<attr name="nearby_marker_drawable" format="reference"/>
+
+ <declare-styleable name="CabSearchView">
+ <attr name="cabEnabled" format="boolean" />
+ </declare-styleable>
</resources>
diff --git
a/wikipedia/src/main/java/org/wikipedia/bridge/CommunicationBridge.java
b/wikipedia/src/main/java/org/wikipedia/bridge/CommunicationBridge.java
index c010c22..ef8e302 100644
--- a/wikipedia/src/main/java/org/wikipedia/bridge/CommunicationBridge.java
+++ b/wikipedia/src/main/java/org/wikipedia/bridge/CommunicationBridge.java
@@ -16,6 +16,7 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Map;
/**
* Two way communications bridge between JS in a WebView and Java.
@@ -23,7 +24,7 @@
public class CommunicationBridge {
private final WebView webView;
- private final HashMap<String, ArrayList<JSEventListener>> eventListeners;
+ private final Map<String, ArrayList<JSEventListener>> eventListeners;
private final BridgeMarshaller marshaller;
@@ -140,7 +141,7 @@
}
private static class BridgeMarshaller {
- private HashMap<String, String> queueItems = new HashMap<>();
+ private Map<String, String> queueItems = new HashMap<>();
private int counter = 0;
/**
diff --git a/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
b/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
index b0b1fb4..757ec7b 100644
--- a/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/history/HistoryFragment.java
@@ -55,6 +55,7 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setRetainInstance(true);
app = WikipediaApp.getInstance();
}
@@ -183,6 +184,7 @@
super.onDestroyView();
}
+ @Override
public boolean onBackPressed() {
if (actionMode != null) {
actionMode.finish();
diff --git
a/wikipedia/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
b/wikipedia/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
index 913ed60..5b1d4ac 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
@@ -66,8 +66,9 @@
searchView.setOnQueryTextListener(searchQueryListener);
searchView.setOnCloseListener(searchCloseListener);
searchView.setIconified(false);
+ searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT);
- searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ searchView.setImeOptions(EditorInfo.IME_ACTION_DONE |
EditorInfo.IME_FLAG_NO_EXTRACT_UI);
searchView.setSubmitButtonEnabled(false);
// remove focus line from search plate
View searchEditPlate = searchView
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
index 9e28cd0..f80aced 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
@@ -33,6 +33,7 @@
import com.squareup.otto.Subscribe;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
+
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.DialogInterface;
@@ -140,7 +141,7 @@
app = (WikipediaApp) getApplicationContext();
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
- setContentView(R.layout.activity_main);
+ setContentView(R.layout.activity_page);
final Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
@@ -849,16 +850,15 @@
*/
@Override
public void onSupportActionModeStarted(ActionMode mode) {
- // Check what kind of ActionMode this is...
- // If its tag is non-null, it means that the ActionMode is one of ours
(History,
- // Saved Pages, or Find In Page). Otherwise, it must be the default
WebView text-
- // highlighting ActionMode, in which case we'll invoke the Share
adapter!
- if (currentActionMode == null && mode.getTag() == null
- && textSelectedShareAdapter != null) {
+ if (currentActionMode == null && textSelectedShareAdapter != null
+ && !isAppInitiatedActionMode(mode)) {
+ // Initiated by the system, likely in response to highlighting
text in the WebView.
textSelectedShareAdapter.onTextSelected(mode);
}
+
currentActionMode = mode;
searchBarHideHandler.setForceNoFade(true);
+
super.onSupportActionModeStarted(mode);
}
@@ -872,4 +872,10 @@
public void share() {
noTextSelectedShareAdapter.share();
}
+
+ private boolean isAppInitiatedActionMode(ActionMode mode) {
+ // ActionMode in non-WebView components (History, Saved Pages, or Find
In Page) must call
+ // setTag().
+ return mode.getTag() != null;
+ }
}
diff --git
a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
index 49f394a..df493eb 100644
--- a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
@@ -51,6 +51,7 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setRetainInstance(true);
app = WikipediaApp.getInstance();
}
diff --git a/wikipedia/src/main/java/org/wikipedia/util/ApiUtil.java
b/wikipedia/src/main/java/org/wikipedia/util/ApiUtil.java
new file mode 100644
index 0000000..9bee38e
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/util/ApiUtil.java
@@ -0,0 +1,28 @@
+package org.wikipedia.util;
+
+import android.os.Build;
+
+public final class ApiUtil {
+ /** @return True if SDK API level is greater than or equal to 11. */
+ public static boolean hasHoneyComb() {
+ return has(Build.VERSION_CODES.HONEYCOMB);
+ }
+
+ /** @return SDK level. */
+ private static int getLevel() {
+ return android.os.Build.VERSION.SDK_INT;
+ }
+
+ /** @return True if SDK API is less than level. */
+ private static boolean isBefore(int level) {
+ return getLevel() < level;
+ }
+
+ /** @return True if SDK API to level. */
+ private static boolean has(int level) {
+ return !isBefore(level);
+ }
+
+ private ApiUtil() {
+ }
+}
\ No newline at end of file
diff --git a/wikipedia/src/main/java/org/wikipedia/views/CabSearchView.java
b/wikipedia/src/main/java/org/wikipedia/views/CabSearchView.java
new file mode 100644
index 0000000..f2e2192
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/views/CabSearchView.java
@@ -0,0 +1,125 @@
+package org.wikipedia.views;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.SearchView;
+import android.util.AttributeSet;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import org.wikipedia.R;
+import org.wikipedia.util.ApiUtil;
+
+/** {@link SearchView} that exposes contextual action bar callbacks. */
+public class CabSearchView extends SearchView {
+ private static final boolean DEFAULT_CAB_ENABLED = true;
+ private static final ActionMode.Callback DEFAULT_CALLBACK;
+ static {
+ DEFAULT_CALLBACK = ApiUtil.hasHoneyComb() ? new DefaultCallback() :
null;
+ }
+
+ @NonNull
+ private final SearchView.SearchAutoComplete mSearchSrcTextView;
+
+ @NonNull
+ private ActionMode.Callback mCallback = DEFAULT_CALLBACK;
+
+ private boolean mCabEnabled;
+
+ public CabSearchView(Context context) {
+ this(context, null);
+ }
+
+ public CabSearchView(Context context, AttributeSet attrs) {
+ this(context, attrs,
android.support.v7.appcompat.R.attr.searchViewStyle);
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public CabSearchView(Context context, AttributeSet attrs, int
defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+
+ mSearchSrcTextView = (SearchAutoComplete)
findViewById(R.id.search_src_text);
+ if (ApiUtil.hasHoneyComb()) {
+ mSearchSrcTextView.setCustomSelectionActionModeCallback(new
CallbackWrapper());
+ }
+
+ initLayoutAttributes(attrs, defStyleAttr);
+ }
+
+ public ActionMode.Callback getCustomSelectionActionModeCallback() {
+ return mCallback == DEFAULT_CALLBACK ? null : mCallback;
+ }
+
+ public void setCustomSelectionActionModeCallback(ActionMode.Callback
callback) {
+ mCallback = callback == null ? DEFAULT_CALLBACK : callback;
+ }
+
+ public boolean isCabEnabled() {
+ return mCabEnabled;
+ }
+
+ public void setCabEnabled(boolean enabled) {
+ mCabEnabled = enabled;
+ }
+
+ private void initLayoutAttributes(AttributeSet attrs, int defStyleAttr) {
+ TypedArray attrsArray = getContext().obtainStyledAttributes(attrs,
+ R.styleable.CabSearchView, defStyleAttr, 0);
+
+ if (ApiUtil.hasHoneyComb()) {
+
setCabEnabled(attrsArray.getBoolean(R.styleable.CabSearchView_cabEnabled,
+ DEFAULT_CAB_ENABLED));
+ }
+
+ attrsArray.recycle();
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private class CallbackWrapper implements ActionMode.Callback {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ return isCabEnabled() && mCallback.onCreateActionMode(mode, menu);
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return mCallback.onPrepareActionMode(mode, menu);
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return mCallback.onActionItemClicked(mode, item);
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ mCallback.onDestroyActionMode(mode);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private static class DefaultCallback implements ActionMode.Callback {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ return true; // Show action bar.
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ }
+ }
+}
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/207293
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ia25dbfbd7cbc2e72e0da7c136fb3124a6196fb80
Gerrit-PatchSet: 4
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: Sniedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits