blob: 852cf4aba49e2d7aeea7441f270ad5f46eb5a1b5 [file] [log] [blame]
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -07001 /*
Jeff Brown25157e42012-04-16 12:13:05 -07002 * Copyright (C) 2012 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
17package android.hardware;
18
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -070019import android.content.Context;
Jeff Brown25157e42012-04-16 12:13:05 -070020import android.os.Handler;
Mathias Agopiandb772d82013-01-31 19:31:12 -080021import android.os.Looper;
22import android.os.MessageQueue;
Jaikumar Ganesh2e900892013-04-11 10:40:33 -070023import android.util.Log;
Jeff Brown25157e42012-04-16 12:13:05 -070024import android.util.SparseArray;
25import android.util.SparseBooleanArray;
26import android.util.SparseIntArray;
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -080027import dalvik.system.CloseGuard;
28
29import java.util.ArrayList;
30import java.util.HashMap;
31import java.util.List;
Jeff Brown25157e42012-04-16 12:13:05 -070032
Jeff Brown25157e42012-04-16 12:13:05 -070033/**
34 * Sensor manager implementation that communicates with the built-in
35 * system sensors.
36 *
37 * @hide
38 */
39public class SystemSensorManager extends SensorManager {
Mathias Agopiandb772d82013-01-31 19:31:12 -080040 private static native void nativeClassInit();
41 private static native int nativeGetNextSensor(Sensor sensor, int next);
Jeff Brown25157e42012-04-16 12:13:05 -070042
Mathias Agopiandb772d82013-01-31 19:31:12 -080043 private static boolean sSensorModuleInitialized = false;
44 private static final Object sSensorModuleLock = new Object();
45 private static final ArrayList<Sensor> sFullSensorsList = new ArrayList<Sensor>();
46 private static final SparseArray<Sensor> sHandleToSensor = new SparseArray<Sensor>();
47
48 // Listener list
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -080049 private final HashMap<SensorEventListener, SensorEventQueue> mSensorListeners =
50 new HashMap<SensorEventListener, SensorEventQueue>();
51 private final HashMap<TriggerEventListener, TriggerEventQueue> mTriggerListeners =
52 new HashMap<TriggerEventListener, TriggerEventQueue>();
Jeff Brown25157e42012-04-16 12:13:05 -070053
Jeff Brown4481d9c2012-04-16 16:14:44 -070054 // Looper associated with the context in which this instance was created.
Mathias Agopiandb772d82013-01-31 19:31:12 -080055 private final Looper mMainLooper;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -070056 private final int mTargetSdkLevel;
Jeff Brown25157e42012-04-16 12:13:05 -070057
Mathias Agopiandb772d82013-01-31 19:31:12 -080058 /** {@hide} */
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -070059 public SystemSensorManager(Context context, Looper mainLooper) {
Jeff Brown25157e42012-04-16 12:13:05 -070060 mMainLooper = mainLooper;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -070061 mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
Mathias Agopiandb772d82013-01-31 19:31:12 -080062 synchronized(sSensorModuleLock) {
Jeff Brown25157e42012-04-16 12:13:05 -070063 if (!sSensorModuleInitialized) {
64 sSensorModuleInitialized = true;
65
66 nativeClassInit();
67
68 // initialize the sensor list
Jeff Brown25157e42012-04-16 12:13:05 -070069 final ArrayList<Sensor> fullList = sFullSensorsList;
70 int i = 0;
71 do {
72 Sensor sensor = new Sensor();
Mathias Agopiandb772d82013-01-31 19:31:12 -080073 i = nativeGetNextSensor(sensor, i);
Jeff Brown25157e42012-04-16 12:13:05 -070074 if (i>=0) {
75 //Log.d(TAG, "found sensor: " + sensor.getName() +
76 // ", handle=" + sensor.getHandle());
77 fullList.add(sensor);
78 sHandleToSensor.append(sensor.getHandle(), sensor);
79 }
80 } while (i>0);
Jeff Brown25157e42012-04-16 12:13:05 -070081 }
82 }
83 }
84
Mathias Agopiandb772d82013-01-31 19:31:12 -080085
Jeff Brown25157e42012-04-16 12:13:05 -070086 /** @hide */
87 @Override
88 protected List<Sensor> getFullSensorList() {
89 return sFullSensorsList;
90 }
91
Jeff Brown25157e42012-04-16 12:13:05 -070092
93 /** @hide */
Jeff Brown4481d9c2012-04-16 16:14:44 -070094 @Override
Jeff Brown25157e42012-04-16 12:13:05 -070095 protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
Mathias Agopiandb772d82013-01-31 19:31:12 -080096 int delay, Handler handler)
97 {
98 // Invariants to preserve:
99 // - one Looper per SensorEventListener
100 // - one Looper per SensorEventQueue
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800101 // We map SensorEventListener to a SensorEventQueue, which holds the looper
102 if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
Mathias Agopiandb772d82013-01-31 19:31:12 -0800103
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800104 // Trigger Sensors should use the requestTriggerSensor call.
105 if (Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT) return false;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800106
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800107 synchronized (mSensorListeners) {
108 SensorEventQueue queue = mSensorListeners.get(listener);
109 if (queue == null) {
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700110 Looper looper = (handler != null) ? handler.getLooper() : mMainLooper;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700111 queue = new SensorEventQueue(listener, looper, this);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800112 if (!queue.addSensor(sensor, delay)) {
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700113 queue.dispose();
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800114 return false;
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700115 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800116 mSensorListeners.put(listener, queue);
117 return true;
118 } else {
119 return queue.addSensor(sensor, delay);
Jeff Brown25157e42012-04-16 12:13:05 -0700120 }
121 }
Jeff Brown25157e42012-04-16 12:13:05 -0700122 }
123
124 /** @hide */
125 @Override
126 protected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800127 // Trigger Sensors should use the cancelTriggerSensor call.
128 if (sensor != null && Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT) {
129 return;
130 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800131
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800132 synchronized (mSensorListeners) {
133 SensorEventQueue queue = mSensorListeners.get(listener);
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700134 if (queue != null) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800135 boolean result;
136 if (sensor == null) {
137 result = queue.removeAllSensors();
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700138 } else {
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700139 result = queue.removeSensor(sensor, true);
Jaikumar Ganesh1aab1db2013-03-13 15:00:21 -0700140 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800141 if (result && !queue.hasSensors()) {
142 mSensorListeners.remove(listener);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800143 queue.dispose();
Jeff Brown25157e42012-04-16 12:13:05 -0700144 }
145 }
146 }
147 }
148
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800149 /** @hide */
150 @Override
151 protected boolean requestTriggerSensorImpl(TriggerEventListener listener, Sensor sensor) {
152 if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
Jeff Brown25157e42012-04-16 12:13:05 -0700153
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800154 if (Sensor.getReportingMode(sensor) != Sensor.REPORTING_MODE_ONE_SHOT) return false;
155
156 synchronized (mTriggerListeners) {
157 TriggerEventQueue queue = mTriggerListeners.get(listener);
158 if (queue == null) {
159 queue = new TriggerEventQueue(listener, mMainLooper, this);
160 if (!queue.addSensor(sensor, 0)) {
161 queue.dispose();
162 return false;
163 }
164 mTriggerListeners.put(listener, queue);
165 return true;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800166 } else {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800167 return queue.addSensor(sensor, 0);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800168 }
169 }
170 }
Jeff Brown25157e42012-04-16 12:13:05 -0700171
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800172 /** @hide */
173 @Override
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700174 protected boolean cancelTriggerSensorImpl(TriggerEventListener listener, Sensor sensor,
175 boolean disable) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800176 if (sensor != null && Sensor.getReportingMode(sensor) != Sensor.REPORTING_MODE_ONE_SHOT) {
177 return false;
178 }
179 synchronized (mTriggerListeners) {
180 TriggerEventQueue queue = mTriggerListeners.get(listener);
181 if (queue != null) {
182 boolean result;
183 if (sensor == null) {
184 result = queue.removeAllSensors();
185 } else {
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700186 result = queue.removeSensor(sensor, disable);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800187 }
188 if (result && !queue.hasSensors()) {
189 mTriggerListeners.remove(listener);
190 queue.dispose();
191 }
192 return result;
193 }
194 return false;
195 }
196 }
197
Mathias Agopiandb772d82013-01-31 19:31:12 -0800198 /*
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800199 * BaseEventQueue is the communication channel with the sensor service,
200 * SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between
201 * the queues and the listeners.
Mathias Agopiandb772d82013-01-31 19:31:12 -0800202 */
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800203 private static abstract class BaseEventQueue {
204 private native int nativeInitBaseEventQueue(BaseEventQueue eventQ, MessageQueue msgQ,
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700205
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800206 float[] scratch);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800207 private static native int nativeEnableSensor(int eventQ, int handle, int us);
208 private static native int nativeDisableSensor(int eventQ, int handle);
209 private static native void nativeDestroySensorEventQueue(int eventQ);
210 private int nSensorEventQueue;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800211 private final SparseBooleanArray mActiveSensors = new SparseBooleanArray();
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800212 protected final SparseIntArray mSensorAccuracies = new SparseIntArray();
213 protected final SparseBooleanArray mFirstEvent = new SparseBooleanArray();
Mathias Agopiandb772d82013-01-31 19:31:12 -0800214 private final CloseGuard mCloseGuard = CloseGuard.get();
215 private final float[] mScratch = new float[16];
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700216 protected final SystemSensorManager mManager;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800217
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700218 BaseEventQueue(Looper looper, SystemSensorManager manager) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800219 nSensorEventQueue = nativeInitBaseEventQueue(this, looper.getQueue(), mScratch);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800220 mCloseGuard.open("dispose");
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700221 mManager = manager;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800222 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800223
Mathias Agopiandb772d82013-01-31 19:31:12 -0800224 public void dispose() {
225 dispose(false);
226 }
227
228 public boolean addSensor(Sensor sensor, int delay) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800229 // Check if already present.
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700230 int handle = sensor.getHandle();
231 if (mActiveSensors.get(handle)) return false;
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800232
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700233 // Get ready to receive events before calling enable.
234 mActiveSensors.put(handle, true);
235 addSensorEvent(sensor);
236 if (enableSensor(sensor, delay) != 0) {
237 removeSensor(sensor, false);
238 return false;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800239 }
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700240 return true;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800241 }
242
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800243 public boolean removeAllSensors() {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800244 for (int i=0 ; i<mActiveSensors.size(); i++) {
245 if (mActiveSensors.valueAt(i) == true) {
246 int handle = mActiveSensors.keyAt(i);
247 Sensor sensor = sHandleToSensor.get(handle);
248 if (sensor != null) {
249 disableSensor(sensor);
250 mActiveSensors.put(handle, false);
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700251 removeSensorEvent(sensor);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800252 } else {
253 // it should never happen -- just ignore.
254 }
255 }
256 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800257 return true;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800258 }
259
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700260 public boolean removeSensor(Sensor sensor, boolean disable) {
Mathias Agopiandb772d82013-01-31 19:31:12 -0800261 final int handle = sensor.getHandle();
262 if (mActiveSensors.get(handle)) {
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700263 if (disable) disableSensor(sensor);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800264 mActiveSensors.put(sensor.getHandle(), false);
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700265 removeSensorEvent(sensor);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800266 return true;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800267 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800268 return false;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800269 }
270
271 public boolean hasSensors() {
272 // no more sensors are set
273 return mActiveSensors.indexOfValue(true) >= 0;
274 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800275
Mathias Agopiandb772d82013-01-31 19:31:12 -0800276 @Override
277 protected void finalize() throws Throwable {
278 try {
279 dispose(true);
280 } finally {
281 super.finalize();
282 }
283 }
284
285 private void dispose(boolean finalized) {
286 if (mCloseGuard != null) {
287 if (finalized) {
288 mCloseGuard.warnIfOpen();
289 }
290 mCloseGuard.close();
291 }
292 if (nSensorEventQueue != 0) {
293 nativeDestroySensorEventQueue(nSensorEventQueue);
294 nSensorEventQueue = 0;
295 }
296 }
297
298 private int enableSensor(Sensor sensor, int us) {
299 if (nSensorEventQueue == 0) throw new NullPointerException();
300 if (sensor == null) throw new NullPointerException();
301 return nativeEnableSensor(nSensorEventQueue, sensor.getHandle(), us);
302 }
303 private int disableSensor(Sensor sensor) {
304 if (nSensorEventQueue == 0) throw new NullPointerException();
305 if (sensor == null) throw new NullPointerException();
306 return nativeDisableSensor(nSensorEventQueue, sensor.getHandle());
307 }
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800308 protected abstract void dispatchSensorEvent(int handle, float[] values, int accuracy,
309 long timestamp);
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700310
311 protected abstract void addSensorEvent(Sensor sensor);
312 protected abstract void removeSensorEvent(Sensor sensor);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800313 }
314
315 static final class SensorEventQueue extends BaseEventQueue {
316 private final SensorEventListener mListener;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700317 private final SparseArray<SensorEvent> mSensorsEvents = new SparseArray<SensorEvent>();
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800318
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700319 public SensorEventQueue(SensorEventListener listener, Looper looper,
320 SystemSensorManager manager) {
321 super(looper, manager);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800322 mListener = listener;
323 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800324
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700325 public void addSensorEvent(Sensor sensor) {
326 SensorEvent t = new SensorEvent(Sensor.getMaxLengthValuesArray(sensor,
327 mManager.mTargetSdkLevel));
328 mSensorsEvents.put(sensor.getHandle(), t);
329 }
330
331 public void removeSensorEvent(Sensor sensor) {
332 mSensorsEvents.delete(sensor.getHandle());
333 }
334
Mathias Agopiandb772d82013-01-31 19:31:12 -0800335 // Called from native code.
336 @SuppressWarnings("unused")
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800337 @Override
338 protected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,
339 long timestamp) {
340 final Sensor sensor = sHandleToSensor.get(handle);
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700341 SensorEvent t = mSensorsEvents.get(handle);
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700342 if (t == null) {
343 Log.e(TAG, "Error: Sensor Event is null for Sensor: " + sensor);
344 return;
345 }
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700346 // Copy from the values array.
347 System.arraycopy(values, 0, t.values, 0, t.values.length);
348 t.timestamp = timestamp;
349 t.accuracy = inAccuracy;
350 t.sensor = sensor;
351 switch (t.sensor.getType()) {
352 // Only report accuracy for sensors that support it.
353 case Sensor.TYPE_MAGNETIC_FIELD:
354 case Sensor.TYPE_ORIENTATION:
355 // call onAccuracyChanged() only if the value changes
356 final int accuracy = mSensorAccuracies.get(handle);
357 if ((t.accuracy >= 0) && (accuracy != t.accuracy)) {
358 mSensorAccuracies.put(handle, t.accuracy);
359 mListener.onAccuracyChanged(t.sensor, t.accuracy);
360 }
361 break;
362 default:
363 // For other sensors, just report the accuracy once
364 if (mFirstEvent.get(handle) == false) {
365 mFirstEvent.put(handle, true);
366 mListener.onAccuracyChanged(
367 t.sensor, SENSOR_STATUS_ACCURACY_HIGH);
368 }
369 break;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800370 }
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700371 mListener.onSensorChanged(t);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800372 }
373 }
374
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800375 static final class TriggerEventQueue extends BaseEventQueue {
376 private final TriggerEventListener mListener;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700377 private final SparseArray<TriggerEvent> mTriggerEvents = new SparseArray<TriggerEvent>();
Mathias Agopiandb772d82013-01-31 19:31:12 -0800378
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800379 public TriggerEventQueue(TriggerEventListener listener, Looper looper,
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700380 SystemSensorManager manager) {
381 super(looper, manager);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800382 mListener = listener;
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700383 }
384
385 public void addSensorEvent(Sensor sensor) {
386 TriggerEvent t = new TriggerEvent(Sensor.getMaxLengthValuesArray(sensor,
387 mManager.mTargetSdkLevel));
388 mTriggerEvents.put(sensor.getHandle(), t);
389 }
390
391 public void removeSensorEvent(Sensor sensor) {
392 mTriggerEvents.delete(sensor.getHandle());
Mathias Agopiandb772d82013-01-31 19:31:12 -0800393 }
394
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800395 // Called from native code.
396 @SuppressWarnings("unused")
397 @Override
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700398 protected void dispatchSensorEvent(int handle, float[] values, int accuracy,
399 long timestamp) {
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800400 final Sensor sensor = sHandleToSensor.get(handle);
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700401 TriggerEvent t = mTriggerEvents.get(handle);
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700402 if (t == null) {
403 Log.e(TAG, "Error: Trigger Event is null for Sensor: " + sensor);
404 return;
405 }
Mathias Agopiandb772d82013-01-31 19:31:12 -0800406
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700407 // Copy from the values array.
408 System.arraycopy(values, 0, t.values, 0, t.values.length);
409 t.timestamp = timestamp;
410 t.sensor = sensor;
Mathias Agopiandb772d82013-01-31 19:31:12 -0800411
Jaikumar Ganesh2e900892013-04-11 10:40:33 -0700412 // A trigger sensor is auto disabled. So just clean up and don't call native
413 // disable.
414 mManager.cancelTriggerSensorImpl(mListener, sensor, false);
Jaikumar Ganesh9a8df4d2013-02-12 16:31:32 -0800415
Jaikumar Ganesh6d0c1d782013-03-27 17:41:33 -0700416 mListener.onTrigger(t);
Mathias Agopiandb772d82013-01-31 19:31:12 -0800417 }
418 }
Jeff Brown25157e42012-04-16 12:13:05 -0700419}