blob: bfc74f95caba54d57b6ec0eca591347ea9af48ce [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v7.app;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v7.appcompat.R;
import android.support.v7.internal.view.SupportMenuInflater;
import android.support.v7.view.ActionMode;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
abstract class ActionBarActivityDelegate {
static final String METADATA_UI_OPTIONS = "android.support.UI_OPTIONS";
static final String UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = "splitActionBarWhenNarrow";
private static final String TAG = "ActionBarActivityDelegate";
static ActionBarActivityDelegate createDelegate(ActionBarActivity activity) {
final int version = Build.VERSION.SDK_INT;
if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return new ActionBarActivityDelegateICS(activity);
} else {
return new ActionBarActivityDelegateBase(activity);
}
}
final ActionBarActivity mActivity;
private ActionBar mActionBar;
private MenuInflater mMenuInflater;
// true if this activity has an action bar.
boolean mHasActionBar;
// true if this activity's action bar overlays other activity content.
boolean mOverlayActionBar;
ActionBarActivityDelegate(ActionBarActivity activity) {
mActivity = activity;
}
abstract ActionBar createSupportActionBar();
final ActionBar getSupportActionBar() {
// The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar
// could change after onCreate
if (mHasActionBar || mOverlayActionBar) {
if (mActionBar == null) {
mActionBar = createSupportActionBar();
}
} else {
// If we're not set to have a Action Bar, null it just in case it's been set
mActionBar = null;
}
return mActionBar;
}
MenuInflater getMenuInflater() {
if (mMenuInflater == null) {
ActionBar ab = getSupportActionBar();
if (ab != null) {
mMenuInflater = new SupportMenuInflater(ab.getThemedContext());
} else {
mMenuInflater = new SupportMenuInflater(mActivity);
}
}
return mMenuInflater;
}
void onCreate(Bundle savedInstanceState) {
TypedArray a = mActivity.obtainStyledAttributes(R.styleable.ActionBarWindow);
if (!a.hasValue(R.styleable.ActionBarWindow_windowActionBar)) {
a.recycle();
throw new IllegalStateException(
"You need to use a Theme.AppCompat theme (or descendant) with this activity.");
}
mHasActionBar = a.getBoolean(R.styleable.ActionBarWindow_windowActionBar, false);
mOverlayActionBar = a.getBoolean(R.styleable.ActionBarWindow_windowActionBarOverlay, false);
a.recycle();
}
abstract void onConfigurationChanged(Configuration newConfig);
abstract void onStop();
abstract void onPostResume();
abstract void setContentView(View v);
abstract void setContentView(int resId);
abstract void setContentView(View v, ViewGroup.LayoutParams lp);
abstract void addContentView(View v, ViewGroup.LayoutParams lp);
abstract void setTitle(CharSequence title);
abstract void supportInvalidateOptionsMenu();
abstract boolean supportRequestWindowFeature(int featureId);
// Methods used to create and respond to options menu
abstract View onCreatePanelView(int featureId);
abstract boolean onPreparePanel(int featureId, View view, Menu menu);
abstract boolean onCreatePanelMenu(int featureId, Menu menu);
abstract boolean onMenuItemSelected(int featureId, MenuItem item);
abstract boolean onBackPressed();
abstract ActionMode startSupportActionMode(ActionMode.Callback callback);
abstract void setSupportProgressBarVisibility(boolean visible);
abstract void setSupportProgressBarIndeterminateVisibility(boolean visible);
abstract void setSupportProgressBarIndeterminate(boolean indeterminate);
abstract void setSupportProgress(int progress);
abstract ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
protected final String getUiOptionsFromMetadata() {
try {
PackageManager pm = mActivity.getPackageManager();
ActivityInfo info = pm.getActivityInfo(mActivity.getComponentName(),
PackageManager.GET_META_DATA);
String uiOptions = null;
if (info.metaData != null) {
uiOptions = info.metaData.getString(METADATA_UI_OPTIONS);
}
return uiOptions;
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "getUiOptionsFromMetadata: Activity '" + mActivity.getClass()
.getSimpleName() + "' not in manifest");
return null;
}
}
protected final Context getActionBarThemedContext() {
Context context = mActivity;
// If we have an action bar, initialize the menu with a context themed from it.
ActionBar ab = getSupportActionBar();
if (ab != null) {
context = ab.getThemedContext();
}
return context;
}
}