/* * Copyright 2009 Michael Burton * * 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 roboguice.activity; import java.util.HashMap; import java.util.Map; import roboguice.RoboGuice; import roboguice.activity.event.OnActivityResultEvent; import roboguice.activity.event.OnContentChangedEvent; import roboguice.activity.event.OnNewIntentEvent; import roboguice.activity.event.OnPauseEvent; import roboguice.activity.event.OnRestartEvent; import roboguice.activity.event.OnResumeEvent; import roboguice.activity.event.OnSaveInstanceStateEvent; import roboguice.activity.event.OnStopEvent; import roboguice.context.event.OnConfigurationChangedEvent; import roboguice.context.event.OnCreateEvent; import roboguice.context.event.OnDestroyEvent; import roboguice.context.event.OnStartEvent; import roboguice.event.EventManager; import roboguice.inject.ContentViewListener; import roboguice.inject.RoboInjector; import roboguice.util.RoboContext; import com.google.inject.Inject; import com.google.inject.Key; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.AttributeSet; import android.view.View; /** * A {@link RoboActivity} extends from {@link Activity} to provide dynamic * injection of collaborators, using Google Guice.<br /> * <br /> * Your own activities that usually extend from {@link Activity} should now * extend from {@link RoboActivity}.<br /> * <br /> * If your activities extend from subclasses of {@link Activity} provided by the * Android SDK, we provided Guice versions as well for the most used : see * {@link RoboExpandableListActivity}, {@link RoboListActivity}, and other * classes located in package <strong>roboguice.activity</strong>.<br /> * <br /> * If we didn't provide what you need, you have two options : either post an * issue on <a href="http://code.google.com/p/roboguice/issues/list">the bug * tracker</a>, or implement it yourself. Have a look at the source code of this * class ({@link RoboActivity}), you won't have to write that much changes. And * of course, you are welcome to contribute and send your implementations to the * RoboGuice project.<br /> * <br /> * Please be aware that collaborators are not injected into this until you call * {@link #setContentView(int)} (calling any of the overloads of this methods * will work).<br /> * <br /> * * @author Mike Burton */ public class RoboActionBarActivity extends ActionBarActivity implements RoboContext { protected EventManager eventManager; protected HashMap<Key<?>,Object> scopedObjects = new HashMap<Key<?>, Object>(); @Inject ContentViewListener ignored; // BUG find a better place to put this @Override protected void onCreate(Bundle savedInstanceState) { final RoboInjector injector = RoboGuice.getInjector(this); eventManager = injector.getInstance(EventManager.class); injector.injectMembersWithoutViews(this); super.onCreate(savedInstanceState); eventManager.fire(new OnCreateEvent<Activity>(this,savedInstanceState)); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); eventManager.fire(new OnSaveInstanceStateEvent(this, outState)); } @Override protected void onRestart() { super.onRestart(); eventManager.fire(new OnRestartEvent(this)); } @Override protected void onStart() { super.onStart(); eventManager.fire(new OnStartEvent<Activity>(this)); } @Override protected void onResume() { super.onResume(); eventManager.fire(new OnResumeEvent(this)); } @Override protected void onPause() { super.onPause(); eventManager.fire(new OnPauseEvent(this)); } @Override protected void onNewIntent( Intent intent ) { super.onNewIntent(intent); eventManager.fire(new OnNewIntentEvent(this)); } @Override protected void onStop() { try { eventManager.fire(new OnStopEvent(this)); } finally { super.onStop(); } } @Override protected void onDestroy() { try { eventManager.fire(new OnDestroyEvent<Activity>(this)); } finally { try { RoboGuice.destroyInjector(this); } finally { super.onDestroy(); } } } @Override public void onConfigurationChanged(Configuration newConfig) { final Configuration currentConfig = getResources().getConfiguration(); super.onConfigurationChanged(newConfig); eventManager.fire(new OnConfigurationChangedEvent<Activity>(this,currentConfig, newConfig)); } @Override public void onSupportContentChanged() { super.onSupportContentChanged(); RoboGuice.getInjector(this).injectViewMembers(this); eventManager.fire(new OnContentChangedEvent(this)); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); eventManager.fire(new OnActivityResultEvent(this, requestCode, resultCode, data)); } @Override public Map<Key<?>, Object> getScopedObjectMap() { return scopedObjects; } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { if (RoboActivity.shouldInjectOnCreateView(name)) return RoboActivity.injectOnCreateView(name, context, attrs); return super.onCreateView(name, context, attrs); } @Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { if (RoboActivity.shouldInjectOnCreateView(name)) return RoboActivity.injectOnCreateView(name, context, attrs); return super.onCreateView(parent, name, context, attrs); } }