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;
}
}