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.annotation.TargetApi; 20import android.content.Context; 21import android.os.Build; 22import android.support.v4.internal.view.SupportMenu; 23import android.support.v4.internal.view.SupportMenuItem; 24import android.support.v4.util.SimpleArrayMap; 25import android.support.v7.internal.view.menu.MenuWrapperFactory; 26import android.view.ActionMode; 27import android.view.Menu; 28import android.view.MenuInflater; 29import android.view.View; 30 31import java.util.ArrayList; 32 33/** 34 * Wraps a support {@link android.support.v7.view.ActionMode} as a framework 35 * {@link android.view.ActionMode}. 36 * 37 * @hide 38 */ 39@TargetApi(Build.VERSION_CODES.HONEYCOMB) 40public class SupportActionModeWrapper extends ActionMode { 41 42 final Context mContext; 43 final android.support.v7.view.ActionMode mWrappedObject; 44 45 public SupportActionModeWrapper(Context context, 46 android.support.v7.view.ActionMode supportActionMode) { 47 mContext = context; 48 mWrappedObject = supportActionMode; 49 } 50 51 @Override 52 public Object getTag() { 53 return mWrappedObject.getTag(); 54 } 55 56 @Override 57 public void setTag(Object tag) { 58 mWrappedObject.setTag(tag); 59 } 60 61 @Override 62 public void setTitle(CharSequence title) { 63 mWrappedObject.setTitle(title); 64 } 65 66 @Override 67 public void setSubtitle(CharSequence subtitle) { 68 mWrappedObject.setSubtitle(subtitle); 69 } 70 71 @Override 72 public void invalidate() { 73 mWrappedObject.invalidate(); 74 } 75 76 @Override 77 public void finish() { 78 mWrappedObject.finish(); 79 } 80 81 @Override 82 public Menu getMenu() { 83 return MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) mWrappedObject.getMenu()); 84 } 85 86 @Override 87 public CharSequence getTitle() { 88 return mWrappedObject.getTitle(); 89 } 90 91 @Override 92 public void setTitle(int resId) { 93 mWrappedObject.setTitle(resId); 94 } 95 96 @Override 97 public CharSequence getSubtitle() { 98 return mWrappedObject.getSubtitle(); 99 } 100 101 @Override 102 public void setSubtitle(int resId) { 103 mWrappedObject.setSubtitle(resId); 104 } 105 106 @Override 107 public View getCustomView() { 108 return mWrappedObject.getCustomView(); 109 } 110 111 @Override 112 public void setCustomView(View view) { 113 mWrappedObject.setCustomView(view); 114 } 115 116 @Override 117 public MenuInflater getMenuInflater() { 118 return mWrappedObject.getMenuInflater(); 119 } 120 121 @Override 122 public boolean getTitleOptionalHint() { 123 return mWrappedObject.getTitleOptionalHint(); 124 } 125 126 @Override 127 public void setTitleOptionalHint(boolean titleOptional) { 128 mWrappedObject.setTitleOptionalHint(titleOptional); 129 } 130 131 @Override 132 public boolean isTitleOptional() { 133 return mWrappedObject.isTitleOptional(); 134 } 135 136 /** 137 * @hide 138 */ 139 public static class CallbackWrapper implements android.support.v7.view.ActionMode.Callback { 140 final Callback mWrappedCallback; 141 final Context mContext; 142 143 final ArrayList<SupportActionModeWrapper> mActionModes; 144 final SimpleArrayMap<Menu, Menu> mMenus; 145 146 public CallbackWrapper(Context context, Callback supportCallback) { 147 mContext = context; 148 mWrappedCallback = supportCallback; 149 mActionModes = new ArrayList<>(); 150 mMenus = new SimpleArrayMap<>(); 151 } 152 153 @Override 154 public boolean onCreateActionMode(android.support.v7.view.ActionMode mode, Menu menu) { 155 return mWrappedCallback.onCreateActionMode(getActionModeWrapper(mode), 156 getMenuWrapper(menu)); 157 } 158 159 @Override 160 public boolean onPrepareActionMode(android.support.v7.view.ActionMode mode, Menu menu) { 161 return mWrappedCallback.onPrepareActionMode(getActionModeWrapper(mode), 162 getMenuWrapper(menu)); 163 } 164 165 @Override 166 public boolean onActionItemClicked(android.support.v7.view.ActionMode mode, 167 android.view.MenuItem item) { 168 return mWrappedCallback.onActionItemClicked(getActionModeWrapper(mode), 169 MenuWrapperFactory.wrapSupportMenuItem(mContext, (SupportMenuItem) item)); 170 } 171 172 @Override 173 public void onDestroyActionMode(android.support.v7.view.ActionMode mode) { 174 mWrappedCallback.onDestroyActionMode(getActionModeWrapper(mode)); 175 } 176 177 private Menu getMenuWrapper(Menu menu) { 178 Menu wrapper = mMenus.get(menu); 179 if (wrapper == null) { 180 wrapper = MenuWrapperFactory.wrapSupportMenu(mContext, (SupportMenu) menu); 181 mMenus.put(menu, wrapper); 182 } 183 return wrapper; 184 } 185 186 public ActionMode getActionModeWrapper(android.support.v7.view.ActionMode mode) { 187 // First see if we already have a wrapper for this mode 188 for (int i = 0, count = mActionModes.size(); i < count; i++) { 189 SupportActionModeWrapper wrapper = mActionModes.get(i); 190 if (wrapper != null && wrapper.mWrappedObject == mode) { 191 // We've found a wrapper, return it 192 return wrapper; 193 } 194 } 195 196 // If we reach here then we haven't seen this mode before. Create a new wrapper and 197 // add it to our collection 198 SupportActionModeWrapper wrapper = new SupportActionModeWrapper(mContext, mode); 199 mActionModes.add(wrapper); 200 return wrapper; 201 } 202 } 203}