package com.zhuinden.simplestackdemoexamplefragments.util;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.zhuinden.simplestack.StateChange;
import com.zhuinden.simplestackdemoexamplefragments.R;
import com.zhuinden.simplestackdemoexamplefragments.application.Key;
/**
* Created by Owner on 2017. 02. 03..
*/
public class FragmentStateChanger {
private FragmentManager fragmentManager;
private int containerId;
public FragmentStateChanger(FragmentManager fragmentManager, int containerId) {
this.fragmentManager = fragmentManager;
this.containerId = containerId;
}
public void handleStateChange(StateChange stateChange) {
FragmentTransaction fragmentTransaction = fragmentManager.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 = fragmentManager.findFragmentByTag(oldKey.getFragmentTag());
if(fragment != null) {
if(!stateChange.getNewState().contains(oldKey)) {
fragmentTransaction.remove(fragment);
} else if(!fragment.isDetached()) {
fragmentTransaction.detach(fragment);
}
}
}
for(Object _newKey : stateChange.getNewState()) {
Key newKey = (Key) _newKey;
Fragment fragment = fragmentManager.findFragmentByTag(newKey.getFragmentTag());
if(newKey.equals(stateChange.topNewState())) {
if(fragment != null) {
if(fragment.isDetached()) {
fragmentTransaction.attach(fragment);
}
} else {
fragment = newKey.newFragment();
fragmentTransaction.add(containerId, fragment, newKey.getFragmentTag());
}
} else {
if(fragment != null && !fragment.isDetached()) {
fragmentTransaction.detach(fragment);
}
}
}
fragmentTransaction.commitNow();
}
}