create changelog entry
[debian/openrocket] / android-libraries / ActionBarSherlock / src / com / actionbarsherlock / internal / ActionBarSherlockNative.java
1 package com.actionbarsherlock.internal;
2
3 import com.actionbarsherlock.ActionBarSherlock;
4 import com.actionbarsherlock.app.ActionBar;
5 import com.actionbarsherlock.internal.app.ActionBarWrapper;
6 import com.actionbarsherlock.internal.view.menu.MenuWrapper;
7 import com.actionbarsherlock.view.ActionMode;
8 import com.actionbarsherlock.view.MenuInflater;
9 import android.app.Activity;
10 import android.content.Context;
11 import android.util.Log;
12 import android.util.TypedValue;
13 import android.view.ContextThemeWrapper;
14 import android.view.View;
15 import android.view.Window;
16 import android.view.ViewGroup.LayoutParams;
17
18 @ActionBarSherlock.Implementation(api = 14)
19 public class ActionBarSherlockNative extends ActionBarSherlock {
20     private ActionBarWrapper mActionBar;
21     private ActionModeWrapper mActionMode;
22     private MenuWrapper mMenu;
23
24     public ActionBarSherlockNative(Activity activity, int flags) {
25         super(activity, flags);
26     }
27
28
29     @Override
30     public ActionBar getActionBar() {
31         if (DEBUG) Log.d(TAG, "[getActionBar]");
32
33         initActionBar();
34         return mActionBar;
35     }
36
37     private void initActionBar() {
38         if (mActionBar != null || mActivity.getActionBar() == null) {
39             return;
40         }
41
42         mActionBar = new ActionBarWrapper(mActivity);
43     }
44
45     @Override
46     public void dispatchInvalidateOptionsMenu() {
47         if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]");
48
49         mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
50     }
51
52     @Override
53     public boolean dispatchCreateOptionsMenu(android.view.Menu menu) {
54         if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu);
55
56         if (mMenu == null || menu != mMenu.unwrap()) {
57             mMenu = new MenuWrapper(menu);
58         }
59
60         final boolean result = callbackCreateOptionsMenu(mMenu);
61         if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result);
62         return result;
63     }
64
65     @Override
66     public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) {
67         if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu);
68
69         final boolean result = callbackPrepareOptionsMenu(mMenu);
70         if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result);
71         return result;
72     }
73
74     @Override
75     public boolean dispatchOptionsItemSelected(android.view.MenuItem item) {
76         if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed());
77
78         final boolean result = callbackOptionsItemSelected(mMenu.findItem(item));
79         if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result);
80         return result;
81     }
82
83     @Override
84     public boolean hasFeature(int feature) {
85         if (DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature);
86
87         final boolean result = mActivity.getWindow().hasFeature(feature);
88         if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result);
89         return result;
90     }
91
92     @Override
93     public boolean requestFeature(int featureId) {
94         if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId);
95
96         final boolean result = mActivity.getWindow().requestFeature(featureId);
97         if (DEBUG) Log.d(TAG, "[requestFeature] returning " + result);
98         return result;
99     }
100
101     @Override
102     public void setUiOptions(int uiOptions) {
103         if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions);
104
105         mActivity.getWindow().setUiOptions(uiOptions);
106     }
107
108     @Override
109     public void setUiOptions(int uiOptions, int mask) {
110         if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask);
111
112         mActivity.getWindow().setUiOptions(uiOptions, mask);
113     }
114
115     @Override
116     public void setContentView(int layoutResId) {
117         if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId);
118
119         mActivity.getWindow().setContentView(layoutResId);
120         initActionBar();
121     }
122
123     @Override
124     public void setContentView(View view, LayoutParams params) {
125         if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params);
126
127         mActivity.getWindow().setContentView(view, params);
128         initActionBar();
129     }
130
131     @Override
132     public void addContentView(View view, LayoutParams params) {
133         if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params);
134
135         mActivity.getWindow().addContentView(view, params);
136         initActionBar();
137     }
138
139     @Override
140     public void setTitle(CharSequence title) {
141         if (DEBUG) Log.d(TAG, "[setTitle] title: " + title);
142
143         mActivity.getWindow().setTitle(title);
144     }
145
146     @Override
147     public void setProgressBarVisibility(boolean visible) {
148         if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible);
149
150         mActivity.setProgressBarVisibility(visible);
151     }
152
153     @Override
154     public void setProgressBarIndeterminateVisibility(boolean visible) {
155         if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible);
156
157         mActivity.setProgressBarIndeterminateVisibility(visible);
158     }
159
160     @Override
161     public void setProgressBarIndeterminate(boolean indeterminate) {
162         if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate);
163
164         mActivity.setProgressBarIndeterminate(indeterminate);
165     }
166
167     @Override
168     public void setProgress(int progress) {
169         if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress);
170
171         mActivity.setProgress(progress);
172     }
173
174     @Override
175     public void setSecondaryProgress(int secondaryProgress) {
176         if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress);
177
178         mActivity.setSecondaryProgress(secondaryProgress);
179     }
180
181     @Override
182     protected Context getThemedContext() {
183         Context context = mActivity;
184         TypedValue outValue = new TypedValue();
185         mActivity.getTheme().resolveAttribute(android.R.attr.actionBarWidgetTheme, outValue, true);
186         if (outValue.resourceId != 0) {
187             //We are unable to test if this is the same as our current theme
188             //so we just wrap it and hope that if the attribute was specified
189             //then the user is intentionally specifying an alternate theme.
190             context = new ContextThemeWrapper(context, outValue.resourceId);
191         }
192         return context;
193     }
194
195     @Override
196     public ActionMode startActionMode(com.actionbarsherlock.view.ActionMode.Callback callback) {
197         if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback);
198
199         if (mActionMode != null) {
200             mActionMode.finish();
201         }
202         ActionModeCallbackWrapper wrapped = null;
203         if (callback != null) {
204             wrapped = new ActionModeCallbackWrapper(callback);
205         }
206
207         //Calling this will trigger the callback wrapper's onCreate which
208         //is where we will set the new instance to mActionMode since we need
209         //to pass it through to the sherlock callbacks and the call below
210         //will not have returned yet to store its value.
211         mActivity.startActionMode(wrapped);
212
213         return mActionMode;
214     }
215
216     private class ActionModeCallbackWrapper implements android.view.ActionMode.Callback {
217         private final ActionMode.Callback mCallback;
218
219         public ActionModeCallbackWrapper(ActionMode.Callback callback) {
220             mCallback = callback;
221         }
222
223         @Override
224         public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) {
225             //See ActionBarSherlockNative#startActionMode
226             mActionMode = new ActionModeWrapper(mode);
227
228             return mCallback.onCreateActionMode(mActionMode, mActionMode.getMenu());
229         }
230
231         @Override
232         public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) {
233             return mCallback.onPrepareActionMode(mActionMode, mActionMode.getMenu());
234         }
235
236         @Override
237         public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) {
238             return mCallback.onActionItemClicked(mActionMode, mActionMode.getMenu().findItem(item));
239         }
240
241         @Override
242         public void onDestroyActionMode(android.view.ActionMode mode) {
243             mCallback.onDestroyActionMode(mActionMode);
244         }
245     }
246
247     private class ActionModeWrapper extends ActionMode {
248         private final android.view.ActionMode mActionMode;
249         private MenuWrapper mMenu = null;
250
251         ActionModeWrapper(android.view.ActionMode actionMode) {
252             mActionMode = actionMode;
253         }
254
255         @Override
256         public void setTitle(CharSequence title) {
257             mActionMode.setTitle(title);
258         }
259
260         @Override
261         public void setTitle(int resId) {
262             mActionMode.setTitle(resId);
263         }
264
265         @Override
266         public void setSubtitle(CharSequence subtitle) {
267             mActionMode.setSubtitle(subtitle);
268         }
269
270         @Override
271         public void setSubtitle(int resId) {
272             mActionMode.setSubtitle(resId);
273         }
274
275         @Override
276         public void setCustomView(View view) {
277             mActionMode.setCustomView(view);
278         }
279
280         @Override
281         public void invalidate() {
282             mActionMode.invalidate();
283         }
284
285         @Override
286         public void finish() {
287             mActionMode.finish();
288         }
289
290         @Override
291         public MenuWrapper getMenu() {
292             if (mMenu == null) {
293                 mMenu = new MenuWrapper(mActionMode.getMenu());
294             }
295             return mMenu;
296         }
297
298         @Override
299         public CharSequence getTitle() {
300             return mActionMode.getTitle();
301         }
302
303         @Override
304         public CharSequence getSubtitle() {
305             return mActionMode.getSubtitle();
306         }
307
308         @Override
309         public View getCustomView() {
310             return mActionMode.getCustomView();
311         }
312
313         @Override
314         public MenuInflater getMenuInflater() {
315             return ActionBarSherlockNative.this.getMenuInflater();
316         }
317
318         @Override
319         public void setTag(Object tag) {
320             mActionMode.setTag(tag);
321         }
322
323         @Override
324         public Object getTag() {
325             return mActionMode.getTag();
326         }
327     }
328 }