Mholloway has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/248994

Change subject: Add share-a-fact support on 6.0 Marshmallow
......................................................................

Add share-a-fact support on 6.0 Marshmallow

It seems that onSupportActionModeStarted/Finished are not called after
text is highlighted on 6.0.  This patch adds support (unfortunately in a
necessarily DRY-violating way) for injecting our CAB menu via onActionMode
Started/Finished.

Bug: T116120
Change-Id: I48f5a99d5c14a4a53d7f12abec01abb291268fee
---
A app/src/main/java/org/wikipedia/page/CustomCabHelper.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
M app/src/main/java/org/wikipedia/util/ApiUtil.java
5 files changed, 149 insertions(+), 33 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/94/248994/1

diff --git a/app/src/main/java/org/wikipedia/page/CustomCabHelper.java 
b/app/src/main/java/org/wikipedia/page/CustomCabHelper.java
new file mode 100644
index 0000000..d80b42b
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/CustomCabHelper.java
@@ -0,0 +1,56 @@
+package org.wikipedia.page;
+
+import android.support.v7.view.ActionMode;
+import android.view.Menu;
+
+import org.wikipedia.R;
+
+public final class CustomCabHelper {
+
+    public static void injectCustomMenu(PageActivity activity, ActionMode 
mode) {
+        if (!activity.isCabOpen() && !isAppInitiatedActionMode(mode) && 
activity.getCurPageFragment() != null) {
+            // Initiated by the system, likely in response to highlighting 
text in the WebView.
+            replaceTextSelectMenu(mode);
+            activity.getCurPageFragment().onActionModeShown(mode);
+        }
+
+        activity.setSupportActionMode(mode);
+        activity.getSearchBarHideHandler().setForceNoFade(true);
+    }
+
+    public static void injectCustomMenu(PageActivity activity, 
android.view.ActionMode mode) {
+        if (!activity.isCabOpen() && !isAppInitiatedActionMode(mode) && 
activity.getCurPageFragment() != null) {
+            // Initiated by the system, likely in response to highlighting 
text in the WebView.
+            replaceTextSelectMenu(mode);
+            activity.getCurPageFragment().onActionModeShown(mode);
+        }
+
+        activity.setActionMode(mode);
+        activity.getSearchBarHideHandler().setForceNoFade(true);
+    }
+
+    private static boolean isAppInitiatedActionMode(ActionMode mode) {
+        // ActionMode in non-WebView components (History, Saved Pages, or Find 
In Page) must call
+        // setTag().
+        return mode.getTag() != null;
+    }
+
+    private static boolean isAppInitiatedActionMode(android.view.ActionMode 
mode) {
+        return mode.getTag() != null;
+    }
+
+    private static void replaceTextSelectMenu(ActionMode mode) {
+        Menu menu = mode.getMenu();
+        menu.clear();
+        mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
+    }
+
+    private static void replaceTextSelectMenu(android.view.ActionMode mode) {
+        Menu menu = mode.getMenu();
+        menu.clear();
+        mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
+    }
+
+    private CustomCabHelper() {
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java 
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index df7cfe6..d68c682 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -106,7 +106,8 @@
     private TextView searchHintText;
     private ProgressBar progressBar;
     private View toolbarContainer;
-    private ActionMode currentActionMode;
+    private android.view.ActionMode currentActionMode;
+    private ActionMode currentSupportActionMode;
     private ActionBarDrawerToggle mDrawerToggle;
     private SearchBarHideHandler searchBarHideHandler;
     private boolean pausedStateOfZero;
@@ -173,6 +174,14 @@
 
     private boolean wasNavItemSelected() {
         return navItemSelected;
+    }
+
+    void setSupportActionMode(ActionMode mode) {
+        currentSupportActionMode = mode;
+    }
+
+    void setActionMode(android.view.ActionMode mode) {
+        currentActionMode = mode;
     }
 
     @Override
@@ -272,6 +281,14 @@
         new RecurringTasksExecutor(app).run();
     }
 
+    private void finishActionMode() {
+        if (ApiUtil.hasMarshmallow()) {
+            currentActionMode.finish();
+        } else {
+            currentSupportActionMode.finish();
+        }
+    }
+
     private class MainDrawerToggle extends ActionBarDrawerToggle {
         private boolean oncePerSlideLock = false;
 
@@ -303,7 +320,7 @@
             }
             // also make sure we're not inside an action mode
             if (isCabOpen()) {
-                currentActionMode.finish();
+                finishActionMode();
             }
             updateNavDrawerSelection(getTopFragment());
             navDrawerHelper.getFunnel().logOpen();
@@ -381,6 +398,11 @@
 
     public void setNavMenuItemRandomEnabled(boolean enabled) {
         navMenu.findItem(R.id.nav_item_random).setEnabled(enabled);
+    }
+
+    /** @return True if the contextual action bar is open. */
+    public boolean isCabOpen() {
+        return currentActionMode != null || currentSupportActionMode != null;
     }
 
     @Override
@@ -689,7 +711,7 @@
             return;
         }
         if (isCabOpen()) {
-            currentActionMode.finish();
+            finishActionMode();
             return;
         }
         if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
@@ -883,34 +905,28 @@
      */
     @Override
     public void onSupportActionModeStarted(ActionMode mode) {
-        if (!isCabOpen() && !isAppInitiatedActionMode(mode) && 
getCurPageFragment() != null) {
-            // Initiated by the system, likely in response to highlighting 
text in the WebView.
-            replaceTextSelectMenu(mode);
-            getCurPageFragment().onActionModeShown(mode);
-        }
-
-        currentActionMode = mode;
-        searchBarHideHandler.setForceNoFade(true);
-
+        CustomCabHelper.injectCustomMenu(PageActivity.this, mode);
         super.onSupportActionModeStarted(mode);
     }
 
     @Override
     public void onSupportActionModeFinished(ActionMode mode) {
-        currentActionMode = null;
+        setSupportActionMode(null);
         searchBarHideHandler.setForceNoFade(false);
         super.onSupportActionModeFinished(mode);
     }
 
-    private boolean isAppInitiatedActionMode(ActionMode mode) {
-        // ActionMode in non-WebView components (History, Saved Pages, or Find 
In Page) must call
-        // setTag().
-        return mode.getTag() != null;
+    @Override
+    public void onActionModeStarted(android.view.ActionMode mode) {
+        CustomCabHelper.injectCustomMenu(PageActivity.this, mode);
+        super.onActionModeStarted(mode);
     }
 
-    /** @return True if the contextual action bar is open. */
-    private boolean isCabOpen() {
-        return currentActionMode != null;
+    @Override
+    public void onActionModeFinished(android.view.ActionMode mode) {
+        setActionMode(null);
+        searchBarHideHandler.setForceNoFade(false);
+        super.onActionModeFinished(mode);
     }
 
     private void registerBus() {
@@ -983,11 +999,5 @@
                 new ComponentName(this, WidgetProviderFeaturedPage.class));
         widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
         sendBroadcast(widgetIntent);
-    }
-
-    private void replaceTextSelectMenu(ActionMode mode) {
-        Menu menu = mode.getMenu();
-        menu.clear();
-        mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
     }
 }
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index f654917..cd8497f 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -620,6 +620,13 @@
         }
     }
 
+    public void onActionModeShown(android.view.ActionMode mode) {
+        // make sure we have a page loaded, since shareHandler makes 
references to it.
+        if (model.getPage() != null) {
+            shareHandler.onTextSelected(mode);
+        }
+    }
+
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
         super.onActivityResult(requestCode, resultCode, data);
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 11b9ccf..2736d16 100755
--- a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
@@ -32,6 +32,7 @@
 import org.wikipedia.page.PageFragment;
 import org.wikipedia.tooltip.ToolTipUtil;
 import org.wikipedia.activity.ActivityUtil;
+import org.wikipedia.util.ApiUtil;
 import org.wikipedia.util.ClipboardUtil;
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ShareUtils;
@@ -58,7 +59,8 @@
 
     private final PageActivity activity;
     private final CommunicationBridge bridge;
-    private ActionMode webViewActionMode;
+    private ActionMode webViewSupportActionMode;
+    private android.view.ActionMode webViewActionMode;
     private Dialog shareDialog;
     private ShareAFactFunnel funnel;
 
@@ -177,11 +179,21 @@
      * @param mode ActionMode under which this context is starting.
      */
     public void onTextSelected(ActionMode mode) {
-        webViewActionMode = mode;
-        Menu menu = mode.getMenu();
-
+        Menu menu = getCustomCabMenu(mode);
         MenuItem shareItem = menu.findItem(R.id.menu_text_select_share);
+        handleSelection(menu, shareItem);
+    }
 
+    /**
+     * @param mode ActionMode under which this context is starting.
+     */
+    public void onTextSelected(android.view.ActionMode mode) {
+        Menu menu = getCustomCabMenu(mode);
+        MenuItem shareItem = menu.findItem(R.id.menu_text_select_share);
+        handleSelection(menu, shareItem);
+    }
+
+    private void handleSelection(Menu menu, MenuItem shareItem) {
         if 
(WikipediaApp.getInstance().isFeatureSelectTextAndShareTutorialEnabled()
                 && 
WikipediaApp.getInstance().getOnboardingStateMachine().isShareTutorialEnabled())
 {
             showShareOnboarding(shareItem);
@@ -195,6 +207,16 @@
 
         createFunnel();
         funnel.logHighlight();
+    }
+
+    private Menu getCustomCabMenu(ActionMode mode) {
+        webViewSupportActionMode = mode;
+        return mode.getMenu();
+    }
+
+    private Menu getCustomCabMenu(android.view.ActionMode mode) {
+        webViewActionMode = mode;
+        return mode.getMenu();
     }
 
     private void showShareOnboarding(MenuItem shareItem) {
@@ -236,6 +258,23 @@
         return activity.getResources();
     }
 
+    private boolean hasWebViewActionMode () {
+        return webViewActionMode != null || webViewSupportActionMode != null;
+    }
+
+    private void nullifyWebViewActionMode() {
+        webViewSupportActionMode = null;
+        webViewActionMode = null;
+    }
+
+    private void finishWebViewActionMode() {
+        if (ApiUtil.hasMarshmallow()) {
+            webViewActionMode.finish();
+        } else {
+            webViewSupportActionMode.finish();
+        }
+    }
+
     private class RequestTextSelectOnMenuItemClickListener implements 
MenuItem.OnMenuItemClickListener {
         @NonNull private final String purpose;
         public RequestTextSelectOnMenuItemClickListener(@NonNull String 
purpose) {
@@ -247,9 +286,9 @@
             requestTextSelection(purpose);
 
             // leave context mode...
-            if (webViewActionMode != null) {
-                webViewActionMode.finish();
-                webViewActionMode = null;
+            if (hasWebViewActionMode()) {
+                finishWebViewActionMode();
+                nullifyWebViewActionMode();
             }
             return true;
         }
diff --git a/app/src/main/java/org/wikipedia/util/ApiUtil.java 
b/app/src/main/java/org/wikipedia/util/ApiUtil.java
index 611c3be..61b9123 100644
--- a/app/src/main/java/org/wikipedia/util/ApiUtil.java
+++ b/app/src/main/java/org/wikipedia/util/ApiUtil.java
@@ -28,6 +28,10 @@
         return has(Build.VERSION_CODES.JELLY_BEAN);
     }
 
+    public static boolean hasMarshmallow() {
+        return has(Build.VERSION_CODES.M);
+    }
+
     /** @return SDK level. */
     private static int getLevel() {
         return android.os.Build.VERSION.SDK_INT;

-- 
To view, visit https://gerrit.wikimedia.org/r/248994
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I48f5a99d5c14a4a53d7f12abec01abb291268fee
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to