| Index: content/public/android/java/src/org/chromium/content/browser/input/CardboardVRDevice.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/input/CardboardVRDevice.java b/content/public/android/java/src/org/chromium/content/browser/input/CardboardVRDevice.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1ecf6321030ee3a8a29bd3e6b99faf37ccf65dda
|
| --- /dev/null
|
| +++ b/content/public/android/java/src/org/chromium/content/browser/input/CardboardVRDevice.java
|
| @@ -0,0 +1,142 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.content.browser.input;
|
| +
|
| +import android.content.Context;
|
| +import android.os.Handler;
|
| +import android.os.HandlerThread;
|
| +import android.util.Log;
|
| +
|
| +import com.google.vrtoolkit.cardboard.CardboardDeviceParams;
|
| +import com.google.vrtoolkit.cardboard.FieldOfView;
|
| +import com.google.vrtoolkit.cardboard.HeadMountedDisplay;
|
| +import com.google.vrtoolkit.cardboard.HeadMountedDisplayManager;
|
| +import com.google.vrtoolkit.cardboard.ScreenParams;
|
| +import com.google.vrtoolkit.cardboard.sensors.HeadTracker;
|
| +import com.google.vrtoolkit.cardboard.sensors.MagnetSensor;
|
| +
|
| +import org.chromium.base.CalledByNative;
|
| +import org.chromium.base.JNINamespace;
|
| +
|
| +/**
|
| + * This is the implementation of the C++ counterpart CardboardVRDevice.
|
| + */
|
| +@JNINamespace("content")
|
| +class CardboardVRDevice implements MagnetSensor.OnCardboardTriggerListener {
|
| + private static final String TAG = "CardboardVRDevice";
|
| + private HeadMountedDisplayManager mHMDManager;
|
| + private HeadTracker mHeadTracker;
|
| + private long mVrDevicePtr;
|
| + private HandlerThread mSensorObserverThread;
|
| + private Handler mSensorHandler;
|
| + private MagnetSensor mMagnetSensor;
|
| +
|
| + @CalledByNative
|
| + private static CardboardVRDevice create(Context context, long vrDevicePtr) {
|
| + return new CardboardVRDevice(context, vrDevicePtr);
|
| + }
|
| +
|
| + private CardboardVRDevice(Context context, long vrDevicePtr) {
|
| + mVrDevicePtr = vrDevicePtr;
|
| +
|
| + mHMDManager = new HeadMountedDisplayManager(context);
|
| +
|
| + mHeadTracker = HeadTracker.createFromContext(context);
|
| + mHeadTracker.setNeckModelEnabled(true);
|
| + mHeadTracker.startTracking();
|
| +
|
| + mMagnetSensor = new MagnetSensor(context);
|
| + startObservingCardboardSensors();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private void getFieldOfView(float[] outFov) {
|
| + HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay();
|
| + CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams();
|
| + FieldOfView fov = deviceParams.getLeftEyeMaxFov();
|
| + outFov[0] = fov.getTop();
|
| + outFov[1] = fov.getBottom();
|
| + outFov[2] = fov.getLeft();
|
| + outFov[3] = fov.getRight();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private float getIPD() {
|
| + HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay();
|
| + CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams();
|
| + return deviceParams.getInterLensDistance();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private String getDeviceName() {
|
| + HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay();
|
| + CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams();
|
| + return deviceParams.getVendor() + " " + deviceParams.getModel();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private void getScreenSize(int[] outSize) {
|
| + HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay();
|
| + ScreenParams screenParams = hmd.getScreenParams();
|
| + outSize[0] = screenParams.getWidth();
|
| + outSize[1] = screenParams.getHeight();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private void getSensorState(float[] outMatrix) {
|
| + mHeadTracker.getLastHeadView(outMatrix, 0);
|
| + }
|
| +
|
| + @CalledByNative
|
| + private void stopTracking() {
|
| + mHeadTracker.stopTracking();
|
| + stopObservingCardboardSensors();
|
| + }
|
| +
|
| + @CalledByNative
|
| + private void resetSensor() {
|
| + mHeadTracker.resetTracker();
|
| + }
|
| +
|
| + @Override
|
| + public void onCardboardTrigger() {
|
| + nativeOnCardboardTrigger(mVrDevicePtr);
|
| + }
|
| +
|
| + private native void nativeOnCardboardTrigger(long vrDevicePtr);
|
| +
|
| + private void startObservingCardboardSensors() {
|
| + if (mSensorObserverThread != null)
|
| + return;
|
| + final CardboardVRDevice listener = this;
|
| +
|
| + mSensorObserverThread = new HandlerThread("MagnetObserver");
|
| + mSensorObserverThread.start();
|
| +
|
| + mSensorHandler = new Handler(mSensorObserverThread.getLooper());
|
| + mSensorHandler.post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mMagnetSensor.setOnCardboardTriggerListener(listener);
|
| + mMagnetSensor.start();
|
| + }
|
| + });
|
| + }
|
| +
|
| + private void stopObservingCardboardSensors() {
|
| + mMagnetSensor.stop();
|
| +
|
| + if (mSensorObserverThread == null)
|
| + return;
|
| +
|
| + mSensorObserverThread.quit();
|
| + try {
|
| + mSensorObserverThread.join();
|
| + } catch (InterruptedException e) {
|
| + Log.e(TAG, "Thread.join() exception: ", e);
|
| + }
|
| + mSensorObserverThread = null;
|
| + }
|
| +}
|
|
|