Merge "Fix calling ActionMode optional title methods pre-v16" into klp-ub-dev
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateICS.java b/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateICS.java
index 7b3bb59..22d23f9 100644
--- a/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateICS.java
+++ b/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateICS.java
@@ -177,14 +177,14 @@
 
         Context context = getActionBarThemedContext();
 
-        ActionModeWrapper.CallbackWrapper wrappedCallback = new ActionModeWrapper.CallbackWrapper(
+        ActionModeWrapper.CallbackWrapper wrappedCallback = createActionModeCallbackWrapper(
                 context, callback);
         ActionModeWrapper wrappedMode = null;
 
         android.view.ActionMode frameworkMode = mActivity.startActionMode(wrappedCallback);
 
         if (frameworkMode != null) {
-            wrappedMode = new ActionModeWrapper(context, frameworkMode);
+            wrappedMode = createActionModeWrapper(context, frameworkMode);
             wrappedCallback.setLastStartedActionMode(wrappedMode);
         }
 
@@ -193,7 +193,7 @@
 
     public void onActionModeStarted(android.view.ActionMode mode) {
         mActivity.onSupportActionModeStarted(
-                new ActionModeWrapper(getActionBarThemedContext(), mode));
+                createActionModeWrapper(getActionBarThemedContext(), mode));
     }
 
     @Override
@@ -218,7 +218,7 @@
 
     public void onActionModeFinished(android.view.ActionMode mode) {
         mActivity.onSupportActionModeFinished(
-                new ActionModeWrapper(getActionBarThemedContext(), mode));
+                createActionModeWrapper(getActionBarThemedContext(), mode));
     }
 
     @Override
@@ -236,6 +236,16 @@
         return android.R.attr.homeAsUpIndicator;
     }
 
+    ActionModeWrapper.CallbackWrapper createActionModeCallbackWrapper(Context context,
+            ActionMode.Callback callback) {
+        return new ActionModeWrapper.CallbackWrapper(context, callback);
+    }
+
+    ActionModeWrapper createActionModeWrapper(Context context,
+            android.view.ActionMode frameworkMode) {
+        return new ActionModeWrapper(context, frameworkMode);
+    }
+
     class WindowCallbackWrapper implements Window.Callback {
         final Window.Callback mWrapped;
 
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateJB.java b/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateJB.java
index 7454cff..a0c955f 100644
--- a/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateJB.java
+++ b/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateJB.java
@@ -16,6 +16,11 @@
 
 package android.support.v7.app;
 
+import android.content.Context;
+import android.support.v7.internal.view.ActionModeWrapper;
+import android.support.v7.internal.view.ActionModeWrapperJB;
+import android.support.v7.view.ActionMode;
+
 class ActionBarActivityDelegateJB extends ActionBarActivityDelegateICS {
 
     ActionBarActivityDelegateJB(ActionBarActivity activity) {
@@ -26,4 +31,15 @@
     public ActionBar createSupportActionBar() {
         return new ActionBarImplJB(mActivity, mActivity);
     }
+
+    @Override
+    ActionModeWrapper.CallbackWrapper createActionModeCallbackWrapper(Context context,
+            ActionMode.Callback callback) {
+        return new ActionModeWrapperJB.CallbackWrapper(context, callback);
+    }
+
+    @Override
+    ActionModeWrapper createActionModeWrapper(Context context, android.view.ActionMode frameworkMode) {
+        return new ActionModeWrapperJB(context, frameworkMode);
+    }
 }
diff --git a/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapper.java b/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapper.java
index f124da3..2048d2b 100644
--- a/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapper.java
+++ b/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapper.java
@@ -47,21 +47,6 @@
     }
 
     @Override
-    public boolean getTitleOptionalHint() {
-        return mWrappedObject.getTitleOptionalHint();
-    }
-
-    @Override
-    public void setTitleOptionalHint(boolean titleOptional) {
-        mWrappedObject.setTitleOptionalHint(titleOptional);
-    }
-
-    @Override
-    public boolean isTitleOptional() {
-        return mWrappedObject.isTitleOptional();
-    }
-
-    @Override
     public void setTitle(CharSequence title) {
         mWrappedObject.setTitle(title);
     }
@@ -168,8 +153,13 @@
                 // If the given mode equals our wrapped mode, just return it
                 return mLastStartedActionMode;
             } else {
-                return new ActionModeWrapper(mContext, mode);
+                return createActionModeWrapper(mContext, mode);
             }
         }
+
+        protected ActionModeWrapper createActionModeWrapper(Context context,
+                android.view.ActionMode mode) {
+            return new ActionModeWrapper(context, mode);
+        }
     }
 }
diff --git a/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapperJB.java b/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapperJB.java
new file mode 100644
index 0000000..15ede6e
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/internal/view/ActionModeWrapperJB.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v7.internal.view;
+
+import android.content.Context;
+import android.view.ActionMode;
+
+/**
+ * @hide
+ */
+public class ActionModeWrapperJB extends ActionModeWrapper {
+
+    public ActionModeWrapperJB(Context context, android.view.ActionMode frameworkActionMode) {
+        super(context, frameworkActionMode);
+    }
+
+    @Override
+    public boolean getTitleOptionalHint() {
+        return mWrappedObject.getTitleOptionalHint();
+    }
+
+    @Override
+    public void setTitleOptionalHint(boolean titleOptional) {
+        mWrappedObject.setTitleOptionalHint(titleOptional);
+    }
+
+    @Override
+    public boolean isTitleOptional() {
+        return mWrappedObject.isTitleOptional();
+    }
+
+    /**
+     * @hide
+     */
+    public static class CallbackWrapper extends ActionModeWrapper.CallbackWrapper {
+
+        public CallbackWrapper(Context context, Callback supportCallback) {
+            super(context, supportCallback);
+        }
+
+        @Override
+        protected ActionModeWrapper createActionModeWrapper(Context context, ActionMode mode) {
+            return new ActionModeWrapperJB(context, mode);
+        }
+    }
+
+}