package com.zachklipp.captivate.state_machine; import com.zachklipp.captivate.util.Log; import com.zachklipp.captivate.util.Observable; import com.zachklipp.captivate.util.Observer; public class StateMachineStorage implements Observer<TransitionEvent> { public static interface StorageBackend { void save(StateMachine machine); boolean canLoad(); StateMachine load(); StateMachine create(); } private boolean mAutoSave = true; private StorageBackend mBackend; private StateMachine mStateMachine; public StateMachineStorage(StorageBackend backend) { assert(backend != null); mBackend = backend; } public StateMachine loadOrCreate() { if (mStateMachine != null) { mStateMachine.deleteObserver(this); mStateMachine = null; } if (!tryLoad()) { mStateMachine = mBackend.create(); } assert(mStateMachine != null); if (mAutoSave) { mStateMachine.addObserver(this); } return mStateMachine; } public void save(StateMachine stateMachine) { assert(stateMachine != null); Log.d("Saving state machine in state %s", stateMachine.getCurrentState().getName()); mBackend.save(stateMachine); } @Override public void update(Observable<TransitionEvent> observable, TransitionEvent event) { if (mAutoSave && mStateMachine == observable) { save(mStateMachine); } } private boolean tryLoad() { if (mBackend.canLoad()) { Log.d("Loading state machine"); mStateMachine = mBackend.load(); return true; } return false; } }