package in.mvpstarter.sample.ui.base; import android.os.Bundle; import android.support.v4.util.LongSparseArray; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import java.util.concurrent.atomic.AtomicLong; import butterknife.ButterKnife; import in.mvpstarter.sample.MvpStarterApplication; import in.mvpstarter.sample.injection.component.ActivityComponent; import in.mvpstarter.sample.injection.component.ConfigPersistentComponent; import in.mvpstarter.sample.injection.component.DaggerConfigPersistentComponent; import in.mvpstarter.sample.injection.module.ActivityModule; import timber.log.Timber; /** * Abstract activity that every other Activity in this application must implement. It provides the * following functionality: * - Handles creation of Dagger components and makes sure that instances of * ConfigPersistentComponent are kept across configuration changes. * - Set up and handles a GoogleApiClient instance that can be used to access the Google sign in * api. * - Handles signing out when an authentication error event is received. */ public abstract class BaseActivity extends AppCompatActivity { private static final String KEY_ACTIVITY_ID = "KEY_ACTIVITY_ID"; private static final AtomicLong NEXT_ID = new AtomicLong(0); private static final LongSparseArray<ConfigPersistentComponent> sComponentsArray = new LongSparseArray<>(); private ActivityComponent mActivityComponent; private long mActivityId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayout()); ButterKnife.bind(this); // Create the ActivityComponent and reuses cached ConfigPersistentComponent if this is // being called after a configuration change. mActivityId = savedInstanceState != null ? savedInstanceState.getLong(KEY_ACTIVITY_ID) : NEXT_ID.getAndIncrement(); ConfigPersistentComponent configPersistentComponent; if (sComponentsArray.get(mActivityId) == null) { Timber.i("Creating new ConfigPersistentComponent id=%d", mActivityId); configPersistentComponent = DaggerConfigPersistentComponent.builder() .applicationComponent(MvpStarterApplication.get(this).getComponent()) .build(); sComponentsArray.put(mActivityId, configPersistentComponent); } else { Timber.i("Reusing ConfigPersistentComponent id=%d", mActivityId); configPersistentComponent = sComponentsArray.get(mActivityId); } mActivityComponent = configPersistentComponent.activityComponent(new ActivityModule(this)); mActivityComponent.inject(this); } public abstract int getLayout(); @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(KEY_ACTIVITY_ID, mActivityId); } @Override protected void onDestroy() { if (!isChangingConfigurations()) { Timber.i("Clearing ConfigPersistentComponent id=%d", mActivityId); sComponentsArray.remove(mActivityId); } super.onDestroy(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; default: return super.onOptionsItemSelected(item); } } public ActivityComponent activityComponent() { return mActivityComponent; } }