Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: content/public/android/javatests/src/org/chromium/content/browser/DeviceMotionAndOrientationTest.java

Issue 40393002: Android: fix the computation of device orientation angles in accordance with spec. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.content.browser; 5 package org.chromium.content.browser;
6 6
7 import android.hardware.Sensor; 7 import android.hardware.Sensor;
8 import android.hardware.SensorEventListener; 8 import android.hardware.SensorEventListener;
9 import android.hardware.SensorManager;
9 import android.os.Handler; 10 import android.os.Handler;
10 import android.test.AndroidTestCase; 11 import android.test.AndroidTestCase;
11 import android.test.suitebuilder.annotation.SmallTest; 12 import android.test.suitebuilder.annotation.SmallTest;
12 13
13 import java.util.HashSet; 14 import java.util.HashSet;
14 import java.util.Set; 15 import java.util.Set;
15 16
16
17 /** 17 /**
18 * Test suite for DeviceMotionAndOrientation. 18 * Test suite for DeviceMotionAndOrientation.
19 */ 19 */
20 public class DeviceMotionAndOrientationTest extends AndroidTestCase { 20 public class DeviceMotionAndOrientationTest extends AndroidTestCase {
21 21
22 private DeviceMotionAndOrientationForTests mDeviceMotionAndOrientation; 22 private DeviceMotionAndOrientationForTests mDeviceMotionAndOrientation;
23 private MockSensorManager mMockSensorManager; 23 private MockSensorManager mMockSensorManager;
24 24
25 @Override 25 @Override
26 public void setUp() throws Exception { 26 public void setUp() throws Exception {
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 199
200 @SmallTest 200 @SmallTest
201 public void testSensorChangedmagneticField() { 201 public void testSensorChangedmagneticField() {
202 mDeviceMotionAndOrientation.start(0, DeviceMotionAndOrientation.DEVICE_O RIENTATION, 100); 202 mDeviceMotionAndOrientation.start(0, DeviceMotionAndOrientation.DEVICE_O RIENTATION, 100);
203 203
204 float[] values = {1, 2, 3}; 204 float[] values = {1, 2, 3};
205 mDeviceMotionAndOrientation.sensorChanged(Sensor.TYPE_MAGNETIC_FIELD, va lues); 205 mDeviceMotionAndOrientation.sensorChanged(Sensor.TYPE_MAGNETIC_FIELD, va lues);
206 mDeviceMotionAndOrientation.verifyCalls(""); 206 mDeviceMotionAndOrientation.verifyCalls("");
207 } 207 }
208 208
209 // Tests for correct Device Orientation angles.
210
211 @SmallTest
212 public void testOrientationAnglesFromRotationMatrixIdentity() {
213 float[] gravity = {0, 0, 1};
214 float[] magnetic = {0, 1, 0};
215 double[] expectedAngles = {0, 0, 0};
216
217 verifyOrientationAngles(gravity, magnetic, expectedAngles);
218 }
219
220 @SmallTest
221 public void testOrientationAnglesFromRotationMatrix45DegreesX() {
222 float[] gravity = {0, (float)Math.sin(Math.PI/4), (float)Math.cos(Math.P I/4)};
bulach 2013/10/24 17:08:44 ditto, spaces around "/"
timvolodine 2013/10/30 14:14:47 Done.
223 float[] magnetic = {0, 1, 0};
224 double[] expectedAngles = {0, Math.PI/4, 0};
225
226 verifyOrientationAngles(gravity, magnetic, expectedAngles);
227 }
228
229 @SmallTest
230 public void testOrientationAnglesFromRotationMatrix45DegreesY() {
231 float[] gravity = {-(float)Math.sin(Math.PI/4), 0, (float)Math.cos(Math. PI/4)};
232 float[] magnetic = {0, 1, 0};
233 double[] expectedAngles = {0, 0, Math.PI/4};
234
235 verifyOrientationAngles(gravity, magnetic, expectedAngles);
236 }
237
238 @SmallTest
239 public void testOrientationAnglesFromRotationMatrix45DegreesZ() {
240 float[] gravity = {0, 0, 1};
241 float[] magnetic = {(float)Math.sin(Math.PI/4), (float)Math.cos(Math.PI/ 4), 0};
242 double[] expectedAngles = {Math.PI/4, 0, 0};
243
244 verifyOrientationAngles(gravity, magnetic, expectedAngles);
245 }
246
247 @SmallTest
248 public void testOrientationAnglesFromRotationMatrixGimbalLock() {
249 float[] gravity = {0, 1, 0};
250 float[] magnetic = {(float)Math.sin(Math.PI/4), 0, -(float)Math.cos(Math .PI/4)};
251 double[] expectedAngles = {Math.PI/4, Math.PI/2, 0}; // favor yaw inste ad of roll
252
253 verifyOrientationAngles(gravity, magnetic, expectedAngles);
254 }
255
256 @SmallTest
257 public void testOrientationAnglesFromRotationMatrixPitchGreaterThan90() {
258 final double largePitchAngle = Math.PI/2 + Math.PI/4;
259 float[] gravity = {0, (float)Math.cos(largePitchAngle - Math.PI/2),
260 -(float)Math.sin(largePitchAngle - Math.PI/2)};
261 float[] magnetic = {0, 0, -1};
262 double[] expectedAngles = {0, largePitchAngle, 0};
263
264 verifyOrientationAngles(gravity, magnetic, expectedAngles);
265 }
266
267 @SmallTest
268 public void testOrientationAnglesFromRotationMatrixRoll90() {
269 float[] gravity = {-1, 0, 0};
270 float[] magnetic = {0, 1, 0};
271 double[] expectedAngles = {Math.PI, -Math.PI, -Math.PI/2};
272
273 verifyOrientationAngles(gravity, magnetic, expectedAngles);
274 }
275
276 /**
277 * Helper method for veryfying angles obtained from rotation matrix.
Michael van Ouwerkerk 2013/10/29 16:18:06 s/veryfying/verifying/
timvolodine 2013/10/30 14:14:47 Done.
278 *
279 * @param gravity
280 * gravity vector in the device frame
281 * @param magnetic
282 * magnetic field vector in the device frame
283 * @param expectedAngles
284 * expectedAngles[0] rotation angle in radians around the Z-axis
285 * expectedAngles[1] rotation angle in radians around the X-axis
286 * expectedAngles[2] rotation angle in radians around the Y-axis
287 */
288 private void verifyOrientationAngles(float[] gravity, float[] magnetic,
289 double[] expectedAngles) {
290 float[] R = new float[9];
291 double[] values = new double[3];
292 SensorManager.getRotationMatrix(R, null, gravity, magnetic);
293 mDeviceMotionAndOrientation.getOrientationMobileDevice(R, values);
294
295 assertEquals(expectedAngles.length, values.length);
296 final double epsilon = 0.001;
297 for (int i = 0; i < expectedAngles.length; ++i) {
298 assertEquals(expectedAngles[i], values[i], epsilon);
299 }
300
301 }
302
303 // -- End Tests for correct Device Orientation angles.
304
209 private static class DeviceMotionAndOrientationForTests extends DeviceMotion AndOrientation { 305 private static class DeviceMotionAndOrientationForTests extends DeviceMotion AndOrientation {
210 306
211 private double value1 = 0; 307 private double value1 = 0;
212 private double value2 = 0; 308 private double value2 = 0;
213 private double value3 = 0; 309 private double value3 = 0;
214 private String mCalls = ""; 310 private String mCalls = "";
215 311
216 private DeviceMotionAndOrientationForTests(){ 312 private DeviceMotionAndOrientationForTests(){
217 } 313 }
218 314
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 numRegistered++; 380 numRegistered++;
285 return true; 381 return true;
286 } 382 }
287 383
288 @Override 384 @Override
289 public void unregisterListener(SensorEventListener listener, int sensorT ype) { 385 public void unregisterListener(SensorEventListener listener, int sensorT ype) {
290 numUnRegistered++; 386 numUnRegistered++;
291 } 387 }
292 } 388 }
293 } 389 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698