package com.zhuinden.simplestackdemoexamplefragments.application; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.widget.RelativeLayout; import com.zhuinden.simplestack.BackstackDelegate; import com.zhuinden.simplestack.HistoryBuilder; import com.zhuinden.simplestack.StateChange; import com.zhuinden.simplestack.StateChanger; import com.zhuinden.simplestackdemoexamplefragments.R; import com.zhuinden.simplestackdemoexamplefragments.data.manager.DatabaseManager; import com.zhuinden.simplestackdemoexamplefragments.presentation.paths.tasks.TasksKey; import com.zhuinden.simplestackdemoexamplefragments.util.BackstackHolder; import com.zhuinden.simplestackdemoexamplefragments.util.FragmentStateChanger; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements StateChanger { @BindView(R.id.drawer_layout) MainView mainView; @BindView(R.id.root) RelativeLayout root; public interface OptionsItemSelectedListener { boolean onOptionsItemSelected(MenuItem menuItem); } public static final String TAG = "MainActivity"; public static MainActivity get(Context context) { // noinspection ResourceType return (MainActivity) context.getSystemService(TAG); } BackstackDelegate backstackDelegate; FragmentStateChanger fragmentStateChanger; @Inject DatabaseManager databaseManager; @Inject BackstackHolder backstackHolder; @Override protected void onCreate(Bundle savedInstanceState) { CustomApplication.get(this).initialize(); CustomApplication.get(this).getComponent().inject(this); databaseManager.init(this); backstackDelegate = new BackstackDelegate(null /* delayed init */); backstackDelegate.onCreate(savedInstanceState, // getLastCustomNonConfigurationInstance(), // HistoryBuilder.single(TasksKey.create())); backstackHolder.setBackstack(backstackDelegate.getBackstack()); super.onCreate(savedInstanceState); MainScopeListener mainScopeListener = (MainScopeListener) getSupportFragmentManager().findFragmentByTag("MAIN_SCOPE_LISTENER"); if(mainScopeListener == null) { mainScopeListener = new MainScopeListener(); getSupportFragmentManager().beginTransaction().add(mainScopeListener, "MAIN_SCOPE_LISTENER").commit(); } setContentView(R.layout.activity_main); ButterKnife.bind(this); this.fragmentStateChanger = new FragmentStateChanger(getSupportFragmentManager(), R.id.root); mainView.onCreate(); } @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); backstackDelegate.setStateChanger(this); mainView.onPostCreate(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mainView.onConfigChanged(newConfig); } @Override public Object onRetainCustomNonConfigurationInstance() { return backstackDelegate.onRetainCustomNonConfigurationInstance(); } @Override protected void onPostResume() { super.onPostResume(); backstackDelegate.onPostResume(); } @Override public void onBackPressed() { if(mainView.onBackPressed()) { return; } if(!backstackDelegate.onBackPressed()) { super.onBackPressed(); } } @Override protected void onPause() { backstackDelegate.onPause(); super.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); backstackDelegate.onSaveInstanceState(outState); } @Override protected void onDestroy() { backstackDelegate.onDestroy(); super.onDestroy(); } @Override public Object getSystemService(String name) { if(TAG.equals(name)) { return this; } return super.getSystemService(name); } @Override public void handleStateChange(StateChange stateChange, Callback completionCallback) { if(stateChange.topNewState().equals(stateChange.topPreviousState())) { // no-op completionCallback.stateChangeComplete(); return; } fragmentStateChanger.handleStateChange(stateChange); mainView.setupViewsForKey(stateChange.topNewState()); completionCallback.stateChangeComplete(); } }