From 4cfc36edc3015a3272fc5c4e2b791913f308e125 Mon Sep 17 00:00:00 2001 From: tedchoc Date: Mon, 8 Jun 2015 11:39:25 -0700 Subject: [PATCH] Disable moving the omnibox if a floating action bar is being used. Fixes an issue where "Copy URL" showed up multiple times. The documentation implies items should be added in onPrepareActionMode, but that is called more than once. Move it to onCreateActionMode instead. BUG=497240,405907 Review URL: https://codereview.chromium.org/1148723008 Cr-Commit-Position: refs/heads/master@{#333299} --- .../browser/CustomSelectionActionModeCallback.java | 65 ++++++++++++++++++++++ .../chrome/browser/omnibox/LocationBarLayout.java | 6 +- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/CustomSelectionActionModeCallback.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/CustomSelectionActionModeCallback.java index d1cf7f87f18b..f226cd59823b 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/CustomSelectionActionModeCallback.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/CustomSelectionActionModeCallback.java @@ -8,11 +8,19 @@ import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** * A class that represents a custom ActionMode.Callback. */ public class CustomSelectionActionModeCallback implements ActionMode.Callback { + private static boolean sInitializedTypeMethods; + private static Method sGetTypeMethod; + private static int sTypeFloating; + private ContextualMenuBar mContextualMenuBar; /** @@ -29,11 +37,13 @@ public class CustomSelectionActionModeCallback implements ActionMode.Callback { @Override public void onDestroyActionMode(ActionMode mode) { + if (isFloatingActionMode(mode)) return; mContextualMenuBar.hideControls(); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { + if (isFloatingActionMode(mode)) return true; mContextualMenuBar.showControls(); return true; } @@ -42,4 +52,59 @@ public class CustomSelectionActionModeCallback implements ActionMode.Callback { public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } + + // TODO(tedchoc): Delete this method and replace with just getType() when a public M SDK is + // available. + private static boolean isFloatingActionMode(ActionMode mode) { + initializeGetTypeMethods(); + + if (sGetTypeMethod == null) return false; + + Object retVal = null; + try { + retVal = sGetTypeMethod.invoke(mode); + } catch (IllegalAccessException e) { + return false; + } catch (IllegalArgumentException e) { + return false; + } catch (InvocationTargetException e) { + return false; + } + if (!(retVal instanceof Integer)) return false; + + return ((Integer) retVal).intValue() == sTypeFloating; + } + + private static void initializeGetTypeMethods() { + if (sInitializedTypeMethods) return; + sInitializedTypeMethods = true; + + Method getType = null; + int typeFloating = -1; + try { + getType = ActionMode.class.getMethod("getType"); + } catch (NoSuchMethodException e) { + return; + } + + try { + Field field = ActionMode.class.getField("TYPE_FLOATING"); + Object value = field.get(null); + + if (value instanceof Integer) { + typeFloating = (Integer) value; + } else { + return; + } + } catch (NoSuchFieldException e) { + return; + } catch (IllegalAccessException e) { + return; + } catch (IllegalArgumentException e) { + return; + } + + sGetTypeMethod = getType; + sTypeFloating = typeFloating; + } } diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 321904506311..ca8b5e60850e 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java @@ -790,10 +790,10 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener, mContextualMenuBar.setCustomSelectionActionModeCallback( new CustomSelectionActionModeCallback() { @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - super.onPrepareActionMode(mode, menu); + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + boolean retVal = super.onCreateActionMode(mode, menu); mode.getMenuInflater().inflate(R.menu.textselectionmenu, menu); - return true; + return retVal; } @Override -- 2.11.4.GIT