package com.zhuinden.simplestackdemonestedstack.application;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.widget.FrameLayout;
import com.zhuinden.servicetree.ServiceTree;
import com.zhuinden.simplestack.Backstack;
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.simplestackdemonestedstack.R;
import com.zhuinden.simplestackdemonestedstack.presentation.paths.main.MainKey;
import com.zhuinden.simplestackdemonestedstack.presentation.paths.other.OtherKey;
import com.zhuinden.simplestackdemonestedstack.util.NestSupportServiceManager;
import com.zhuinden.simplestackdemonestedstack.util.PreserveTreeScopesStrategy;
import com.zhuinden.simplestackdemonestedstack.util.ServiceLocator;
import com.zhuinden.statebundle.StateBundle;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity
extends AppCompatActivity
implements StateChanger {
private static final String TAG = "MainActivity";
public static MainActivity get(Context context) {
//noinspection ResourceType
return (MainActivity) context.getSystemService(TAG);
}
@BindView(R.id.view_root)
FrameLayout root;
Backstack backstack;
private boolean isAnimating;
public void setAnimating(boolean animating) {
this.isAnimating = animating;
}
static class NonConfigurationInstance {
NestSupportServiceManager serviceManager;
private NonConfigurationInstance(NestSupportServiceManager serviceManager) {
this.serviceManager = serviceManager;
}
}
NestSupportServiceManager serviceManager;
ServiceTree serviceTree;
@Override
protected void onCreate(Bundle savedInstanceState) {
NonConfigurationInstance nonConfigurationInstance = (NonConfigurationInstance) getLastCustomNonConfigurationInstance();
if(nonConfigurationInstance != null) {
serviceManager = nonConfigurationInstance.serviceManager;
serviceTree = serviceManager.getServiceTree();
} else {
serviceTree = new ServiceTree();
serviceTree.createRootNode(TAG);
serviceManager = new NestSupportServiceManager(serviceTree, TAG);
serviceManager.setRestoredStates(savedInstanceState != null ? savedInstanceState.getParcelable("SERVICE_BUNDLE") : new StateBundle());
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
backstack = Navigator.configure()
.setStateChanger(DefaultStateChanger.configure().setExternalStateChanger(this).create(this, root))
.setStateClearStrategy(new PreserveTreeScopesStrategy(serviceTree))
.install(this, root, HistoryBuilder.single(MainKey.create()));
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
return new NonConfigurationInstance(serviceManager);
}
@Override
public void onBackPressed() {
if(!serviceManager.handleBack(this)) {
super.onBackPressed();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("SERVICE_BUNDLE", serviceManager.persistStates());
}
@Override
public Object getSystemService(String name) {
if(MainActivity.TAG.equals(name)) {
return this;
}
if(ServiceLocator.SERVICE_TREE.equals(name)) {
return serviceTree;
}
if(NestSupportServiceManager.SERVICE_MANAGER.equals(name)) {
return serviceManager;
}
return super.getSystemService(name);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.menu_main_next) {
backstack.goTo(OtherKey.create());
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void handleStateChange(StateChange stateChange, Callback completionCallback) {
serviceManager.setupServices(stateChange);
completionCallback.stateChangeComplete();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return !isAnimating && super.dispatchTouchEvent(ev);
}
}