package com.asha.vrlib.strategy.interactive; import android.app.Activity; import android.content.Context; import android.hardware.SensorEventListener; import com.asha.vrlib.MDVRLibrary; import com.asha.vrlib.common.MDGLHandler; import com.asha.vrlib.strategy.ModeManager; import com.asha.vrlib.strategy.projection.ProjectionModeManager; /** * Created by hzqiujiadi on 16/3/19. * hzqiujiadi ashqalcn@gmail.com */ public class InteractiveModeManager extends ModeManager<AbsInteractiveStrategy> implements IInteractiveMode { private boolean mIsResumed; private static int[] sModes = {MDVRLibrary.INTERACTIVE_MODE_MOTION, MDVRLibrary.INTERACTIVE_MODE_TOUCH, MDVRLibrary.INTERACTIVE_MODE_MOTION_WITH_TOUCH, MDVRLibrary.INTERACTIVE_MODE_CARDBORAD_MOTION, }; public static class Params{ public int mMotionDelay; public SensorEventListener mSensorListener; public ProjectionModeManager projectionModeManager; public MDGLHandler glHandler; } private Params mParams; public InteractiveModeManager(int mode, MDGLHandler handler, Params params) { super(mode, handler); mParams = params; mParams.glHandler = getGLHandler(); } @Override protected int[] getModes() { return sModes; } @Override protected AbsInteractiveStrategy createStrategy(int mode) { switch (mode){ case MDVRLibrary.INTERACTIVE_MODE_MOTION: return new MotionStrategy(mParams); case MDVRLibrary.INTERACTIVE_MODE_MOTION_WITH_TOUCH: return new MotionWithTouchStrategy(mParams); case MDVRLibrary.INTERACTIVE_MODE_CARDBORAD_MOTION: return new CardboardMotionStrategy(mParams); case MDVRLibrary.INTERACTIVE_MODE_CARDBORAD_MOTION_WITH_TOUCH: return new CardboardMTStrategy(mParams); case MDVRLibrary.INTERACTIVE_MODE_TOUCH: default: return new TouchStrategy(mParams); } } private UpdateDragRunnable updateDragRunnable = new UpdateDragRunnable(); /** * handle touch touch to rotate the model * * @param distanceX x * @param distanceY y * @return true if handled. */ @Override public boolean handleDrag(final int distanceX, final int distanceY) { updateDragRunnable.handleDrag(distanceX, distanceY); getGLHandler().post(updateDragRunnable); return false; } @Override public void onOrientationChanged(final Activity activity) { getGLHandler().post(new Runnable() { @Override public void run() { getStrategy().onOrientationChanged(activity); } }); } private class UpdateDragRunnable implements Runnable { private int distanceX; private int distanceY; private void handleDrag(int distanceX, int distanceY){ this.distanceX = distanceX; this.distanceY = distanceY; } @Override public void run() { getStrategy().handleDrag(distanceX, distanceY); } } public void onResume(Context context) { mIsResumed = true; if (getStrategy().isSupport((Activity)context)){ getStrategy().onResume(context); } } @Override public void on(Activity activity) { super.on(activity); if (mIsResumed){ onResume(activity); } } public void onPause(Context context) { mIsResumed = false; if (getStrategy().isSupport((Activity)context)){ getStrategy().onPause(context); } } }