package org.holoeverywhere.app;
import java.util.ArrayList;
import java.util.List;
import org.holoeverywhere.HoloEverywhere;
import org.holoeverywhere.ThemeManager;
import org.holoeverywhere.addon.IAddon;
import org.holoeverywhere.addon.Sherlock;
import org.holoeverywhere.addon.Sherlock.SherlockA;
import android.content.res.Configuration;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.support.v4.app._HoloActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.internal.view.menu.MenuItemWrapper;
import com.actionbarsherlock.internal.view.menu.MenuWrapper;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public abstract class Activity extends _HoloActivity {
public static final String ADDON_SHERLOCK = "Sherlock";
public static final String ADDON_SLIDING_MENU = "SlidingMenu";
private final List<IAddon<?, ?>> addons = new ArrayList<IAddon<?, ?>>();
private MenuInflater mMenuInflater;
@Override
public void addContentView(View view, LayoutParams params) {
view = prepareDecorView(view);
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).addContentView(view, params)) {
return;
}
}
super.addContentView(view, params);
}
public void attachAddon(IAddon<?, ?> addon) {
if (!addons.contains(addon)) {
addons.add(addon);
}
}
@Override
public void closeOptionsMenu() {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).closeOptionsMenu()) {
return;
}
}
super.closeOptionsMenu();
}
public void detachAddon(IAddon<?, ?> addon) {
addons.remove(addon);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).dispatchKeyEvent(event)) {
return true;
}
}
return super.dispatchKeyEvent(event);
}
@SuppressWarnings("unchecked")
public <T extends IAddon<?, ?>> T findAddon(Class<T> clazz) {
for (IAddon<?, ?> addon : addons) {
if (addon.getClass().isAssignableFrom(clazz)) {
return (T) addon;
}
}
return null;
}
@Override
public View findViewById(int id) {
View view = super.findViewById(id);
if (view != null) {
return view;
}
for (IAddon<?, ?> addon : addons) {
if ((view = addon.activity(this).findViewById(id)) != null) {
return view;
}
}
return null;
}
@Override
public ActionBar getSupportActionBar() {
return requireSherlock().getActionBar();
}
@Override
public MenuInflater getSupportMenuInflater() {
if (mMenuInflater != null) {
return mMenuInflater;
}
mMenuInflater = new MenuInflater(getSupportActionBarContext(), this);
return mMenuInflater;
}
public Bundle instanceState(Bundle savedInstanceState) {
if (savedInstanceState != null) {
return savedInstanceState;
}
Bundle extras = getIntent().getExtras();
if (extras != null && extras.containsKey(ThemeManager.KEY_INSTANCE_STATE)) {
return extras.getBundle(ThemeManager.KEY_INSTANCE_STATE);
}
return null;
}
public boolean isAddonAttached(Class<? extends IAddon<?, ?>> clazz) {
for (IAddon<?, ?> addon : addons) {
if (addon.getClass() == clazz) {
return true;
}
}
return false;
}
@Override
public void onActionModeFinished(ActionMode mode) {
}
@Override
public void onActionModeStarted(ActionMode mode) {
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onConfigurationChanged(newConfig);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
savedInstanceState = instanceState(savedInstanceState);
super.onCreate(savedInstanceState);
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onCreate(savedInstanceState);
}
}
@Override
public final boolean onCreateOptionsMenu(android.view.Menu menu) {
return onCreateOptionsMenu(new MenuWrapper(menu));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onCreatePanelMenu(int featureId, android.view.Menu menu) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).onCreatePanelMenu(featureId, menu)) {
return true;
}
}
return super.onCreatePanelMenu(featureId, menu);
}
@Override
protected void onDestroy() {
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onDestroy();
}
super.onDestroy();
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).onKeyUp(keyCode, event)) {
return true;
}
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onMenuItemSelected(int featureId,
android.view.MenuItem item) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).onMenuItemSelected(featureId, item)) {
return true;
}
}
return super.onMenuItemSelected(featureId, item);
}
@Override
public boolean onMenuOpened(int featureId, android.view.Menu menu) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).onMenuOpened(featureId, menu)) {
return true;
}
}
return super.onMenuOpened(featureId, menu);
}
@Override
public final boolean onOptionsItemSelected(android.view.MenuItem item) {
return onOptionsItemSelected(new MenuItemWrapper(item));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
@Override
public void onPanelClosed(int featureId, android.view.Menu menu) {
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onPanelClosed(featureId, menu);
}
super.onPanelClosed(featureId, menu);
}
@Override
protected void onPause() {
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onPause();
}
super.onPause();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
savedInstanceState = instanceState(savedInstanceState);
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onPostCreate(savedInstanceState);
}
super.onPostCreate(savedInstanceState);
}
@Override
protected void onPostResume() {
super.onPostResume();
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onPostResume();
}
}
@Override
public final boolean onPrepareOptionsMenu(android.view.Menu menu) {
return onPrepareOptionsMenu(new MenuWrapper(menu));
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onPreparePanel(int featureId, View view,
android.view.Menu menu) {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).onPreparePanel(featureId, view, menu)) {
return true;
}
}
return super.onPreparePanel(featureId, view, menu);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onSaveInstanceState(outState);
}
}
@Override
protected void onStop() {
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onStop();
}
super.onStop();
}
@Override
protected void onTitleChanged(CharSequence title, int color) {
for (IAddon<?, ?> addon : addons) {
addon.activity(this).onTitleChanged(title, color);
}
super.onTitleChanged(title, color);
}
@Override
public void openOptionsMenu() {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).openOptionsMenu()) {
return;
}
}
super.openOptionsMenu();
}
@Override
public void requestWindowFeature(long featureIdLong) {
if (!super.isWasInited()) {
super.requestWindowFeature(featureIdLong);
return;
}
int featureId = (int) featureIdLong;
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).requestWindowFeature(featureId)) {
return;
}
}
requestWindowFeature(featureId);
}
public <T extends IAddon<?, ?>> T requireAddon(Class<T> clazz) {
T t = findAddon(clazz);
if (t == null) {
try {
t = clazz.newInstance();
t.addon(this);
} catch (Exception e) {
e.printStackTrace();
}
}
return t;
}
@SuppressWarnings("unchecked")
public void requireAddon(String name) {
if (name == null) {
return;
}
String className = HoloEverywhere.PACKAGE + ".addon." + name;
try {
requireAddon((Class<? extends IAddon<?, ?>>) Class.forName(className, true,
getClassLoader()));
} catch (ClassNotFoundException e) {
throw new RuntimeException("Failed to init addon", e);
}
}
public SherlockA requireSherlock() {
return requireAddon(Sherlock.class).activity(this);
}
public Bundle saveInstanceState() {
Bundle bundle = new Bundle(getClassLoader());
onSaveInstanceState(bundle);
return bundle.size() > 0 ? bundle : null;
}
@Override
public void setContentView(int layoutResId) {
setContentView(getLayoutInflater().makeDecorView(layoutResId, this));
}
@Override
public void setContentView(View view) {
setContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
@Override
public void setContentView(View view, LayoutParams params) {
view = prepareDecorView(view);
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).setContentView(view, params)) {
return;
}
}
super.setContentView(view, params);
}
@Override
public void setSupportProgress(int progress) {
requireSherlock().setProgress(progress);
}
@Override
public void setSupportProgressBarIndeterminate(boolean indeterminate) {
requireSherlock().setProgressBarIndeterminate(indeterminate);
}
@Override
public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
requireSherlock().setProgressBarIndeterminateVisibility(visible);
}
@Override
public void setSupportProgressBarVisibility(boolean visible) {
requireSherlock().setProgressBarVisibility(visible);
}
@Override
public void setSupportSecondaryProgress(int secondaryProgress) {
requireSherlock().setSecondaryProgress(secondaryProgress);
}
@Override
public void setTheme(int resid) {
mMenuInflater = null;
super.setTheme(resid);
}
public void setUiOptions(int uiOptions) {
if (isAddonAttached(Sherlock.class)) {
requireSherlock().setUiOptions(uiOptions);
} else if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
getWindow().setUiOptions(uiOptions);
}
}
public void setUiOptions(int uiOptions, int mask) {
if (isAddonAttached(Sherlock.class)) {
requireSherlock().setUiOptions(uiOptions, mask);
} else if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
getWindow().setUiOptions(uiOptions, mask);
}
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
return requireSherlock().startActionMode(callback);
}
@Override
public void supportInvalidateOptionsMenu() {
for (IAddon<?, ?> addon : addons) {
if (addon.activity(this).invalidateOptionsMenu()) {
return;
}
}
super.supportInvalidateOptionsMenu();
}
}