package com.example.mortar.nodes; import android.support.annotation.NonNull; import android.util.Log; import com.zhuinden.servicetree.ServiceTree; import com.zhuinden.simplestack.Bundleable; import com.zhuinden.statebundle.StateBundle; /** * Created by Zhuinden on 2017.05.14.. */ public class NodeStateManager { private static final String TAG = "NodeStateManager"; public static final String SERVICE_STATES = "SERVICE_STATES"; private final ServiceTree serviceTree; public NodeStateManager(ServiceTree serviceTree) { this.serviceTree = serviceTree; } public StateBundle persistStates() { final StateBundle rootBundle = serviceTree.getRootService(SERVICE_STATES); serviceTree.traverseTree(ServiceTree.Walk.PRE_ORDER, true, new ServiceTree.Walk() { @Override public void execute(@NonNull ServiceTree.Node node, @NonNull CancellationToken cancellationToken) { StateBundle localBundle = rootBundle.getBundle(node.getKey().toString()); if(localBundle == null) { localBundle = new StateBundle(); } for(ServiceTree.Node.Entry entry : node.getBoundServices()) { Log.i(TAG, "Persisting state for [" + entry.getName() + "] in [" + node.getKey().toString() + "]"); if(entry.getService() instanceof Bundleable) { localBundle.putBundle(entry.getName(), ((Bundleable) entry.getService()).toBundle()); } } rootBundle.putBundle(node.getKey().toString(), localBundle); } }); return rootBundle; } public void restoreStatesForNode(ServiceTree.Node node) { StateBundle rootBundle = serviceTree.getRootService(SERVICE_STATES); StateBundle localBundle = rootBundle.getBundle(node.getKey().toString()); Log.i(TAG, "Restoring state for [" + node.getKey().toString() + "] with bundle [" + localBundle + "]"); for(ServiceTree.Node.Entry entry : node.getBoundServices()) { Log.i(TAG, "Restoring state for service [" + entry.getName() + "]"); if(entry.getService() instanceof Bundleable) { ((Bundleable) entry.getService()).fromBundle(localBundle == null ? null : localBundle.getBundle(entry.getName())); } } } public void clearStatesForKey(Object previousKey) { final StateBundle rootBundle = serviceTree.getRootService(SERVICE_STATES); serviceTree.traverseSubtree(serviceTree.getNode(previousKey), ServiceTree.Walk.POST_ORDER, new ServiceTree.Walk() { @Override public void execute(@NonNull ServiceTree.Node node, @NonNull CancellationToken cancellationToken) { Log.i(TAG, "Removing state for [" + node.getKey().toString() + "]"); rootBundle.remove(node.getKey().toString()); } }); } }