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..11635157e21d405b0b0b34da1fc3d694ec48e944 |
--- /dev/null |
+++ b/content/public/android/java/src/org/chromium/content/browser/input/CardboardVRDevice.java |
@@ -0,0 +1,144 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
no sievers
2015/03/19 01:24:52
nit: 2015
|
+// 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() { |
+ Log.d(TAG, "onCardboardTrigger"); |
no sievers
2015/03/19 01:24:52
that's spammy
|
+ 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() { |
+ final CardboardVRDevice listener = this; |
no sievers
2015/03/19 01:24:52
unused var
|
+ mMagnetSensor.stop(); |
no sievers
2015/03/19 01:24:52
Is it ok to call this from a thread different than
|
+ |
+ if (mSensorObserverThread == null) |
+ return; |
+ |
+ mSensorObserverThread.quit(); |
+ try { |
+ mSensorObserverThread.join(); |
+ } catch (InterruptedException e) { |
+ Log.e(TAG, "Thread.join() exception: ", e); |
+ } |
+ mSensorObserverThread = null; |
+ } |
+} |