Loading core/java/android/view/PhoneWindow.java +22 −11 Original line number Diff line number Diff line Loading @@ -76,6 +76,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; Loading Loading @@ -2678,28 +2679,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; Loading Loading @@ -3310,7 +3321,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. } Loading core/java/com/android/internal/app/WindowDecorActionBar.java +27 −25 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -91,7 +94,7 @@ public class WindowDecorActionBar extends ActionBar implements private boolean mDisplayHomeAsUpSet; ActionModeImpl mActionMode; ActionMode mActionMode; ActionMode mDeferredDestroyActionMode; ActionMode.Callback mDeferredModeDestroyCallback; Loading Loading @@ -490,15 +493,21 @@ public class WindowDecorActionBar extends ActionBar implements } public ActionMode startActionMode(ActionMode.Callback callback) { return new ActionModeWrapper(mContext, callback, new ActionModeProviderImpl()); } private class ActionModeProviderImpl implements ActionModeWrapper.ActionModeProvider { @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); if (mode.dispatchOnCreate()) { mode.invalidate(); ActionModeImpl mode = new ActionModeImpl( mContextView.getContext(), callback, menuBuilder); mContextView.initForMode(mode); animateToMode(true); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { Loading @@ -514,7 +523,6 @@ public class WindowDecorActionBar extends ActionBar implements mActionMode = mode; return mode; } return null; } private void configureTab(Tab tab, int position) { Loading Loading @@ -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); } Loading Loading @@ -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); Loading core/java/com/android/internal/view/ActionModeWrapper.java +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -165,6 +169,8 @@ public class ActionModeWrapper extends ActionMode { public void finish() { if (mActionMode != null) { mActionMode.finish(); } else { mCallback.onDestroyActionMode(this); } } Loading Loading
core/java/android/view/PhoneWindow.java +22 −11 Original line number Diff line number Diff line Loading @@ -76,6 +76,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; Loading Loading @@ -2678,28 +2679,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; Loading Loading @@ -3310,7 +3321,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. } Loading
core/java/com/android/internal/app/WindowDecorActionBar.java +27 −25 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -91,7 +94,7 @@ public class WindowDecorActionBar extends ActionBar implements private boolean mDisplayHomeAsUpSet; ActionModeImpl mActionMode; ActionMode mActionMode; ActionMode mDeferredDestroyActionMode; ActionMode.Callback mDeferredModeDestroyCallback; Loading Loading @@ -490,15 +493,21 @@ public class WindowDecorActionBar extends ActionBar implements } public ActionMode startActionMode(ActionMode.Callback callback) { return new ActionModeWrapper(mContext, callback, new ActionModeProviderImpl()); } private class ActionModeProviderImpl implements ActionModeWrapper.ActionModeProvider { @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); if (mode.dispatchOnCreate()) { mode.invalidate(); ActionModeImpl mode = new ActionModeImpl( mContextView.getContext(), callback, menuBuilder); mContextView.initForMode(mode); animateToMode(true); if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { Loading @@ -514,7 +523,6 @@ public class WindowDecorActionBar extends ActionBar implements mActionMode = mode; return mode; } return null; } private void configureTab(Tab tab, int position) { Loading Loading @@ -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); } Loading Loading @@ -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); Loading
core/java/com/android/internal/view/ActionModeWrapper.java +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -165,6 +169,8 @@ public class ActionModeWrapper extends ActionMode { public void finish() { if (mActionMode != null) { mActionMode.finish(); } else { mCallback.onDestroyActionMode(this); } } Loading