package com.asha.vrlib.strategy; import android.app.Activity; import com.asha.vrlib.MDVRLibrary; import com.asha.vrlib.common.MDGLHandler; import com.asha.vrlib.common.MDMainHandler; import java.util.Arrays; import static com.asha.vrlib.common.VRUtil.checkMainThread; /** * Created by hzqiujiadi on 16/3/19. * hzqiujiadi ashqalcn@gmail.com */ public abstract class ModeManager<T extends IModeStrategy> { private int mMode; private T mStrategy; private MDVRLibrary.INotSupportCallback mCallback; private MDGLHandler mGLHandler; public ModeManager(int mode, MDGLHandler handler) { this.mGLHandler = handler; this.mMode = mode; } /** * must call after new instance * @param activity activity */ public void prepare(Activity activity, MDVRLibrary.INotSupportCallback callback){ mCallback = callback; initMode(activity,mMode); } abstract protected T createStrategy(int mode); abstract protected int[] getModes(); private void initMode(Activity activity, final int mode){ if (mStrategy != null){ off(activity); } mStrategy = createStrategy(mode); if (!mStrategy.isSupport(activity)){ MDMainHandler.sharedHandler().post(new Runnable() { @Override public void run() { if (mCallback != null) { mCallback.onNotSupport(mode); } } }); return; } // t on(activity); } public void switchMode(final Activity activity){ int[] modes = getModes(); int mode = getMode(); int index = Arrays.binarySearch(modes, mode); int nextIndex = (index + 1) % modes.length; int nextMode = modes[nextIndex]; switchMode(activity, nextMode); } public void switchMode(final Activity activity, final int mode){ if (mode == getMode()) return; mMode = mode; initMode(activity, mMode); } public void on(final Activity activity) { checkMainThread("strategy on must call from main thread!"); final T tmpStrategy = mStrategy; if (tmpStrategy.isSupport(activity)){ getGLHandler().post(new Runnable() { @Override public void run() { tmpStrategy.turnOnInGL(activity); } }); } } public void off(final Activity activity) { checkMainThread("strategy off must call from main thread!"); final T tmpStrategy = mStrategy; if (tmpStrategy.isSupport(activity)){ getGLHandler().post(new Runnable() { @Override public void run() { tmpStrategy.turnOffInGL(activity); } }); } } protected T getStrategy() { return mStrategy; } public int getMode() { return mMode; } public MDGLHandler getGLHandler() { return mGLHandler; } }