10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.chromium.content.browser;
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.Context;
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.hardware.Sensor;
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.hardware.SensorEventListener;
100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import android.hardware.SensorManager;
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.os.Handler;
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.test.AndroidTestCase;
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import java.util.HashSet;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.util.Set;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Test suite for DeviceSensors.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic class DeviceSensorsTest extends AndroidTestCase {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    private DeviceSensorsForTests mDeviceSensors;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private MockSensorManager mMockSensorManager;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Override
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void setUp() throws Exception {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        super.setUp();
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mMockSensorManager = new MockSensorManager();
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors = DeviceSensorsForTests.getInstance(getContext());
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.setSensorManagerProxy(mMockSensorManager);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testRegisterSensorsDeviceMotion() {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean start = mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue(start);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain all motion sensors",
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.containsAll(
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        DeviceSensors.DEVICE_MOTION_SENSORS));
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceMotionIsActive);
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceOrientationIsActive);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_MOTION_SENSORS.size(),
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                mMockSensorManager.mNumRegistered);
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        assertEquals(0, mMockSensorManager.mNumUnRegistered);
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_MOTION_SENSORS.size(),
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.getNumberActiveDeviceMotionSensors());
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testRegisterSensorsDeviceOrientation() {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean start = mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue(start);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain all orientation sensors",
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.containsAll(
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        DeviceSensors.DEVICE_ORIENTATION_SENSORS));
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceMotionIsActive);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceOrientationIsActive);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_ORIENTATION_SENSORS.size(),
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                mMockSensorManager.mNumRegistered);
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        assertEquals(0, mMockSensorManager.mNumUnRegistered);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testRegisterSensorsDeviceMotionAndOrientation() {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startOrientation = mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startMotion = mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue(startOrientation);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue(startMotion);
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain all motion sensors",
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.containsAll(
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        DeviceSensors.DEVICE_MOTION_SENSORS));
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain all orientation sensors",
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.containsAll(
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        DeviceSensors.DEVICE_ORIENTATION_SENSORS));
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        Set<Integer> union = new HashSet<Integer>(
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            DeviceSensors.DEVICE_ORIENTATION_SENSORS);
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        union.addAll(DeviceSensors.DEVICE_MOTION_SENSORS);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(union.size(), mDeviceSensors.mActiveSensors.size());
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceMotionIsActive);
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceOrientationIsActive);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        assertEquals(union.size(), mMockSensorManager.mNumRegistered);
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        assertEquals(0, mMockSensorManager.mNumUnRegistered);
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_MOTION_SENSORS.size(),
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.getNumberActiveDeviceMotionSensors());
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testRegisterSensorsDeviceLight() {
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean start = mDeviceSensors.start(0, DeviceSensors.DEVICE_LIGHT, 100);
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue(start);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue(mDeviceSensors.mDeviceLightIsActive);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceMotionIsActive);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceOrientationIsActive);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertEquals(DeviceSensors.DEVICE_LIGHT_SENSORS.size(),
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                mMockSensorManager.mNumRegistered);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertEquals(0, mMockSensorManager.mNumUnRegistered);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testUnregisterSensorsDeviceMotion() {
1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.stop(DeviceSensors.DEVICE_MOTION);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain no sensors",
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.isEmpty());
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceMotionIsActive);
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceOrientationIsActive);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_MOTION_SENSORS.size(),
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                mMockSensorManager.mNumUnRegistered);
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(0, mDeviceSensors.getNumberActiveDeviceMotionSensors());
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testUnregisterSensorsDeviceOrientation() {
1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.stop(DeviceSensors.DEVICE_ORIENTATION);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain no sensors",
1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.isEmpty());
1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceMotionIsActive);
1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertFalse(mDeviceSensors.mDeviceOrientationIsActive);
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(DeviceSensors.DEVICE_ORIENTATION_SENSORS.size(),
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                mMockSensorManager.mNumUnRegistered);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testUnRegisterSensorsDeviceMotionAndOrientation() {
1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.stop(DeviceSensors.DEVICE_MOTION);
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue("should contain all orientation sensors",
1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                mDeviceSensors.mActiveSensors.containsAll(
1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        DeviceSensors.DEVICE_ORIENTATION_SENSORS));
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        Set<Integer> diff = new HashSet<Integer>(DeviceSensors.DEVICE_MOTION_SENSORS);
1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        diff.removeAll(DeviceSensors.DEVICE_ORIENTATION_SENSORS);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        assertEquals(diff.size(), mMockSensorManager.mNumUnRegistered);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.stop(DeviceSensors.DEVICE_ORIENTATION);
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue("should contain no sensors", mDeviceSensors.mActiveSensors.isEmpty());
1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(diff.size() + DeviceSensors.DEVICE_ORIENTATION_SENSORS.size(),
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                mMockSensorManager.mNumUnRegistered);
1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertEquals(0, mDeviceSensors.getNumberActiveDeviceMotionSensors());
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testUnregisterSensorsLight() {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.start(0, DeviceSensors.DEVICE_LIGHT, 100);
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.stop(DeviceSensors.DEVICE_LIGHT);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue("should contain no sensors", mDeviceSensors.mActiveSensors.isEmpty());
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceMotionIsActive);
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceOrientationIsActive);
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertFalse(mDeviceSensors.mDeviceLightIsActive);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testSensorChangedgotLight() {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startLight = mDeviceSensors.start(0, DeviceSensors.DEVICE_LIGHT, 100);
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue(startLight);
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertTrue(mDeviceSensors.mDeviceLightIsActive);
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        float[] values = {200};
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.sensorChanged(Sensor.TYPE_LIGHT, values);
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.verifyCalls("gotLight");
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.verifyValue(200);
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void testSensorChangedgotOrientation() {
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startOrientation = mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertTrue(startOrientation);
1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceOrientationIsActive);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float alpha = (float) Math.PI / 4;
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] values = {0, 0, (float) Math.sin(alpha / 2), (float) Math.cos(alpha / 2), -1};
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_ROTATION_VECTOR, values);
1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyCalls("gotOrientation");
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValuesEpsilon(Math.toDegrees(alpha), 0, 0);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testSensorChangedgotAccelerationIncludingGravity() {
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        float[] values = {1, 2, 3};
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_ACCELEROMETER, values);
2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyCalls("gotAccelerationIncludingGravity");
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValues(1, 2, 3);
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testSensorChangedgotAcceleration() {
2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        float[] values = {1, 2, 3};
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_LINEAR_ACCELERATION, values);
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyCalls("gotAcceleration");
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValues(1, 2, 3);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public void testSensorChangedgotRotationRate() {
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        float[] values = {1, 2, 3};
2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_GYROSCOPE, values);
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyCalls("gotRotationRate");
2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValues(1, 2, 3);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @SmallTest
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void testSensorChangedgotOrientationAndAcceleration() {
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startOrientation = mDeviceSensors.start(0, DeviceSensors.DEVICE_ORIENTATION, 100);
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        boolean startMotion = mDeviceSensors.start(0, DeviceSensors.DEVICE_MOTION, 100);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        assertTrue(startOrientation);
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        assertTrue(startMotion);
2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceMotionIsActive);
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        assertTrue(mDeviceSensors.mDeviceOrientationIsActive);
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float alpha = (float) Math.PI / 4;
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] values = {0, 0, (float) Math.sin(alpha / 2), (float) Math.cos(alpha / 2), -1};
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_ROTATION_VECTOR, values);
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyCalls("gotOrientation");
2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValuesEpsilon(Math.toDegrees(alpha), 0, 0);
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        float[] values2 = {1, 2, 3};
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.sensorChanged(Sensor.TYPE_ACCELEROMETER, values2);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.verifyCalls("gotOrientation" + "gotAccelerationIncludingGravity");
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        mDeviceSensors.verifyValues(1, 2, 3);
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Tests for correct Device Orientation angles.
2560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrixIdentity() {
2590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] gravity = {0, 0, 1};
2600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] magnetic = {0, 1, 0};
2610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {0, 0, 0};
2620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
2640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
2670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrix45DegreesX() {
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] gravity = {0, (float) Math.sin(Math.PI / 4), (float) Math.cos(Math.PI / 4)};
2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] magnetic = {0, 1, 0};
2700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {0, Math.PI / 4, 0};
2710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
2730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
2760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrix45DegreesY() {
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] gravity = {-(float) Math.sin(Math.PI / 4), 0, (float) Math.cos(Math.PI / 4)};
2780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] magnetic = {0, 1, 0};
2790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {0, 0, Math.PI / 4};
2800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
2820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
2850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrix45DegreesZ() {
2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] gravity = {0, 0, 1};
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] magnetic = {(float) Math.sin(Math.PI / 4), (float) Math.cos(Math.PI / 4), 0};
2880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {Math.PI / 4, 0, 0};
2890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
2910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
2940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrixGimbalLock() {
2950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] gravity = {0, 1, 0};
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] magnetic = {(float) Math.sin(Math.PI / 4), 0, -(float) Math.cos(Math.PI / 4)};
2970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {Math.PI / 4, Math.PI / 2, 0};  // favor yaw instead of roll
2980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
3000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
3010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
3030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrixPitchGreaterThan90() {
3040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        final double largePitchAngle = Math.PI / 2 + Math.PI / 4;
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        float[] gravity = {0, (float) Math.cos(largePitchAngle - Math.PI / 2),
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                -(float) Math.sin(largePitchAngle - Math.PI / 2)};
3070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] magnetic = {0, 0, -1};
3080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {0, largePitchAngle, 0};
3090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
3110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
3120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @SmallTest
3140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void testOrientationAnglesFromRotationMatrixRoll90() {
3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] gravity = {-1, 0, 0};
3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        float[] magnetic = {0, 1, 0};
3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] expectedAngles = {Math.PI, -Math.PI, -Math.PI / 2};
3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        verifyOrientationAngles(gravity, magnetic, expectedAngles);
3200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
3210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    /**
3230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     * Helper method for verifying angles obtained from rotation matrix.
3240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *
3250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     * @param gravity
3260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *        gravity vector in the device frame
3270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     * @param magnetic
3280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *        magnetic field vector in the device frame
3290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     * @param expectedAngles
3300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *        expectedAngles[0] rotation angle in radians around the Z-axis
3310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *        expectedAngles[1] rotation angle in radians around the X-axis
3320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     *        expectedAngles[2] rotation angle in radians around the Y-axis
3330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)     */
3340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    private void verifyOrientationAngles(float[] gravity, float[] magnetic,
3350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            double[] expectedAngles) {
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        float[] r = new float[9];
3370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        double[] values = new double[3];
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        SensorManager.getRotationMatrix(r, null, gravity, magnetic);
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDeviceSensors.computeDeviceOrientationFromRotationMatrix(r, values);
3400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        assertEquals(expectedAngles.length, values.length);
3420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        final double epsilon = 0.001;
3430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        for (int i = 0; i < expectedAngles.length; ++i) {
3440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            assertEquals(expectedAngles[i], values[i], epsilon);
3450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        }
3460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
3480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // -- End Tests for correct Device Orientation angles.
3500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    private static class DeviceSensorsForTests extends DeviceSensors {
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private double mValue1 = 0;
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private double mValue2 = 0;
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private double mValue3 = 0;
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private String mCalls = "";
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        private DeviceSensorsForTests(Context context) {
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            super(context);
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        static DeviceSensorsForTests getInstance(Context context) {
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            return new DeviceSensorsForTests(context);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        private void verifyValue(double v1) {
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(v1, mValue1);
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private void verifyValues(double v1, double v2, double v3) {
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v1, mValue1);
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v2, mValue2);
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v3, mValue3);
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private void verifyValuesEpsilon(double v1, double v2, double v3) {
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v1, mValue1, 0.1);
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v2, mValue2, 0.1);
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            assertEquals(v3, mValue3, 0.1);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private void verifyCalls(String names) {
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            assertEquals(mCalls, names);
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        protected void gotLight(double light) {
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mValue1 = light;
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mCalls = mCalls.concat("gotLight");
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        @Override
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        protected void gotOrientation(double alpha, double beta, double gamma) {
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue1 = alpha;
3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue2 = beta;
3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue3 = gamma;
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mCalls = mCalls.concat("gotOrientation");
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        protected void gotAcceleration(double x, double y, double z) {
4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue1 = x;
4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue2 = y;
4046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue3 = z;
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mCalls = mCalls.concat("gotAcceleration");
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        protected void gotAccelerationIncludingGravity(double x, double y, double z) {
4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue1 = x;
4116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue2 = y;
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue3 = z;
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mCalls = mCalls.concat("gotAccelerationIncludingGravity");
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        protected void gotRotationRate(double alpha, double beta, double gamma) {
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue1 = alpha;
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue2 = beta;
4206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mValue3 = gamma;
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mCalls = mCalls.concat("gotRotationRate");
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private static class MockSensorManager implements
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            DeviceSensors.SensorManagerProxy {
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private int mNumRegistered = 0;
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private int mNumUnRegistered = 0;
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private MockSensorManager() {
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        public boolean registerListener(SensorEventListener listener, int sensorType, int rate,
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                Handler handler) {
4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mNumRegistered++;
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return true;
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        @Override
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        public void unregisterListener(SensorEventListener listener, int sensorType) {
4436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mNumUnRegistered++;
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
447