SupportActionModeWrapper.java revision 4c2a95906254748cb9a843b061288265d6e185a9
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.v7.internal.view.menu.MenuWrapperFactory;
23import android.view.ActionMode;
24import android.view.Menu;
25import android.view.MenuInflater;
26import android.view.View;
27
28/**
29 * Wraps a support {@link android.support.v7.view.ActionMode} as a framework
30 * {@link android.view.ActionMode}.
31 *
32 * @hide
33 */
34@TargetApi(Build.VERSION_CODES.HONEYCOMB)
35public class SupportActionModeWrapper extends ActionMode {
36
37    final MenuInflater mInflater;
38    final android.support.v7.view.ActionMode mWrappedObject;
39
40    public SupportActionModeWrapper(Context context, android.support.v7.view.ActionMode supportActionMode) {
41        mWrappedObject = supportActionMode;
42        mInflater = new SupportMenuInflater(context);
43    }
44
45    @Override
46    public Object getTag() {
47        return mWrappedObject.getTag();
48    }
49
50    @Override
51    public void setTag(Object tag) {
52        mWrappedObject.setTag(tag);
53    }
54
55    @Override
56    public void setTitle(CharSequence title) {
57        mWrappedObject.setTitle(title);
58    }
59
60    @Override
61    public void setSubtitle(CharSequence subtitle) {
62        mWrappedObject.setSubtitle(subtitle);
63    }
64
65    @Override
66    public void invalidate() {
67        mWrappedObject.invalidate();
68    }
69
70    @Override
71    public void finish() {
72        mWrappedObject.finish();
73    }
74
75    @Override
76    public Menu getMenu() {
77        return MenuWrapperFactory.createMenuWrapper(mWrappedObject.getMenu());
78    }
79
80    @Override
81    public CharSequence getTitle() {
82        return mWrappedObject.getTitle();
83    }
84
85    @Override
86    public void setTitle(int resId) {
87        mWrappedObject.setTitle(resId);
88    }
89
90    @Override
91    public CharSequence getSubtitle() {
92        return mWrappedObject.getSubtitle();
93    }
94
95    @Override
96    public void setSubtitle(int resId) {
97        mWrappedObject.setSubtitle(resId);
98    }
99
100    @Override
101    public View getCustomView() {
102        return mWrappedObject.getCustomView();
103    }
104
105    @Override
106    public void setCustomView(View view) {
107        mWrappedObject.setCustomView(view);
108    }
109
110    @Override
111    public MenuInflater getMenuInflater() {
112        return mInflater;
113    }
114
115    @Override
116    public boolean getTitleOptionalHint() {
117        return mWrappedObject.getTitleOptionalHint();
118    }
119
120    @Override
121    public void setTitleOptionalHint(boolean titleOptional) {
122        mWrappedObject.setTitleOptionalHint(titleOptional);
123    }
124
125    @Override
126    public boolean isTitleOptional() {
127        return mWrappedObject.isTitleOptional();
128    }
129
130    /**
131     * @hide
132     */
133    public static class CallbackWrapper implements android.support.v7.view.ActionMode.Callback {
134        final Callback mWrappedCallback;
135        final Context mContext;
136
137        private SupportActionModeWrapper mLastStartedActionMode;
138
139        public CallbackWrapper(Context context, Callback supportCallback) {
140            mContext = context;
141            mWrappedCallback = supportCallback;
142        }
143
144        @Override
145        public boolean onCreateActionMode(android.support.v7.view.ActionMode mode, Menu menu) {
146            return mWrappedCallback.onCreateActionMode(getActionModeWrapper(mode),
147                    MenuWrapperFactory.createMenuWrapper(menu));
148        }
149
150        @Override
151        public boolean onPrepareActionMode(android.support.v7.view.ActionMode mode, Menu menu) {
152            return mWrappedCallback.onPrepareActionMode(getActionModeWrapper(mode),
153                    MenuWrapperFactory.createMenuWrapper(menu));
154        }
155
156        @Override
157        public boolean onActionItemClicked(android.support.v7.view.ActionMode mode,
158                android.view.MenuItem item) {
159            return mWrappedCallback.onActionItemClicked(getActionModeWrapper(mode),
160                    MenuWrapperFactory.createMenuItemWrapper(item));
161        }
162
163        @Override
164        public void onDestroyActionMode(android.support.v7.view.ActionMode mode) {
165            mWrappedCallback.onDestroyActionMode(getActionModeWrapper(mode));
166        }
167
168        public void setLastStartedActionMode(SupportActionModeWrapper modeWrapper) {
169            mLastStartedActionMode = modeWrapper;
170        }
171
172        private ActionMode getActionModeWrapper(android.support.v7.view.ActionMode mode) {
173            if (mLastStartedActionMode != null && mLastStartedActionMode.mWrappedObject == mode) {
174                // If the given mode equals our wrapped mode, just return it
175                return mLastStartedActionMode;
176            } else {
177                return createActionModeWrapper(mContext, mode);
178            }
179        }
180
181        protected SupportActionModeWrapper createActionModeWrapper(Context context,
182                android.support.v7.view.ActionMode mode) {
183            return new SupportActionModeWrapper(context, mode);
184        }
185    }
186}
187