diff options
-rw-r--r-- | core/java/android/view/PhoneWindow.java | 33 | ||||
-rw-r--r-- | core/java/com/android/internal/app/WindowDecorActionBar.java | 52 | ||||
-rw-r--r-- | core/java/com/android/internal/view/ActionModeWrapper.java | 6 |
3 files changed, 55 insertions, 36 deletions
diff --git a/core/java/android/view/PhoneWindow.java b/core/java/android/view/PhoneWindow.java index 54a0025..341855a 100644 --- a/core/java/android/view/PhoneWindow.java +++ b/core/java/android/view/PhoneWindow.java @@ -75,6 +75,7 @@ import android.util.EventLog; import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; +import android.view.ActionMode.Callback; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.Animation; @@ -2677,28 +2678,38 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { public ActionMode startActionMode(ActionMode.Callback callback) { if (mActionMode != null) { mActionMode.finish(); + mActionMode = null; } - final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); - ActionMode mode = null; + ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + ActionModeWrapper mode = null; + ActionMode callbackMode = null; if (getCallback() != null && !isDestroyed()) { try { - mode = getCallback().onWindowStartingActionMode(wrappedCallback); + callbackMode = + getCallback().onWindowStartingActionMode(wrappedCallback); + if (callbackMode != null && callbackMode instanceof ActionModeWrapper) { + // If we get an ActionModeWrapper back, we handle its lifecycle. + mode = (ActionModeWrapper) callbackMode; + callbackMode = null; + } } catch (AbstractMethodError ame) { // Older apps might not implement this callback method. } } - if (mode != null) { - mActionMode = mode; + if (callbackMode != null) { + mActionMode = callbackMode; } else { + if (mode == null) { + mode = new ActionModeWrapper( + mContext, wrappedCallback, new StandaloneActionModeProvider()); + } if (mActionModeView != null) { mActionModeView.killMode(); } - ActionModeWrapper wrapperMode = new ActionModeWrapper( - mContext, wrappedCallback, new StandaloneActionModeProvider()); - if (callback.onCreateActionMode(wrapperMode, wrapperMode.getMenu())) { - mActionMode = wrapperMode; - wrapperMode.lockType(); + if (callback.onCreateActionMode(mode, mode.getMenu())) { + mode.lockType(); + mActionMode = mode.getWrappedActionMode(); mActionMode.invalidate(); } else { mActionMode = null; @@ -3309,7 +3320,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } if (getCallback() != null && !isDestroyed()) { try { - getCallback().onActionModeFinished(mActionMode); + getCallback().onActionModeFinished(mode); } catch (AbstractMethodError ame) { // Older apps might not implement this callback method. } diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java index 061b535..70a0b6b 100644 --- a/core/java/com/android/internal/app/WindowDecorActionBar.java +++ b/core/java/com/android/internal/app/WindowDecorActionBar.java @@ -20,8 +20,10 @@ import android.animation.ValueAnimator; import android.content.res.TypedArray; import android.view.ViewParent; import android.widget.Toolbar; + import com.android.internal.R; import com.android.internal.view.ActionBarPolicy; +import com.android.internal.view.ActionModeWrapper; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.view.menu.MenuPopupHelper; import com.android.internal.view.menu.SubMenuBuilder; @@ -46,6 +48,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.ActionMode; +import android.view.ActionMode.Callback; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; @@ -88,20 +91,20 @@ public class WindowDecorActionBar extends ActionBar implements private TabImpl mSelectedTab; private int mSavedTabPosition = INVALID_POSITION; - + private boolean mDisplayHomeAsUpSet; - ActionModeImpl mActionMode; + ActionMode mActionMode; ActionMode mDeferredDestroyActionMode; ActionMode.Callback mDeferredModeDestroyCallback; - + private boolean mLastMenuVisibility; private ArrayList<OnMenuVisibilityListener> mMenuVisibilityListeners = new ArrayList<OnMenuVisibilityListener>(); private static final int CONTEXT_DISPLAY_NORMAL = 0; private static final int CONTEXT_DISPLAY_SPLIT = 1; - + private static final int INVALID_POSITION = -1; private int mContextDisplayMode; @@ -490,15 +493,21 @@ public class WindowDecorActionBar extends ActionBar implements } public ActionMode startActionMode(ActionMode.Callback callback) { - if (mActionMode != null) { - mActionMode.finish(); - } + return new ActionModeWrapper(mContext, callback, new ActionModeProviderImpl()); + } + + private class ActionModeProviderImpl implements ActionModeWrapper.ActionModeProvider { - mOverlayLayout.setHideOnContentScrollEnabled(false); - mContextView.killMode(); - ActionModeImpl mode = new ActionModeImpl(mContextView.getContext(), callback); - if (mode.dispatchOnCreate()) { - mode.invalidate(); + @Override + public ActionMode createActionMode(Callback callback, MenuBuilder menuBuilder) { + if (mActionMode != null) { + mActionMode.finish(); + } + + mOverlayLayout.setHideOnContentScrollEnabled(false); + mContextView.killMode(); + ActionModeImpl mode = new ActionModeImpl( + mContextView.getContext(), callback, menuBuilder); mContextView.initForMode(mode); animateToMode(true); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { @@ -514,7 +523,6 @@ public class WindowDecorActionBar extends ActionBar implements mActionMode = mode; return mode; } - return null; } private void configureTab(Tab tab, int position) { @@ -942,11 +950,14 @@ public class WindowDecorActionBar extends ActionBar implements private ActionMode.Callback mCallback; private WeakReference<View> mCustomView; - public ActionModeImpl(Context context, ActionMode.Callback callback) { + public ActionModeImpl( + Context context, ActionMode.Callback callback, MenuBuilder menuBuilder) { mActionModeContext = context; mCallback = callback; - mMenu = new MenuBuilder(context) - .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + mMenu = menuBuilder == null + ? new MenuBuilder(context) + .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + : menuBuilder; mMenu.setCallback(this); } @@ -1008,15 +1019,6 @@ public class WindowDecorActionBar extends ActionBar implements } } - public boolean dispatchOnCreate() { - mMenu.stopDispatchingItemsChanged(); - try { - return mCallback.onCreateActionMode(this, mMenu); - } finally { - mMenu.startDispatchingItemsChanged(); - } - } - @Override public void setCustomView(View view) { mContextView.setCustomView(view); diff --git a/core/java/com/android/internal/view/ActionModeWrapper.java b/core/java/com/android/internal/view/ActionModeWrapper.java index 72066b9..d98617d 100644 --- a/core/java/com/android/internal/view/ActionModeWrapper.java +++ b/core/java/com/android/internal/view/ActionModeWrapper.java @@ -113,6 +113,10 @@ public class ActionModeWrapper extends ActionMode { } } + public ActionMode getWrappedActionMode() { + return mActionMode; + } + /** * Set the current type as final and create the necessary ActionMode. After this call, any * changes to the ActionMode type will be ignored. @@ -165,6 +169,8 @@ public class ActionModeWrapper extends ActionMode { public void finish() { if (mActionMode != null) { mActionMode.finish(); + } else { + mCallback.onDestroyActionMode(this); } } |