Chromium Code Reviews| 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; |
| + } |
| +} |