1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.cts.verifier.sensors;
18 
19 import android.hardware.Sensor;
20 import android.hardware.SensorEvent;
21 import android.hardware.SensorEventListener;
22 import android.hardware.SensorManager;
23 import android.hardware.TriggerEvent;
24 import android.hardware.TriggerEventListener;
25 import android.hardware.cts.helpers.SensorNotSupportedException;
26 import com.android.cts.verifier.R;
27 import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
28 import junit.framework.Assert;
29 
30 import java.util.concurrent.CountDownLatch;
31 import java.util.concurrent.TimeUnit;
32 
33 /**
34  * Tests about event policy when the observer's UID is idle.
35  */
36 public class EventSanitizationTestActivity extends SensorCtsVerifierTestActivity {
EventSanitizationTestActivity()37     public EventSanitizationTestActivity() {
38         super(EventSanitizationTestActivity.class);
39     }
40 
41     // time for the test to wait for an event
42     private static final int EVENT_TIMEOUT = 30;
43 
44     @Override
activitySetUp()45     protected void activitySetUp() throws Exception {
46         getTestLogger().logInstructions(R.string.snsr_event_sanitization_test_setup);
47         waitForUserToBegin();
48     }
49 
50     @Override
activityCleanUp()51     protected void activityCleanUp() throws Exception {
52         getTestLogger().logInstructions(R.string.snsr_event_sanitization_test_cleanup);
53         waitForUserToContinue();
54     }
55 
56     /**
57      * Test that no trigger events are triggered while the UID is idle.
58      */
testNoTriggerEventsWhileUidIdle()59     public String testNoTriggerEventsWhileUidIdle() throws Exception {
60         // Not significant motion sensor, nothing to do.
61         final SensorManager sensorManager = getApplicationContext()
62                 .getSystemService(SensorManager.class);
63         final Sensor sensor = sensorManager.getDefaultSensor(
64                 Sensor.TYPE_SIGNIFICANT_MOTION);
65         if (sensor == null) {
66             throw new SensorNotSupportedException(Sensor.TYPE_SIGNIFICANT_MOTION);
67         }
68 
69         // Let us begin.
70         final SensorTestLogger logger = getTestLogger();
71         logger.logInstructions(R.string.snsr_significant_motion_test_uid_idle);
72         waitForUserToBegin();
73 
74         // Watch for the trigger event.
75         final CountDownLatch latch = new CountDownLatch(1);
76         final TriggerEventListener listener = new TriggerEventListener() {
77             @Override
78             public void onTrigger(TriggerEvent event) {
79                 latch.countDown();
80             }
81         };
82         sensorManager.requestTriggerSensor(listener, sensor);
83 
84         // Tell the user now when the test completes.
85         logger.logWaitForSound();
86 
87         // We shouldn't be getting an event.
88         try {
89             Assert.assertFalse(getString(R.string
90                     .snsr_significant_motion_test_uid_idle_expectation),
91                     latch.await(EVENT_TIMEOUT, TimeUnit.SECONDS));
92         } finally {
93             sensorManager.cancelTriggerSensor(listener, sensor);
94             playSound();
95         }
96 
97         return null;
98     }
99 
100     /**
101      * Test that no on-change events are triggered while the UID is idle.
102      */
testNoOnChangeEventsWhileUidIdle()103     public String testNoOnChangeEventsWhileUidIdle() throws Exception {
104         // Not significant motion sensor, nothing to do.
105         final SensorManager sensorManager = getApplicationContext()
106                 .getSystemService(SensorManager.class);
107         final Sensor sensor = sensorManager.getDefaultSensor(
108                 Sensor.TYPE_PROXIMITY);
109         if (sensor == null) {
110             throw new SensorNotSupportedException(Sensor.TYPE_PROXIMITY);
111         }
112 
113         // Let us begin.
114         final SensorTestLogger logger = getTestLogger();
115         logger.logInstructions(R.string.snsr_proximity_test_uid_idle);
116         waitForUserToBegin();
117 
118         // Watch for the change event.
119         final CountDownLatch latch = new CountDownLatch(1);
120         final SensorEventListener listener = new SensorEventListener() {
121             @Override
122             public void onSensorChanged(SensorEvent event) {
123                 latch.countDown();
124             }
125 
126             @Override
127             public void onAccuracyChanged(Sensor sensor, int accuracy) {
128                 /* do nothing */
129             }
130         };
131         sensorManager.registerListener(listener, sensor,
132                 sensor.getMinDelay(), sensor.getMaxDelay());
133 
134         // Tell the user now when the test completes.
135         logger.logWaitForSound();
136 
137         // We shouldn't be getting an event.
138         try {
139             Assert.assertFalse(getString(R.string
140                     .snsr_proximity_test_uid_idle_expectation),
141                     latch.await(EVENT_TIMEOUT, TimeUnit.SECONDS));
142         } finally {
143             sensorManager.unregisterListener(listener, sensor);
144             playSound();
145         }
146 
147         return null;
148     }
149 }
150