package okj.easy.screen; import okj.easy.core.Screen; import okj.easy.core.eAdmin; import org.ege.utils.E; import org.ege.utils.exception.EasyGEngineRuntimeException; import org.ege.widget.Layout; import com.badlogic.gdx.assets.AssetErrorListener; public abstract class LoadingScreen extends Screen implements AssetErrorListener { protected float progress; private boolean isDone; boolean autoChangeScreen = true; /** Flag show that this is the first time load,otherwise this is a reload */ boolean mFirstTimeLoad = true; private OnChangedScreen mNewScreen; public void setAutoChangeScreen (boolean isAuto) { this.autoChangeScreen = isAuto; } public LoadingScreen setChangedScreenListener (OnChangedScreen newScreen) { this.mNewScreen = newScreen; return this; } /********************************************************** * **********************************************************/ @Override public void show () { progress = 0; isDone = false; if (mFirstTimeLoad) onLoadData(); else { if (isLayoutCreated()) { Layout layout = getScreenLayout(); layout.createSafeModePanel(); } } int size = eAdmin.econtext.getQueueAssets() + eAdmin.eaudio.getQueueAssets(); final OnChangedScreen tmp = this.mNewScreen; onCreate(); // check for sercurity flag at onCreate(); if (mNewScreen != tmp) throw new EasyGEngineRuntimeException("Can't change the next screen at onCreate()"); if (size != eAdmin.econtext.getQueueAssets() + eAdmin.eaudio.getQueueAssets()) throw new EasyGEngineRuntimeException("Can't load data at onCreate()"); if (!mFirstTimeLoad) setAutoChangeScreen(true); } @Override public void update (float delta) { super.update(delta); isDone = eAdmin.econtext.update() & (eAdmin.econtext.getQueueAssets() == 0); isDone = isDone & eAdmin.eaudio.update() & (eAdmin.eaudio.getQueueAssets() == 0); progress = (eAdmin.econtext.getProgress() + eAdmin.eaudio.getProgress()) / 2; if (isDone & autoChangeScreen) { setScreen(mNewScreen.screenChanged(), E.screen.RELEASE); mFirstTimeLoad = false; return; } } @Override public void destroy (int destroyMode) { eAdmin.einput.unregisterBackKeyListener(); batch.flush(); if (isLayoutCreated()) { Layout layout = getScreenLayout(); // if in restore mode if (mFirstTimeLoad) layout.clear(); else layout.restore(); } onDestroy(); } /********************************************************** * **********************************************************/ /** The method setChangedScreenListener should be called at onLoadData (not at this method) */ public abstract void onCreate (); /** You only should call ResourceContext.load() in this method .This will help you ensure that context only load one time event * when you come back from onResume() */ public abstract void onLoadData (); public abstract void onDestroy (); /********************************************************** Loading method **********************************************************/ public boolean isFirstTimeLoad () { return mFirstTimeLoad; } @Override public void error (String fileName, Class type, Throwable throwable) { } public void enableBugTracker () { eAdmin.econtext.manager.setErrorListener(this); eAdmin.eaudio.manager.setErrorListener(this); } public static interface OnChangedScreen { public Screen screenChanged (); } }