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