package okuki.sample; import android.app.Activity; import android.app.Application; import android.os.Bundle; import android.util.Log; import okuki.Okuki; import okuki.android.OkukiParceler; import okuki.android.OkukiState; import okuki.sample.common.lifecycle.RxActivityLifecycleCallbacks; import okuki.sample.common.network.NetworkModule; import okuki.toothpick.PlaceScoper; import timber.log.Timber; import toothpick.smoothie.module.SmoothieApplicationModule; public class App extends Application { private static App APP_INSTANCE; private static final String OKUKI_STATE_KEY = OkukiState.class.getName(); private Okuki okuki; private RxActivityLifecycleCallbacks lifecycle; private PlaceScoper placeScoper; @Override public void onCreate() { super.onCreate(); APP_INSTANCE = this; Timber.plant((BuildConfig.DEBUG) ? new Timber.DebugTree() : new CrashReportingTree()); okuki = Okuki.getDefault(); lifecycle = new RxActivityLifecycleCallbacks(this){ @Override public void onActivityCreated(Activity activity, Bundle bundle) { if ((okuki.getCurrentPlace() == null) && (bundle != null) && bundle.containsKey(OKUKI_STATE_KEY)) { OkukiState okukiState = bundle.getParcelable(OKUKI_STATE_KEY); if (okukiState != null) { OkukiParceler.apply(okuki, okukiState); } } super.onActivityCreated(activity, bundle); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { if (bundle != null) { OkukiState okukiState = OkukiParceler.extract(okuki); if (okukiState != null) { bundle.putParcelable(OKUKI_STATE_KEY, okukiState); } } super.onActivitySaveInstanceState(activity, bundle); } }; placeScoper = new PlaceScoper.Builder().okuki(okuki) .modules(new AppModule(), new NetworkModule()).build(); } private class AppModule extends SmoothieApplicationModule { AppModule() { super(App.this); bind(Okuki.class).toInstance(okuki); bind(RxActivityLifecycleCallbacks.class).toInstance(lifecycle); } } private class CrashReportingTree extends Timber.Tree { @Override protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } //TODO Log to crash reporting if (t != null) { if (priority == Log.ERROR) { //TODO Log throwable as error to crash reporting } else if (priority == Log.WARN) { //TODO Log throwable as warning to crash reporting } } } } public static void inject(Object obj) { try { APP_INSTANCE.placeScoper.inject(obj); } catch (Throwable t) { Timber.e(t, "Error injecting %s", obj); } } }