1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.v7.internal.view; 18 19import android.content.Context; 20import android.support.v7.internal.view.menu.MenuWrapperFactory; 21import android.support.v7.view.ActionMode; 22import android.view.Menu; 23import android.view.MenuInflater; 24import android.view.View; 25 26/** 27 * @hide 28 */ 29public class ActionModeWrapper extends ActionMode { 30 31 final MenuInflater mInflater; 32 final android.view.ActionMode mWrappedObject; 33 34 public ActionModeWrapper(Context context, android.view.ActionMode frameworkActionMode) { 35 mWrappedObject = frameworkActionMode; 36 mInflater = new SupportMenuInflater(context); 37 } 38 39 @Override 40 public Object getTag() { 41 return mWrappedObject.getTag(); 42 } 43 44 @Override 45 public void setTag(Object tag) { 46 mWrappedObject.setTag(tag); 47 } 48 49 @Override 50 public boolean getTitleOptionalHint() { 51 return mWrappedObject.getTitleOptionalHint(); 52 } 53 54 @Override 55 public void setTitleOptionalHint(boolean titleOptional) { 56 mWrappedObject.setTitleOptionalHint(titleOptional); 57 } 58 59 @Override 60 public boolean isTitleOptional() { 61 return mWrappedObject.isTitleOptional(); 62 } 63 64 @Override 65 public void setTitle(CharSequence title) { 66 mWrappedObject.setTitle(title); 67 } 68 69 @Override 70 public void setSubtitle(CharSequence subtitle) { 71 mWrappedObject.setSubtitle(subtitle); 72 } 73 74 @Override 75 public void invalidate() { 76 mWrappedObject.invalidate(); 77 } 78 79 @Override 80 public void finish() { 81 mWrappedObject.finish(); 82 } 83 84 @Override 85 public Menu getMenu() { 86 return MenuWrapperFactory.createMenuWrapper(mWrappedObject.getMenu()); 87 } 88 89 @Override 90 public CharSequence getTitle() { 91 return mWrappedObject.getTitle(); 92 } 93 94 @Override 95 public void setTitle(int resId) { 96 mWrappedObject.setTitle(resId); 97 } 98 99 @Override 100 public CharSequence getSubtitle() { 101 return mWrappedObject.getSubtitle(); 102 } 103 104 @Override 105 public void setSubtitle(int resId) { 106 mWrappedObject.setSubtitle(resId); 107 } 108 109 @Override 110 public View getCustomView() { 111 return mWrappedObject.getCustomView(); 112 } 113 114 @Override 115 public void setCustomView(View view) { 116 mWrappedObject.setCustomView(view); 117 } 118 119 @Override 120 public MenuInflater getMenuInflater() { 121 return mInflater; 122 } 123 124 /** 125 * @hide 126 */ 127 public static class CallbackWrapper implements android.view.ActionMode.Callback { 128 final Callback mWrappedCallback; 129 final Context mContext; 130 131 private ActionModeWrapper mLastStartedActionMode; 132 133 public CallbackWrapper(Context context, Callback supportCallback) { 134 mContext = context; 135 mWrappedCallback = supportCallback; 136 } 137 138 @Override 139 public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) { 140 return mWrappedCallback.onCreateActionMode(getActionModeWrapper(mode), 141 MenuWrapperFactory.createMenuWrapper(menu)); 142 } 143 144 @Override 145 public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) { 146 return mWrappedCallback.onPrepareActionMode(getActionModeWrapper(mode), 147 MenuWrapperFactory.createMenuWrapper(menu)); 148 } 149 150 @Override 151 public boolean onActionItemClicked(android.view.ActionMode mode, 152 android.view.MenuItem item) { 153 return mWrappedCallback.onActionItemClicked(getActionModeWrapper(mode), 154 MenuWrapperFactory.createMenuItemWrapper(item)); 155 } 156 157 @Override 158 public void onDestroyActionMode(android.view.ActionMode mode) { 159 mWrappedCallback.onDestroyActionMode(getActionModeWrapper(mode)); 160 } 161 162 public void setLastStartedActionMode(ActionModeWrapper modeWrapper) { 163 mLastStartedActionMode = modeWrapper; 164 } 165 166 private ActionMode getActionModeWrapper(android.view.ActionMode mode) { 167 if (mLastStartedActionMode != null && mLastStartedActionMode.mWrappedObject == mode) { 168 // If the given mode equals our wrapped mode, just return it 169 return mLastStartedActionMode; 170 } else { 171 return new ActionModeWrapper(mContext, mode); 172 } 173 } 174 } 175} 176