/*
* Copyright (C) 2010 Cyril Mottier (http://www.cyrilmottier.com)
*
* 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 greendroid.app;
import greendroid.app.ActionBarActivity;
import greendroid.app.GDApplication;
import greendroid.util.Config;
import greendroid.widget.ActionBar;
import greendroid.widget.ActionBar.OnActionBarListener;
import greendroid.widget.ActionBar.Type;
import greendroid.widget.ActionBarHost;
import greendroid.widget.ActionBarItem;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import com.cyrilmottier.android.greendroid.R;
import com.google.android.maps.MapActivity;
/**
* A special {@link MapActivity} that manages an ActionBar. See
* {@link GDActivity} for a complete documentation of all available features.
*
* @see GDActivity
* @author Cyril Mottier
*/
public abstract class GDMapActivity extends MapActivity implements ActionBarActivity {
private static final String LOG_TAG = GDMapActivity.class.getSimpleName();
private boolean mDefaultConstructorUsed = false;
private Type mActionBarType;
private ActionBarHost mActionBarHost;
public GDMapActivity() {
this(Type.Normal);
mDefaultConstructorUsed = true;
}
public GDMapActivity(ActionBar.Type actionBarType) {
super();
mActionBarType = actionBarType;
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
ensureLayout();
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mDefaultConstructorUsed) {
// HACK cyril: This should have been done is the default
// constructor. Unfortunately, the getApplication() method returns
// null there. Hence, this has to be done here.
if (getClass().equals(getGDApplication().getHomeActivityClass())) {
mActionBarType = Type.Dashboard;
}
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
ensureLayout();
}
public ActionBar.Type getActionBarType() {
return mActionBarType;
}
public int createLayout() {
switch (mActionBarType) {
case Dashboard:
return R.layout.gd_content_dashboard;
case Normal:
default:
return R.layout.gd_content_normal;
}
}
protected void ensureLayout() {
if (!verifyLayout()) {
setContentView(createLayout());
}
}
protected boolean verifyLayout() {
return mActionBarHost != null;
}
public GDApplication getGDApplication() {
return (GDApplication) getApplication();
}
@Override
public void onContentChanged() {
super.onContentChanged();
onPreContentChanged();
onPostContentChanged();
}
public void onPreContentChanged() {
mActionBarHost = (ActionBarHost) findViewById(R.id.gd_action_bar_host);
if (mActionBarHost == null) {
throw new RuntimeException(
"Your content must have an ActionBarHost whose id attribute is R.id.gd_action_bar_host");
}
mActionBarHost.getActionBar().setOnActionBarListener(mActionBarListener);
}
public void onPostContentChanged() {
boolean titleSet = false;
final Intent intent = getIntent();
if (intent != null) {
String title = intent.getStringExtra(ActionBarActivity.GD_ACTION_BAR_TITLE);
if (title != null) {
titleSet = true;
setTitle(title);
}
}
if (!titleSet) {
// No title has been set via the Intent. Let's look in the
// ActivityInfo
try {
final ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(), 0);
if (activityInfo.labelRes != 0) {
setTitle(activityInfo.labelRes);
}
} catch (NameNotFoundException e) {
// Do nothing
}
}
final int visibility = intent.getIntExtra(ActionBarActivity.GD_ACTION_BAR_VISIBILITY, View.VISIBLE);
getActionBar().setVisibility(visibility);
}
@Override
public void setTitle(CharSequence title) {
getActionBar().setTitle(title);
}
@Override
public void setTitle(int titleId) {
setTitle(getString(titleId));
}
public ActionBar getActionBar() {
ensureLayout();
return mActionBarHost.getActionBar();
}
public ActionBarItem addActionBarItem(ActionBarItem item) {
return getActionBar().addItem(item);
}
public ActionBarItem addActionBarItem(ActionBarItem item, int itemId) {
return getActionBar().addItem(item, itemId);
}
public ActionBarItem addActionBarItem(ActionBarItem.Type actionBarItemType) {
return getActionBar().addItem(actionBarItemType);
}
public ActionBarItem addActionBarItem(ActionBarItem.Type actionBarItemType, int itemId) {
return getActionBar().addItem(actionBarItemType, itemId);
}
public FrameLayout getContentView() {
ensureLayout();
return mActionBarHost.getContentView();
}
public void setActionBarContentView(int resID) {
LayoutInflater.from(this).inflate(resID, getContentView());
}
public void setActionBarContentView(View view, LayoutParams params) {
getContentView().addView(view, params);
}
public void setActionBarContentView(View view) {
getContentView().addView(view);
}
public boolean onHandleActionBarItemClick(ActionBarItem item, int position) {
return false;
}
private OnActionBarListener mActionBarListener = new OnActionBarListener() {
public void onActionBarItemClicked(int position) {
if (position == OnActionBarListener.HOME_ITEM) {
final GDApplication app = getGDApplication();
switch (mActionBarType) {
case Normal:
final Class<?> klass = app.getHomeActivityClass();
if (klass != null && !klass.equals(GDMapActivity.this.getClass())) {
if (Config.GD_INFO_LOGS_ENABLED) {
Log.i(LOG_TAG, "Going back to the home activity");
}
Intent homeIntent = new Intent(GDMapActivity.this, klass);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
}
break;
case Dashboard:
final Intent appIntent = app.getMainApplicationIntent();
if (appIntent != null) {
if (Config.GD_INFO_LOGS_ENABLED) {
Log.i(LOG_TAG, "Launching the main application Intent");
}
startActivity(appIntent);
}
break;
}
} else {
if (!onHandleActionBarItemClick(getActionBar().getItem(position), position)) {
if (Config.GD_WARNING_LOGS_ENABLED) {
Log.w(LOG_TAG, "Click on item at position " + position + " dropped down to the floor");
}
}
}
}
};
}