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