Dbrant has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/373332 )
Change subject: Radically simplify ActionMode logic in PageActivity.
......................................................................
Radically simplify ActionMode logic in PageActivity.
It turns out that there's no longer any need to differentiate between
ActionMode and SupportActionMode. (the Support library handles this
automatically under the hood)
- There's no further need for a custom "CompatActionMode" class.
- No further need to override both onActionModeStarted() and
onSupportActionModeStarted().
This also fixes some possible crashes in older APIs, apparently because
we were sending a Bridge message to the WebView during initialization of
an ActionMode, which older WebViews don't seem to handle well. We were
doing this to get the currently-highlighted text as soon as the user
long-presses the WebView, and send it to eventlogging. However, we really
don't need the highlighted text at that point, since the event funnel will
continue with a "share" event (which will contain the highlighted text) or
an "abandon" event, both of which will have the install ID of the user for
tracking of the interaction.
Therefore, I'm simply removing the call to get the initial highlighted
text.
Bug: T173827
Change-Id: Ic0e88ddeb1a79b4e5fa65ada35151a5226356b4e
---
M app/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
M app/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
D app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
M app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
M app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
7 files changed, 29 insertions(+), 141 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/32/373332/1
diff --git a/app/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
b/app/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
index 982d6ca..3b8e5d7 100644
--- a/app/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
+++ b/app/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
@@ -61,8 +61,8 @@
}
/** Text in the web view was highlighted. */
- public void logHighlight(String text) {
- logAction("highlight", text);
+ public void logHighlight() {
+ logAction("highlight", "");
}
/** The share button in the UI was tapped. */
diff --git a/app/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
b/app/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
index f2aa9d2..ee1f170 100644
--- a/app/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
+++ b/app/src/main/java/org/wikipedia/page/FindInPageActionProvider.java
@@ -3,8 +3,8 @@
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.NonNull;
-import android.support.v4.view.ActionProvider;
import android.support.v7.widget.SearchView;
+import android.view.ActionProvider;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.webkit.WebView.FindListener;
@@ -127,7 +127,7 @@
return;
}
if (numberOfMatches > 0) {
-
findInPageMatch.setText(getContext().getString(R.string.find_in_page_result,
+
findInPageMatch.setText(fragment.getString(R.string.find_in_page_result,
activeMatchOrdinal + 1, numberOfMatches));
findInPageNext.setEnabled(true);
findInPagePrev.setEnabled(true);
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index 41ef67e..087f962 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -23,10 +23,11 @@
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.preference.PreferenceManager;
-import android.support.v7.view.ActionMode;
import android.support.v7.widget.Toolbar;
import android.text.format.DateUtils;
+import android.view.ActionMode;
import android.view.KeyEvent;
+import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
@@ -53,7 +54,6 @@
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.language.LangLinksActivity;
import org.wikipedia.page.linkpreview.LinkPreviewDialog;
-import org.wikipedia.page.snippet.CompatActionMode;
import org.wikipedia.page.tabs.TabsProvider;
import org.wikipedia.page.tabs.TabsProvider.TabPosition;
import org.wikipedia.readinglist.AddToReadingListDialog;
@@ -100,7 +100,7 @@
private WikipediaApp app;
@Nullable private Bus bus;
private EventBusMethods busMethods;
- private CompatActionMode currentActionMode;
+ private ActionMode currentActionMode;
private PageToolbarHideHandler toolbarHideHandler;
@@ -186,10 +186,6 @@
private void finishActionMode() {
currentActionMode.finish();
- }
-
- private void nullifyActionMode() {
- currentActionMode = null;
}
public void hideSoftKeyboard() {
@@ -504,7 +500,7 @@
@Nullable
@Override
public ActionMode onPageStartSupportActionMode(@NonNull
ActionMode.Callback callback) {
- return startSupportActionMode(callback);
+ return startActionMode(callback);
}
@Override
@@ -743,43 +739,21 @@
super.onDestroy();
}
- /**
- * ActionMode that is invoked when the user long-presses inside the
WebView.
- * @param mode ActionMode under which this context is starting.
- */
@Override
- public void onSupportActionModeStarted(@NonNull ActionMode mode) {
- if (!isCabOpen()) {
- conditionallyInjectCustomCabMenu(mode);
- }
- super.onSupportActionModeStarted(mode);
- }
-
- @Override
- public void onSupportActionModeFinished(@NonNull ActionMode mode) {
- super.onSupportActionModeFinished(mode);
- nullifyActionMode();
- }
-
- @Override
- public void onActionModeStarted(android.view.ActionMode mode) {
- if (!isCabOpen()) {
- conditionallyInjectCustomCabMenu(mode);
- }
+ public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
+ if (!isCabOpen() && mode.getTag() == null) {
+ Menu menu = mode.getMenu();
+ menu.clear();
+ mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
+ pageFragment.onActionModeShown(mode);
+ }
}
@Override
public void onActionModeFinished(android.view.ActionMode mode) {
super.onActionModeFinished(mode);
- nullifyActionMode();
- }
-
- private <T> void conditionallyInjectCustomCabMenu(T mode) {
- currentActionMode = new CompatActionMode(mode);
- if (currentActionMode.shouldInjectCustomMenu()) {
- currentActionMode.injectCustomMenu(pageFragment);
- }
+ currentActionMode = null;
}
private void registerBus() {
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 4b3773c..c1baae2 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -12,14 +12,13 @@
import android.support.design.widget.BottomSheetDialogFragment;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
-import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.view.ActionMode;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
+import android.view.ActionMode;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -62,7 +61,6 @@
import org.wikipedia.page.action.PageActionToolbarHideHandler;
import org.wikipedia.page.leadimages.LeadImagesHandler;
import org.wikipedia.page.leadimages.PageHeaderView;
-import org.wikipedia.page.snippet.CompatActionMode;
import org.wikipedia.page.snippet.ShareHandler;
import org.wikipedia.page.tabs.Tab;
import org.wikipedia.page.tabs.TabsProvider;
@@ -706,7 +704,7 @@
});
}
- public void onActionModeShown(CompatActionMode mode) {
+ public void onActionModeShown(ActionMode mode) {
// make sure we have a page loaded, since shareHandler makes
references to it.
if (model.getPage() != null) {
shareHandler.onTextSelected(mode);
@@ -848,7 +846,10 @@
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
findInPageActionMode = mode;
MenuItem menuItem = menu.add(R.string.menu_page_find_in_page);
- MenuItemCompat.setActionProvider(menuItem,
findInPageActionProvider);
+ menuItem.setActionProvider(findInPageActionProvider);
+ menuItem.expandActionView();
+ //MenuItemCompat.setActionProvider(menuItem,
findInPageActionProvider);
+ //MenuItemCompat.expandActionView(menuItem);
return true;
}
diff --git a/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
b/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
deleted file mode 100644
index e70df23..0000000
--- a/app/src/main/java/org/wikipedia/page/snippet/CompatActionMode.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.wikipedia.page.snippet;
-
-import android.os.Build;
-import android.support.v7.view.ActionMode;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.webkit.WebView;
-
-import org.wikipedia.R;
-import org.wikipedia.page.PageFragment;
-import org.wikipedia.util.log.L;
-
-import static org.wikipedia.views.ViewUtil.getOriginatingView;
-
-public class CompatActionMode {
-
- private android.view.ActionMode actionMode;
- private ActionMode supportActionMode;
- private boolean isSupportActionMode;
-
- public <T> CompatActionMode(T mode) {
- if (mode instanceof ActionMode) {
- this.supportActionMode = (ActionMode) mode;
- this.isSupportActionMode = true;
- } else if (mode instanceof android.view.ActionMode) {
- this.actionMode = (android.view.ActionMode) mode;
- this.isSupportActionMode = false;
- } else {
- throw new IllegalArgumentException("Parameter must be of type
android.view.ActionMode"
- + " or android.support.v7.view.ActionMode");
- }
- }
-
- public boolean shouldInjectCustomMenu() {
- return !isTagged() && isOriginatedByWebViewOnMarshmallow();
- }
-
- public void injectCustomMenu(PageFragment fragment) {
- replaceTextSelectMenu();
- fragment.onActionModeShown(this);
- }
-
- public Menu getMenu() {
- return isSupportActionMode ? supportActionMode.getMenu() :
actionMode.getMenu();
- }
-
- public void finish() {
- if (isSupportActionMode) {
- supportActionMode.finish();
- } else {
- actionMode.finish();
- }
- }
-
- private void replaceTextSelectMenu() {
- Menu menu = isSupportActionMode ? supportActionMode.getMenu() :
actionMode.getMenu();
- menu.clear();
- MenuInflater inflater = isSupportActionMode ?
supportActionMode.getMenuInflater() : actionMode.getMenuInflater();
- inflater.inflate(R.menu.menu_text_select, menu);
- }
-
- private boolean isTagged() {
- return isSupportActionMode ? supportActionMode.getTag() != null :
actionMode.getTag() != null;
- }
-
- /**
- * When the client is running Marshmallow or higher, check to ensure that
the action mode was
- * originated by the WebView before injecting the custom CAB menu.
- * @return true if originated by a WebView.
- */
- private boolean isOriginatedByWebViewOnMarshmallow() {
- return Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
isOriginatedByWebView();
- }
-
- private boolean isOriginatedByWebView() {
- boolean isOriginatedByWebView = false;
- try {
- isOriginatedByWebView = getOriginatingView(actionMode) instanceof
WebView;
- } catch (Throwable caught) {
- L.w("Caught " + caught.getMessage(), caught);
- }
- return isOriginatedByWebView;
- }
-}
diff --git a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
index bed0926..4190fa6 100755
--- a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
@@ -9,6 +9,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
+import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -57,14 +58,13 @@
private static final String PAYLOAD_PURPOSE_SHARE = "share";
private static final String PAYLOAD_PURPOSE_DEFINE = "define";
private static final String PAYLOAD_PURPOSE_EDIT_HERE = "edit_here";
- private static final String PAYLOAD_PURPOSE_HIGHLIGHT = "highlight";
private static final String PAYLOAD_TEXT_KEY = "text";
@ColorRes private static final int SHARE_TOOL_TIP_COLOR =
R.color.foundation_blue;
@NonNull private final PageFragment fragment;
@NonNull private final CommunicationBridge bridge;
- @Nullable private CompatActionMode webViewActionMode;
+ @Nullable private ActionMode webViewActionMode;
@Nullable private ShareAFactFunnel funnel;
private void createFunnel() {
@@ -94,9 +94,6 @@
case PAYLOAD_PURPOSE_EDIT_HERE:
onEditHerePayload(messagePayload.optInt("sectionID",
0), text);
break;
- case PAYLOAD_PURPOSE_HIGHLIGHT:
- onHighlightText(text);
- break;
default:
L.d("Unknown purpose=" + purpose);
}
@@ -104,11 +101,11 @@
});
}
- private void onHighlightText(String text) {
+ private void onHighlightText() {
if (funnel == null) {
createFunnel();
}
- funnel.logHighlight(text);
+ funnel.logHighlight();
}
public void showWiktionaryDefinition(String text) {
@@ -167,7 +164,7 @@
/**
* @param mode ActionMode under which this context is starting.
*/
- public void onTextSelected(CompatActionMode mode) {
+ public void onTextSelected(ActionMode mode) {
webViewActionMode = mode;
Menu menu = mode.getMenu();
MenuItem shareItem = menu.findItem(R.id.menu_text_select_share);
@@ -203,7 +200,7 @@
editItem.setVisible(false);
}
- requestTextSelection(PAYLOAD_PURPOSE_HIGHLIGHT);
+ onHighlightText();
}
private boolean shouldEnableWiktionaryDialog() {
diff --git a/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
b/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
index 60e0066..97dd49a 100644
--- a/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
+++ b/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
@@ -6,7 +6,7 @@
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
-import android.support.v7.view.ActionMode;
+import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
--
To view, visit https://gerrit.wikimedia.org/r/373332
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic0e88ddeb1a79b4e5fa65ada35151a5226356b4e
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits