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 |