Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
|
no sievers
2015/03/19 01:24:52
nit: 2015
| |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.content.browser.input; | |
| 6 | |
| 7 import android.content.Context; | |
| 8 import android.os.Handler; | |
| 9 import android.os.HandlerThread; | |
| 10 import android.util.Log; | |
| 11 | |
| 12 import com.google.vrtoolkit.cardboard.CardboardDeviceParams; | |
| 13 import com.google.vrtoolkit.cardboard.FieldOfView; | |
| 14 import com.google.vrtoolkit.cardboard.HeadMountedDisplay; | |
| 15 import com.google.vrtoolkit.cardboard.HeadMountedDisplayManager; | |
| 16 import com.google.vrtoolkit.cardboard.ScreenParams; | |
| 17 import com.google.vrtoolkit.cardboard.sensors.HeadTracker; | |
| 18 import com.google.vrtoolkit.cardboard.sensors.MagnetSensor; | |
| 19 | |
| 20 import org.chromium.base.CalledByNative; | |
| 21 import org.chromium.base.JNINamespace; | |
| 22 | |
| 23 /** | |
| 24 * This is the implementation of the C++ counterpart CardboardVRDevice. | |
| 25 */ | |
| 26 @JNINamespace("content") | |
| 27 class CardboardVRDevice implements MagnetSensor.OnCardboardTriggerListener { | |
| 28 private static final String TAG = "CardboardVRDevice"; | |
| 29 private HeadMountedDisplayManager mHMDManager; | |
| 30 private HeadTracker mHeadTracker; | |
| 31 private long mVrDevicePtr; | |
| 32 private HandlerThread mSensorObserverThread; | |
| 33 private Handler mSensorHandler; | |
| 34 private MagnetSensor mMagnetSensor; | |
| 35 | |
| 36 @CalledByNative | |
| 37 private static CardboardVRDevice create(Context context, long vrDevicePtr) { | |
| 38 return new CardboardVRDevice(context, vrDevicePtr); | |
| 39 } | |
| 40 | |
| 41 private CardboardVRDevice(Context context, long vrDevicePtr) { | |
| 42 mVrDevicePtr = vrDevicePtr; | |
| 43 | |
| 44 mHMDManager = new HeadMountedDisplayManager(context); | |
| 45 | |
| 46 mHeadTracker = HeadTracker.createFromContext(context); | |
| 47 mHeadTracker.setNeckModelEnabled(true); | |
| 48 mHeadTracker.startTracking(); | |
| 49 | |
| 50 mMagnetSensor = new MagnetSensor(context); | |
| 51 startObservingCardboardSensors(); | |
| 52 } | |
| 53 | |
| 54 @CalledByNative | |
| 55 private void getFieldOfView(float[] outFov) { | |
| 56 HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay(); | |
| 57 CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams(); | |
| 58 FieldOfView fov = deviceParams.getLeftEyeMaxFov(); | |
| 59 outFov[0] = fov.getTop(); | |
| 60 outFov[1] = fov.getBottom(); | |
| 61 outFov[2] = fov.getLeft(); | |
| 62 outFov[3] = fov.getRight(); | |
| 63 } | |
| 64 | |
| 65 @CalledByNative | |
| 66 private float getIPD() { | |
| 67 HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay(); | |
| 68 CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams(); | |
| 69 return deviceParams.getInterLensDistance(); | |
| 70 } | |
| 71 | |
| 72 @CalledByNative | |
| 73 private String getDeviceName() { | |
| 74 HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay(); | |
| 75 CardboardDeviceParams deviceParams = hmd.getCardboardDeviceParams(); | |
| 76 return deviceParams.getVendor() + " " + deviceParams.getModel(); | |
| 77 } | |
| 78 | |
| 79 @CalledByNative | |
| 80 private void getScreenSize(int[] outSize) { | |
| 81 HeadMountedDisplay hmd = mHMDManager.getHeadMountedDisplay(); | |
| 82 ScreenParams screenParams = hmd.getScreenParams(); | |
| 83 outSize[0] = screenParams.getWidth(); | |
| 84 outSize[1] = screenParams.getHeight(); | |
| 85 } | |
| 86 | |
| 87 @CalledByNative | |
| 88 private void getSensorState(float[] outMatrix) { | |
| 89 mHeadTracker.getLastHeadView(outMatrix, 0); | |
| 90 } | |
| 91 | |
| 92 @CalledByNative | |
| 93 private void stopTracking() { | |
| 94 mHeadTracker.stopTracking(); | |
| 95 stopObservingCardboardSensors(); | |
| 96 } | |
| 97 | |
| 98 @CalledByNative | |
| 99 private void resetSensor() { | |
| 100 mHeadTracker.resetTracker(); | |
| 101 } | |
| 102 | |
| 103 @Override | |
| 104 public void onCardboardTrigger() { | |
| 105 Log.d(TAG, "onCardboardTrigger"); | |
|
no sievers
2015/03/19 01:24:52
that's spammy
| |
| 106 nativeOnCardboardTrigger(mVrDevicePtr); | |
| 107 } | |
| 108 | |
| 109 private native void nativeOnCardboardTrigger(long vrDevicePtr); | |
| 110 | |
| 111 private void startObservingCardboardSensors() { | |
| 112 if (mSensorObserverThread != null) | |
| 113 return; | |
| 114 final CardboardVRDevice listener = this; | |
| 115 | |
| 116 mSensorObserverThread = new HandlerThread("MagnetObserver"); | |
| 117 mSensorObserverThread.start(); | |
| 118 | |
| 119 mSensorHandler = new Handler(mSensorObserverThread.getLooper()); | |
| 120 mSensorHandler.post(new Runnable() { | |
| 121 @Override | |
| 122 public void run() { | |
| 123 mMagnetSensor.setOnCardboardTriggerListener(listener); | |
| 124 mMagnetSensor.start(); | |
| 125 } | |
| 126 }); | |
| 127 } | |
| 128 | |
| 129 private void stopObservingCardboardSensors() { | |
| 130 final CardboardVRDevice listener = this; | |
|
no sievers
2015/03/19 01:24:52
unused var
| |
| 131 mMagnetSensor.stop(); | |
|
no sievers
2015/03/19 01:24:52
Is it ok to call this from a thread different than
| |
| 132 | |
| 133 if (mSensorObserverThread == null) | |
| 134 return; | |
| 135 | |
| 136 mSensorObserverThread.quit(); | |
| 137 try { | |
| 138 mSensorObserverThread.join(); | |
| 139 } catch (InterruptedException e) { | |
| 140 Log.e(TAG, "Thread.join() exception: ", e); | |
| 141 } | |
| 142 mSensorObserverThread = null; | |
| 143 } | |
| 144 } | |
| OLD | NEW |