package org.holoeverywhere.app;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app._HoloActivity;
import android.view.KeyEvent;
import android.view.View;
import org.holoeverywhere.ThemeManager;
import org.holoeverywhere.addon.Addons;
import org.holoeverywhere.addon.IAddon;
import org.holoeverywhere.addon.IAddonActivity;
import org.holoeverywhere.addon.IAddonBasicAttacher;
import java.util.Arrays;
import java.util.Collection;
public abstract class Activity extends _HoloActivity {
private final IAddonBasicAttacher<IAddonActivity, Activity> mAttacher =
new IAddonBasicAttacher<IAddonActivity, Activity>(this);
private final FindViewAction mFindViewAction = new FindViewAction();
private final KeyEventAction mKeyEventAction = new KeyEventAction();
private boolean mCreatedByThemeManager = false;
@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);
}
@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) {
requestDecorView();
mFindViewAction.mView = null;
mFindViewAction.mId = id;
performAddonAction(mFindViewAction);
return mFindViewAction.mView;
}
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
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 onSupportContentChanged() {
super.onSupportContentChanged();
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
protected void onDestroy() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public void justAction(IAddonActivity addon) {
addon.onDestroy();
}
});
super.onDestroy();
}
@Override
public boolean onSupportNavigateUp() {
return performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.onNavigateUp();
}
@Override
public boolean post() {
return Activity.super.onSupportNavigateUp();
}
});
}
@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 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) {
IAddonBasicAttacher.attachAnnotations(this);
}
@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 supportInvalidateOptionsMenu() {
performAddonAction(new AddonCallback<IAddonActivity>() {
@Override
public boolean action(IAddonActivity addon) {
return addon.invalidateOptionsMenu();
}
@Override
public void justPost() {
Activity.super.supportInvalidateOptionsMenu();
}
});
}
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);
}
}
}