package org.holoeverywhere.app;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Collection;
import org.holoeverywhere.ThemeManager;
import org.holoeverywhere.addon.AddonSherlock;
import org.holoeverywhere.addon.AddonSherlock.AddonSherlockA;
import org.holoeverywhere.addon.IAddon;
import org.holoeverywhere.addon.IAddonActivity;
import org.holoeverywhere.addon.IAddonBasicAttacher;
import android.content.Intent;
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 com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.internal.view.menu.MenuItemWrapper;
import com.actionbarsherlock.internal.view.menu.MenuWrapper;
import com.actionbarsherlock.view.ActionMode;
public abstract class Activity extends _HoloActivity {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public static @interface Addons {
public String[] value();
}
private final class FindViewAction extends AddonCallback<IAddonActivity> {
private int mId;
private View mView;
@Override
public boolean action(IAddonActivity addon) {
return (mView = addon.findViewById(mId)) != null;
}
@Override
public boolean post() {
return (mView = getWindow().findViewById(mId)) != null;
}
}
private final class KeyEventAction extends AddonCallback<IAddonActivity> {
private KeyEvent mEvent;
@Override
public boolean action(IAddonActivity addon) {
return addon.dispatchKeyEvent(mEvent);
}
@Override
public boolean post() {
return Activity.super.dispatchKeyEvent(mEvent);
}
}
public static final String ADDON_ROBOGUICE = "Roboguice";
public static final String ADDON_SHERLOCK = "Sherlock";
public static final String ADDON_SLIDER = "Slider";
/**
* Use {@link #ADDON_SLIDER} instead
*/
@Deprecated
public static final String ADDON_SLIDING_MENU = ADDON_SLIDER;
public static final String ADDON_TABBER = "Tabber";
private final IAddonBasicAttacher<IAddonActivity, Activity> mAttacher =
new IAddonBasicAttacher<IAddonActivity, Activity>(this);
private boolean mCreatedByThemeManager = false;
private final FindViewAction mFindViewAction = new FindViewAction();
private final KeyEventAction mKeyEventAction = new KeyEventAction();
@Override
public <T extends IAddonActivity> T addon(Class<? extends IAddon> clazz) {
return mAttacher.addon(clazz);
}
@Override
public void addon(Collection<Class<? extends IAddon>> classes) {
mAttacher.addon(classes);
}
@Override
public <T extends IAddonActivity> T addon(String classname) {
return mAttacher.addon(classname);
}
public AddonSherlockA addonSherlock() {
return addon(AddonSherlock.class);
}
@Override
public void closeOptionsMenu() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.closeOptionsMenu();
}
@Override
public void justPost() {
Activity.super.closeOptionsMenu();
}
});
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
mKeyEventAction.mEvent = event;
return performAddonAction(mKeyEventAction);
}
@Override
public View findViewById(int id) {
mFindViewAction.mView = null;
mFindViewAction.mId = id;
performAddonAction(mFindViewAction);
return mFindViewAction.mView;
}
@Override
public ActionBar getSupportActionBar() {
return addonSherlock().getActionBar();
}
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;
}
@Override
public boolean isAddonAttached(Class<? extends IAddon> clazz) {
return mAttacher.isAddonAttached(clazz);
}
public boolean isCreatedByThemeManager() {
return mCreatedByThemeManager;
}
@Override
public void lockAttaching() {
mAttacher.lockAttaching();
}
@Override
public Collection<Class<? extends IAddon>> obtainAddonsList() {
return mAttacher.obtainAddonsList();
}
@Override
public void onActionModeFinished(ActionMode mode) {
}
@Override
public void onActionModeStarted(ActionMode mode) {
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onActivityResult(requestCode, resultCode, data);
}
});
}
@Override
public void onConfigurationChanged(final Configuration newConfig) {
final Configuration oldConfig = getResources().getConfiguration();
super.onConfigurationChanged(newConfig);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onConfigurationChanged(oldConfig, newConfig);
}
});
}
@Override
public void onContentChanged() {
super.onContentChanged();
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onContentChanged();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
final Bundle state = instanceState(savedInstanceState);
mCreatedByThemeManager = getIntent().getBooleanExtra(
ThemeManager.KEY_CREATED_BY_THEME_MANAGER, false);
mAttacher.inhert(getSupportApplication());
forceInit(state);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onPreCreate(state);
}
});
super.onCreate(state);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onCreate(state);
}
});
}
@Override
public final boolean onCreateOptionsMenu(android.view.Menu menu) {
return onCreateOptionsMenu(new MenuWrapper(menu));
}
@Override
public boolean onCreatePanelMenu(final int featureId, final android.view.Menu menu) {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onCreatePanelMenu(featureId, menu);
}
@Override
public boolean post() {
return Activity.super.onCreatePanelMenu(featureId, menu);
}
});
}
@Override
protected void onDestroy() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onDestroy();
}
});
super.onDestroy();
}
@Override
public boolean onHomePressed() {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onHomePressed();
}
@Override
public boolean post() {
return Activity.super.onHomePressed();
}
});
}
@Override
public boolean onMenuItemSelected(final int featureId,
final android.view.MenuItem item) {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onMenuItemSelected(featureId, item);
}
@Override
public boolean post() {
return Activity.super.onMenuItemSelected(featureId, item);
}
});
}
@Override
public boolean onMenuOpened(final int featureId, final android.view.Menu menu) {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onMenuOpened(featureId, menu);
}
@Override
public boolean post() {
return Activity.super.onMenuOpened(featureId, menu);
}
});
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onNewIntent(intent);
}
});
}
@Override
public final boolean onOptionsItemSelected(android.view.MenuItem item) {
return onOptionsItemSelected(new MenuItemWrapper(item));
}
@Override
public void onPanelClosed(final int featureId, final android.view.Menu menu) {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onPanelClosed(featureId, menu);
}
});
super.onPanelClosed(featureId, menu);
}
@Override
protected void onPause() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onPause();
}
});
super.onPause();
}
@Override
protected void onPostCreate(Bundle sSavedInstanceState) {
final Bundle savedInstanceState = instanceState(sSavedInstanceState);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onPostCreate(savedInstanceState);
}
});
super.onPostCreate(savedInstanceState);
}
@Override
protected void onPostInit(Holo config, Bundle savedInstanceState) {
lockAttaching();
}
@Override
protected void onPostResume() {
super.onPostResume();
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onPostResume();
}
});
}
@Override
protected void onPreInit(Holo config, Bundle savedInstanceState) {
if (getClass().isAnnotationPresent(Addons.class)) {
for (String addon : getClass().getAnnotation(Addons.class).value()) {
if (ADDON_SHERLOCK.equals(addon)) {
config.requireSherlock = true;
} else if (ADDON_SLIDER.equals(addon)) {
config.requireSlider = true;
} else if (ADDON_ROBOGUICE.equals(addon)) {
config.requireRoboguice = true;
} else if (ADDON_TABBER.equals(addon)) {
config.requireTabber = true;
} else {
addon(addon);
}
}
}
}
@Override
public final boolean onPrepareOptionsMenu(android.view.Menu menu) {
return onPrepareOptionsMenu(new MenuWrapper(menu));
}
@Override
public boolean onPreparePanel(final int featureId, final View view,
final android.view.Menu menu) {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onPreparePanel(featureId, view, menu);
}
@Override
public boolean post() {
return Activity.super.onPreparePanel(featureId, view, menu);
}
});
}
@Override
protected void onRestart() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onRestart();
}
});
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onResume();
}
});
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onSaveInstanceState(outState);
}
});
}
@Override
protected void onStart() {
super.onStart();
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onStart();
}
});
}
@Override
protected void onStop() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onStop();
}
});
super.onStop();
}
@Override
protected void onTitleChanged(final CharSequence title, final int color) {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onTitleChanged(title, color);
}
});
super.onTitleChanged(title, color);
}
@Override
public void openOptionsMenu() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.openOptionsMenu();
}
@Override
public void justPost() {
Activity.super.openOptionsMenu();
}
});
}
@Override
public boolean performAddonAction(AddonCallback<IAddonActivity> callback) {
return mAttacher.performAddonAction(callback);
}
@Override
public void requestWindowFeature(long featureIdLong) {
super.requestWindowFeature(featureIdLong);
final int featureId = (int) featureIdLong;
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.requestWindowFeature(featureId);
}
@Override
public void justPost() {
requestWindowFeature(featureId);
}
});
}
public Bundle saveInstanceState() {
Bundle bundle = new Bundle(getClassLoader());
onSaveInstanceState(bundle);
return bundle.size() > 0 ? bundle : null;
}
@Override
public void setSupportProgress(int progress) {
addonSherlock().setProgress(progress);
}
@Override
public void setSupportProgressBarIndeterminate(boolean indeterminate) {
addonSherlock().setProgressBarIndeterminate(indeterminate);
}
@Override
public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
addonSherlock().setProgressBarIndeterminateVisibility(visible);
}
@Override
public void setSupportProgressBarVisibility(boolean visible) {
addonSherlock().setProgressBarVisibility(visible);
}
@Override
public void setSupportSecondaryProgress(int secondaryProgress) {
addonSherlock().setSecondaryProgress(secondaryProgress);
}
public void setUiOptions(int uiOptions) {
if (isAddonAttached(AddonSherlock.class)) {
addonSherlock().setUiOptions(uiOptions);
} else if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
getWindow().setUiOptions(uiOptions);
}
}
public void setUiOptions(int uiOptions, int mask) {
if (isAddonAttached(AddonSherlock.class)) {
addonSherlock().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 addonSherlock().startActionMode(callback);
}
@Override
public void supportInvalidateOptionsMenu() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.invalidateOptionsMenu();
}
@Override
public void justPost() {
Activity.super.supportInvalidateOptionsMenu();
}
});
}
}