package com.zhuinden.demo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
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;
/**
* Created by Zhuinden on 2017.02.01..
*/
public class DemoActivity
extends AppCompatActivity
implements StateChanger {
private static final String TAG = "DemoActivity";
BackstackDelegate backstackDelegate;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo_activity);
backstackDelegate = new BackstackDelegate(null);
backstackDelegate.onCreate(savedInstanceState, getLastCustomNonConfigurationInstance(), HistoryBuilder.single(FirstKey.create()));
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
backstackDelegate.setStateChanger(this);
}
@Override
protected void onPostResume() {
backstackDelegate.onPostResume();
super.onPostResume();
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
return backstackDelegate.onRetainCustomNonConfigurationInstance();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
backstackDelegate.onSaveInstanceState(outState);
}
@Override
protected void onPause() {
backstackDelegate.onPause();
super.onPause();
}
@Override
public void onBackPressed() {
if(!backstackDelegate.onBackPressed()) {
super.onBackPressed();
}
}
@Override
protected void onDestroy() {
backstackDelegate.onDestroy();
super.onDestroy();
}
@Override
public Object getSystemService(String name) {
if(BackstackService.TAG.equals(name)) {
return backstackDelegate.getBackstack();
}
return super.getSystemService(name);
}
@Override
public void handleStateChange(StateChange stateChange, Callback completionCallback) {
if(stateChange.topNewState().equals(stateChange.topPreviousState())) {
completionCallback.stateChangeComplete();
return;
}
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().disallowAddToBackStack();
if(stateChange.getDirection() == StateChange.FORWARD) {
fragmentTransaction.setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
} else if(stateChange.getDirection() == StateChange.BACKWARD) {
fragmentTransaction.setCustomAnimations(R.anim.slide_in_from_left, R.anim.slide_out_to_right);
}
for(Object _oldKey : stateChange.getPreviousState()) {
Key oldKey = (Key) _oldKey;
Fragment fragment = getSupportFragmentManager().findFragmentByTag(oldKey.getFragmentTag());
if(fragment != null) {
if(!stateChange.getNewState().contains(oldKey)) {
Log.i(TAG, "Old key is NOT in new state: removing [" + oldKey + "]");
fragmentTransaction.remove(fragment);
} else if(!fragment.isDetached()) {
Log.i(TAG, "Old key is in new state, but not showing: detaching [" + oldKey + "]");
fragmentTransaction.detach(fragment);
}
}
}
for(Object _newKey : stateChange.getNewState()) {
Key newKey = (Key) _newKey;
Fragment fragment = getSupportFragmentManager().findFragmentByTag(newKey.getFragmentTag());
if(newKey.equals(stateChange.topNewState())) {
if(fragment != null) {
if(fragment.isDetached()) {
Log.i(TAG, "New key is top state but detached: reattaching [" + newKey + "]");
fragmentTransaction.attach(fragment);
} else {
Log.i(TAG, "New key is top state but already attached: probably config change for [" + newKey + "]");
}
} else {
Log.i(TAG, "New fragment does not exist yet, adding [" + newKey + "]");
fragment = newKey.createFragment();
fragmentTransaction.add(R.id.root, fragment, newKey.getFragmentTag());
}
} else {
if(fragment != null && !fragment.isDetached()) {
Log.i(TAG, "New fragment is not active fragment. It should be detached: [" + newKey + "]");
fragmentTransaction.detach(fragment);
} else {
Log.i(TAG, "New fragment is already detached or doesn't exist, as expected: [" + newKey + "]");
}
}
}
fragmentTransaction.commitNow();
completionCallback.stateChangeComplete();
}
}