package ru.ltst.u2020mvp.base.mvp; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.ViewGroup; import java.util.UUID; import javax.inject.Inject; import ru.ltst.u2020mvp.U2020App; import ru.ltst.u2020mvp.U2020Component; import ru.ltst.u2020mvp.ui.ViewContainer; public abstract class BaseActivity extends AppCompatActivity { private static final String BF_UNIQUE_KEY = BaseActivity.class.getName() + ".unique.key"; @Inject ViewContainer viewContainer; private String uniqueKey; @Override protected void onCreate(Bundle savedInstanceState) { Bundle params = getIntent().getExtras(); if (params != null) { onExtractParams(params); } if (savedInstanceState != null && savedInstanceState.containsKey(BF_UNIQUE_KEY)) { uniqueKey = savedInstanceState.getString(BF_UNIQUE_KEY); } else { uniqueKey = UUID.randomUUID().toString(); } super.onCreate(savedInstanceState); U2020App app = U2020App.get(this); onCreateComponent(app.component()); if (viewContainer == null) { throw new IllegalStateException("No injection happened. Add component.inject(this) in onCreateComponent() implementation."); } Registry.add(this, viewId(), presenter()); final LayoutInflater layoutInflater = getLayoutInflater(); ViewGroup container = viewContainer.forActivity(this); layoutInflater.inflate(layoutId(), container); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(BF_UNIQUE_KEY, uniqueKey); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); uniqueKey = savedInstanceState.getString(BF_UNIQUE_KEY); } protected void onExtractParams(@NonNull Bundle params) { // default no implementation } public String uniqueKey() { return uniqueKey; } /** * Must be implemented by derived activities. Injection must be performed here. * Otherwise IllegalStateException will be thrown. Derived activity is * responsible to create and store it's component. * * @param u2020Component application level component */ protected abstract void onCreateComponent(U2020Component u2020Component); protected abstract @LayoutRes int layoutId(); protected abstract BasePresenter<? extends BaseView> presenter(); protected abstract @IdRes int viewId(); }