package com.zhuinden.simpleservicesexample.application; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; import com.zhuinden.servicetree.ServiceTree; import com.zhuinden.simpleservicesexample.R; import com.zhuinden.simpleservicesexample.presentation.paths.a.A; import com.zhuinden.simpleservicesexample.utils.ServiceLocator; import com.zhuinden.simpleservicesexample.utils.ServiceManager; import com.zhuinden.simpleservicesexample.utils.StackService; import com.zhuinden.simplestack.BackstackDelegate; import com.zhuinden.simplestack.HistoryBuilder; import com.zhuinden.simplestack.StateChange; import com.zhuinden.simplestack.StateChanger; import com.zhuinden.simplestack.navigator.DefaultStateChanger; import com.zhuinden.simplestack.navigator.Navigator; import com.zhuinden.statebundle.StateBundle; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements StateChanger { private static final String TAG = "MainActivity"; @BindView(R.id.root) RelativeLayout root; ServiceTree serviceTree; ServiceManager serviceManager; public static class NonConfigurationInstance { ServiceManager serviceManager; private NonConfigurationInstance(ServiceManager serviceManager) { this.serviceManager = serviceManager; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); NonConfigurationInstance nonConfigurationInstance = (NonConfigurationInstance) getLastCustomNonConfigurationInstance(); if(nonConfigurationInstance != null) { serviceManager = nonConfigurationInstance.serviceManager; serviceTree = serviceManager.getServiceTree(); } else { serviceTree = new ServiceTree(); serviceTree.createRootNode(TAG); serviceManager = new ServiceManager(serviceTree, TAG); } serviceManager.setRestoredStates(savedInstanceState != null ? savedInstanceState.getParcelable(ServiceManager.SERVICE_STATES) : new StateBundle()); Navigator.configure() .setStateChanger(DefaultStateChanger.configure().setExternalStateChanger(this).create(this, root)) .install(this, root, HistoryBuilder.single(A.create())); } @Override public Object onRetainCustomNonConfigurationInstance() { return new NonConfigurationInstance(serviceManager); } @Override public void onBackPressed() { if(!Navigator.onBackPressed(this)) { super.onBackPressed(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(ServiceManager.SERVICE_STATES, serviceManager.persistStates()); } @Override public Object getSystemService(String name) { if(StackService.TAG.equals(name)) { return Navigator.getBackstack(this); } if(ServiceLocator.SERVICE_TREE.equals(name)) { return serviceTree; } return super.getSystemService(name); } @Override public void handleStateChange(StateChange stateChange, Callback completionCallback) { serviceManager.setupServices(stateChange); completionCallback.stateChangeComplete(); } }