package com.actionbarsherlock.internal; import com.actionbarsherlock.ActionBarSherlock; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.internal.app.ActionBarWrapper; import com.actionbarsherlock.internal.view.menu.MenuWrapper; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.MenuInflater; import android.app.Activity; import android.content.Context; import android.util.Log; import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.View; import android.view.Window; import android.view.ViewGroup.LayoutParams; @ActionBarSherlock.Implementation(api = 14) public class ActionBarSherlockNative extends ActionBarSherlock { private ActionBarWrapper mActionBar; private ActionModeWrapper mActionMode; private MenuWrapper mMenu; public ActionBarSherlockNative(Activity activity, int flags) { super(activity, flags); } @Override public ActionBar getActionBar() { if (DEBUG) Log.d(TAG, "[getActionBar]"); initActionBar(); return mActionBar; } private void initActionBar() { if (mActionBar != null || mActivity.getActionBar() == null) { return; } mActionBar = new ActionBarWrapper(mActivity); } @Override public void dispatchInvalidateOptionsMenu() { if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL); } @Override public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu); if (mMenu == null || menu != mMenu.unwrap()) { mMenu = new MenuWrapper(menu); } final boolean result = callbackCreateOptionsMenu(mMenu); if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result); return result; } @Override public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu); final boolean result = callbackPrepareOptionsMenu(mMenu); if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result); return result; } @Override public boolean dispatchOptionsItemSelected(android.view.MenuItem item) { if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed()); final boolean result = callbackOptionsItemSelected(mMenu.findItem(item)); if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result); return result; } @Override public boolean hasFeature(int feature) { if (DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature); final boolean result = mActivity.getWindow().hasFeature(feature); if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result); return result; } @Override public boolean requestFeature(int featureId) { if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); final boolean result = mActivity.getWindow().requestFeature(featureId); if (DEBUG) Log.d(TAG, "[requestFeature] returning " + result); return result; } @Override public void setUiOptions(int uiOptions) { if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions); mActivity.getWindow().setUiOptions(uiOptions); } @Override public void setUiOptions(int uiOptions, int mask) { if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask); mActivity.getWindow().setUiOptions(uiOptions, mask); } @Override public void setContentView(int layoutResId) { if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); mActivity.getWindow().setContentView(layoutResId); initActionBar(); } @Override public void setContentView(View view, LayoutParams params) { if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); mActivity.getWindow().setContentView(view, params); initActionBar(); } @Override public void addContentView(View view, LayoutParams params) { if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); mActivity.getWindow().addContentView(view, params); initActionBar(); } @Override public void setTitle(CharSequence title) { if (DEBUG) Log.d(TAG, "[setTitle] title: " + title); mActivity.getWindow().setTitle(title); } @Override public void setProgressBarVisibility(boolean visible) { if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible); mActivity.setProgressBarVisibility(visible); } @Override public void setProgressBarIndeterminateVisibility(boolean visible) { if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); mActivity.setProgressBarIndeterminateVisibility(visible); } @Override public void setProgressBarIndeterminate(boolean indeterminate) { if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); mActivity.setProgressBarIndeterminate(indeterminate); } @Override public void setProgress(int progress) { if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); mActivity.setProgress(progress); } @Override public void setSecondaryProgress(int secondaryProgress) { if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress); mActivity.setSecondaryProgress(secondaryProgress); } @Override protected Context getThemedContext() { Context context = mActivity; TypedValue outValue = new TypedValue(); mActivity.getTheme().resolveAttribute(android.R.attr.actionBarWidgetTheme, outValue, true); if (outValue.resourceId != 0) { //We are unable to test if this is the same as our current theme //so we just wrap it and hope that if the attribute was specified //then the user is intentionally specifying an alternate theme. context = new ContextThemeWrapper(context, outValue.resourceId); } return context; } @Override public ActionMode startActionMode(com.actionbarsherlock.view.ActionMode.Callback callback) { if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback); if (mActionMode != null) { mActionMode.finish(); } ActionModeCallbackWrapper wrapped = null; if (callback != null) { wrapped = new ActionModeCallbackWrapper(callback); } //Calling this will trigger the callback wrapper's onCreate which //is where we will set the new instance to mActionMode since we need //to pass it through to the sherlock callbacks and the call below //will not have returned yet to store its value. mActivity.startActionMode(wrapped); return mActionMode; } private class ActionModeCallbackWrapper implements android.view.ActionMode.Callback { private final ActionMode.Callback mCallback; public ActionModeCallbackWrapper(ActionMode.Callback callback) { mCallback = callback; } @Override public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) { //See ActionBarSherlockNative#startActionMode mActionMode = new ActionModeWrapper(mode); return mCallback.onCreateActionMode(mActionMode, mActionMode.getMenu()); } @Override public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) { return mCallback.onPrepareActionMode(mActionMode, mActionMode.getMenu()); } @Override public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) { return mCallback.onActionItemClicked(mActionMode, mActionMode.getMenu().findItem(item)); } @Override public void onDestroyActionMode(android.view.ActionMode mode) { mCallback.onDestroyActionMode(mActionMode); } } private class ActionModeWrapper extends ActionMode { private final android.view.ActionMode mActionMode; private MenuWrapper mMenu = null; ActionModeWrapper(android.view.ActionMode actionMode) { mActionMode = actionMode; } @Override public void setTitle(CharSequence title) { mActionMode.setTitle(title); } @Override public void setTitle(int resId) { mActionMode.setTitle(resId); } @Override public void setSubtitle(CharSequence subtitle) { mActionMode.setSubtitle(subtitle); } @Override public void setSubtitle(int resId) { mActionMode.setSubtitle(resId); } @Override public void setCustomView(View view) { mActionMode.setCustomView(view); } @Override public void invalidate() { mActionMode.invalidate(); } @Override public void finish() { mActionMode.finish(); } @Override public MenuWrapper getMenu() { if (mMenu == null) { mMenu = new MenuWrapper(mActionMode.getMenu()); } return mMenu; } @Override public CharSequence getTitle() { return mActionMode.getTitle(); } @Override public CharSequence getSubtitle() { return mActionMode.getSubtitle(); } @Override public View getCustomView() { return mActionMode.getCustomView(); } @Override public MenuInflater getMenuInflater() { return ActionBarSherlockNative.this.getMenuInflater(); } @Override public void setTag(Object tag) { mActionMode.setTag(tag); } @Override public Object getTag() { return mActionMode.getTag(); } } }