summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/PhoneWindow.java33
-rw-r--r--core/java/com/android/internal/app/WindowDecorActionBar.java52
-rw-r--r--core/java/com/android/internal/view/ActionModeWrapper.java6
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);
}
}