1fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/* 2fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Copyright (C) 2010 The Android Open Source Project 3fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 4fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * you may not use this file except in compliance with the License. 6fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * You may obtain a copy of the License at 7fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 8fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 10fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * See the License for the specific language governing permissions and 14fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * limitations under the License. 15fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */ 16fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 17fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#ifndef ANDROID_SENSOR_SERVICE_H 18fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#define ANDROID_SENSOR_SERVICE_H 19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 20755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include "SensorList.h" 216a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include "RecentEventLogger.h" 22fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <binder/BinderService.h> 24755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <cutils/compiler.h> 25fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorServer.h> 26fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/ISensorEventConnection.h> 27755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <gui/Sensor.h> 28fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 29755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/AndroidThreads.h> 30755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/KeyedVector.h> 31755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/Looper.h> 32755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/SortedVector.h> 33755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/String8.h> 34755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/Vector.h> 35755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <utils/threads.h> 36755c451c7861a029e26e5f16e319b629169e656dPeng Xu 37755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <stdint.h> 38755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <sys/types.h> 396a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <unordered_map> 40755c451c7861a029e26e5f16e319b629169e656dPeng Xu#include <unordered_set> 41f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian 4272952efe5ce8ee10e3c591cc6d2a3475b7b91690Bernhard Rosenkränzer#if __clang__ 43eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu// Clang warns about SensorEventConnection::dump hiding BBinder::dump. The cause isn't fixable 44eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu// without changing the API, so let's tell clang this is indeed intentional. 4572952efe5ce8ee10e3c591cc6d2a3475b7b91690Bernhard Rosenkränzer#pragma clang diagnostic ignored "-Woverloaded-virtual" 4672952efe5ce8ee10e3c591cc6d2a3475b7b91690Bernhard Rosenkränzer#endif 4772952efe5ce8ee10e3c591cc6d2a3475b7b91690Bernhard Rosenkränzer 48fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 49f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu#define IGNORE_HARDWARE_FUSION false 50a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian#define DEBUG_CONNECTIONS false 5156ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella// Max size is 100 KB which is enough to accept a batch of about 1000 events. 5256ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella#define MAX_SOCKET_BUFFER_SIZE_BATCHED 100 * 1024 5356ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella// For older HALs which don't support batching, use a smaller socket buffer size. 544c8b951f8d6a121e758bd3905fa8987c77863790Aravind Akella#define SOCKET_BUFFER_SIZE_NON_BATCHED 4 * 1024 55a1b7db95b6ccf5be9d8dfaac1b8f45494813edc0Mathias Agopian 5618d6d51a00897988e3347b130f533e9ffdd8c365Aravind Akella#define SENSOR_REGISTRATIONS_BUF_SIZE 20 57444f2675728dde36378beb8e67a94f86ebf1ca46Aravind Akella 58fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopiannamespace android { 59fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian// --------------------------------------------------------------------------- 60755c451c7861a029e26e5f16e319b629169e656dPeng Xuclass SensorInterface; 616a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xuusing namespace SensorServiceUtil; 62fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 63fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianclass SensorService : 64fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian public BinderService<SensorService>, 65fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian public BnSensorServer, 66fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian protected Thread 67fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 68eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // nested class/struct for internal use 69eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu class SensorEventConnection; 70eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 71eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xupublic: 72eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu void cleanupConnection(SensorEventConnection* connection); 73eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 74eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t enable(const sp<SensorEventConnection>& connection, int handle, 75eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu nsecs_t samplingPeriodNs, nsecs_t maxBatchReportLatencyNs, int reservedFlags, 76eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu const String16& opPackageName); 77eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 78eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t disable(const sp<SensorEventConnection>& connection, int handle); 79eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 80eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns, 81eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu const String16& opPackageName); 82eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 83eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t flushSensor(const sp<SensorEventConnection>& connection, 84eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu const String16& opPackageName); 85eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 86eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xuprivate: 87b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian friend class BinderService<SensorService>; 88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 89eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // nested class/struct for internal use 90eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu class SensorRecord; 91eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu class SensorEventAckReceiver; 92eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu struct SensorRegistrationInfo; 93eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 944949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella enum Mode { 954949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // The regular operating mode where any application can register/unregister/call flush on 964949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // sensors. 974949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella NORMAL = 0, 98eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // This mode is only used for testing purposes. Not all HALs support this mode. In this mode, 99eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // the HAL ignores the sensor data provided by physical sensors and accepts the data that is 100eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // injected from the SensorService as if it were the real sensor data. This mode is primarily 101eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // used for testing various algorithms like vendor provided SensorFusion, Step Counter and 102eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // Step Detector etc. Typically in this mode, there will be a client (a 103eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // SensorEventConnection) which will be injecting sensor data into the HAL. Normal apps can 104eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // unregister and register for any sensor that supports injection. Registering to sensors 105eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // that do not support injection will give an error. TODO(aakella) : Allow exactly one 106eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // client to inject sensor data at a time. 107a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella DATA_INJECTION = 1, 1084949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // This mode is used only for testing sensors. Each sensor can be tested in isolation with 1094949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // the required sampling_rate and maxReportLatency parameters without having to think about 1104949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // the data rates requested by other applications. End user devices are always expected to be 1114949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // in NORMAL mode. When this mode is first activated, all active sensors from all connections 1124949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // are disabled. Calling flush() will return an error. In this mode, only the requests from 1134949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // selected apps whose package names are whitelisted are allowed (typically CTS apps). Only 114a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // these apps can register/unregister/call flush() on sensors. If SensorService switches to 1154949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // NORMAL mode again, all sensors that were previously registered to are activated with the 1164949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // corresponding paramaters if the application hasn't unregistered for sensors in the mean 117eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // time. NOTE: Non whitelisted app whose sensors were previously deactivated may still 118eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // receive events if a whitelisted app requests data from the same sensor. 119a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella RESTRICTED = 2 120a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 121a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // State Transitions supported. 122a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // RESTRICTED <--- NORMAL ---> DATA_INJECTION 123a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // ---> <--- 1245c538053346107a8ec704d8769059ab6a23ebeefAravind Akella 1255c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // Shell commands to switch modes in SensorService. 1265c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // 1) Put SensorService in RESTRICTED mode with packageName .cts. If it is already in 1275c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // restricted mode it is treated as a NO_OP (and packageName is NOT changed). 128eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // 129eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // $ adb shell dumpsys sensorservice restrict .cts. 1305c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // 1315c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // 2) Put SensorService in DATA_INJECTION mode with packageName .xts. If it is already in 1325c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // data_injection mode it is treated as a NO_OP (and packageName is NOT changed). 133eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // 134eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // $ adb shell dumpsys sensorservice data_injection .xts. 1355c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // 1365c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // 3) Reset sensorservice back to NORMAL mode. 137eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // $ adb shell dumpsys sensorservice enable 1384949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella }; 1394949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella 140b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian static const char* WAKE_LOCK_NAME; 141b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian static char const* getServiceName() ANDROID_API { return "sensorservice"; } 142b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian SensorService() ANDROID_API; 143fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian virtual ~SensorService(); 144fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 145fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian virtual void onFirstRef(); 146fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 147fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // Thread interface 148fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian virtual bool threadLoop(); 149fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 150fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // ISensorServer interface 151b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav virtual Vector<Sensor> getSensorList(const String16& opPackageName); 1522576cb63b3fe1592f54816625036566b9eb0793aPeng Xu virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName); 153eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu virtual sp<ISensorEventConnection> createSensorEventConnection( 154eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu const String8& packageName, 155eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu int requestedMode, const String16& opPackageName); 1565c538053346107a8ec704d8769059ab6a23ebeefAravind Akella virtual int isDataInjectionEnabled(); 157fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian virtual status_t dump(int fd, const Vector<String16>& args); 158fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 159f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian String8 getSensorName(int handle) const; 160b4099e77ec2bf8e9d4259ff30f0cb1d621deed91Aravind Akella bool isVirtualSensor(int handle) const; 161755c451c7861a029e26e5f16e319b629169e656dPeng Xu sp<SensorInterface> getSensorInterfaceFromHandle(int handle) const; 1629a844cf78f09953145200b4074d47589257a408cAravind Akella bool isWakeUpSensor(int type) const; 1630ec2066e4774b851c66176b99b0a5aa5abe6ad00Aravind Akella void recordLastValueLocked(sensors_event_t const* buffer, size_t count); 164f001c92436b4a66eb7687286325ced7f10c9f917Mathias Agopian static void sortEventBuffer(sensors_event_t* buffer, size_t count); 1650cc8f809924706c7d683da30605f432635dd5bb6Peng Xu const Sensor& registerSensor(SensorInterface* sensor, 1660cc8f809924706c7d683da30605f432635dd5bb6Peng Xu bool isDebug = false, bool isVirtual = false); 1670cc8f809924706c7d683da30605f432635dd5bb6Peng Xu const Sensor& registerVirtualSensor(SensorInterface* sensor, bool isDebug = false); 1686a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu const Sensor& registerDynamicSensorLocked(SensorInterface* sensor, bool isDebug = false); 1696a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu bool unregisterDynamicSensorLocked(int handle); 170eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t cleanupWithoutDisable(const sp<SensorEventConnection>& connection, int handle); 171eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu status_t cleanupWithoutDisableLocked(const sp<SensorEventConnection>& connection, int handle); 1729a844cf78f09953145200b4074d47589257a408cAravind Akella void cleanupAutoDisabledSensorLocked(const sp<SensorEventConnection>& connection, 173b6df7d0e4c2117ca476662bd52b6745b3d8a305fMathias Agopian sensors_event_t const* buffer, const int count); 174b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav static bool canAccessSensor(const Sensor& sensor, const char* operation, 175b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav const String16& opPackageName); 1769a844cf78f09953145200b4074d47589257a408cAravind Akella // SensorService acquires a partial wakelock for delivering events from wake up sensors. This 1779a844cf78f09953145200b4074d47589257a408cAravind Akella // method checks whether all the events from these wake up sensors have been delivered to the 1789a844cf78f09953145200b4074d47589257a408cAravind Akella // corresponding applications, if yes the wakelock is released. 1799a844cf78f09953145200b4074d47589257a408cAravind Akella void checkWakeLockState(); 1809a844cf78f09953145200b4074d47589257a408cAravind Akella void checkWakeLockStateLocked(); 181b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella bool isWakeLockAcquired(); 1829a844cf78f09953145200b4074d47589257a408cAravind Akella bool isWakeUpSensorEvent(const sensors_event_t& event) const; 18356ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella 18456ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella sp<Looper> getLooper() const; 18556ae42613c91f6a6fb0dc3f626daa24666fd18c2Aravind Akella 186b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // Reset mWakeLockRefCounts for all SensorEventConnections to zero. This may happen if 187b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // SensorService did not receive any acknowledgements from apps which have registered for 188b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // wake_up sensors. 189b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella void resetAllWakeLockRefCounts(); 190b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella 191eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // Acquire or release wake_lock. If wake_lock is acquired, set the timeout in the looper to 5 192eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu // seconds and wake the looper. 193b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella void setWakeLockAcquiredLocked(bool acquire); 194b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella 195b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // Send events from the event cache for this particular connection. 196b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella void sendEventsFromCache(const sp<SensorEventConnection>& connection); 197b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella 198b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // Promote all weak referecences in mActiveConnections vector to strong references and add them 199b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella // to the output vector. 200eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu void populateActiveConnections( SortedVector< sp<SensorEventConnection> >* activeConnections); 201b4373ac9f53e3a6edee915715101d535e1a851a1Aravind Akella 2024949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // If SensorService is operating in RESTRICTED mode, only select whitelisted packages are 2034949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // allowed to register for or call flush on sensors. Typically only cts test packages are 2044949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella // allowed. 2054949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella bool isWhiteListedPackage(const String8& packageName); 2064949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella 207a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // Reset the state of SensorService to NORMAL mode. 208a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella status_t resetToNormalMode(); 209a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella status_t resetToNormalModeLocked(); 210a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 21153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // Transforms the UUIDs for all the sensors into proper IDs. 21253ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser void makeUuidsIntoIdsForSensorList(Vector<Sensor> &sensorList) const; 21353ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // Gets the appropriate ID from the given UUID. 21453ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser int32_t getIdFromUuid(const Sensor::uuid_t &uuid) const; 21553ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser // Either read from storage or create a new one. 21653ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser static bool initializeHmacKey(); 21753ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 21853ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 21953ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser static uint8_t sHmacGlobalKey[128]; 22053ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser static bool sHmacGlobalKeyIsValid; 22153ca2e00c6f2a71b93c8e3c8e85aeeb03c5bd06dGreg Kaiser 2226a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu SensorList mSensors; 22350df2959e58fc7408f98d11d77c8428397dca445Mathias Agopian status_t mInitCheck; 224eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 2255466c3d20d03d4ae4b0fd0e0a93175091e3b0bb2Aravind Akella // Socket buffersize used to initialize BitTube. This size depends on whether batching is 2265466c3d20d03d4ae4b0fd0e0a93175091e3b0bb2Aravind Akella // supported or not. 227755c451c7861a029e26e5f16e319b629169e656dPeng Xu uint32_t mSocketBufferSize; 228755c451c7861a029e26e5f16e319b629169e656dPeng Xu sp<Looper> mLooper; 229755c451c7861a029e26e5f16e319b629169e656dPeng Xu sp<SensorEventAckReceiver> mAckReceiver; 230fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 231fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian // protected by mLock 232fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian mutable Mutex mLock; 233fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian DefaultKeyedVector<int, SensorRecord*> mActiveSensors; 234755c451c7861a029e26e5f16e319b629169e656dPeng Xu std::unordered_set<int> mActiveVirtualSensors; 235fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SortedVector< wp<SensorEventConnection> > mActiveConnections; 2369a844cf78f09953145200b4074d47589257a408cAravind Akella bool mWakeLockAcquired; 2378493b79e1cff92450076ca7450c4bf4e434a6816Aravind Akella sensors_event_t *mSensorEventBuffer, *mSensorEventScratch; 2388493b79e1cff92450076ca7450c4bf4e434a6816Aravind Akella SensorEventConnection const **mMapFlushEventsToConnections; 2396a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu std::unordered_map<int, RecentEventLogger*> mRecentEvent; 240a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella Mode mCurrentOperatingMode; 241eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu 2425c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // This packagaName is set when SensorService is in RESTRICTED or DATA_INJECTION mode. Only 2435c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // applications with this packageName are allowed to activate/deactivate or call flush on 2445c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // sensors. To run CTS this is can be set to ".cts." and only CTS tests will get access to 2455c538053346107a8ec704d8769059ab6a23ebeefAravind Akella // sensors. 2465c538053346107a8ec704d8769059ab6a23ebeefAravind Akella String8 mWhiteListedPackage; 2478493b79e1cff92450076ca7450c4bf4e434a6816Aravind Akella 24818d6d51a00897988e3347b130f533e9ffdd8c365Aravind Akella int mNextSensorRegIndex; 24918d6d51a00897988e3347b130f533e9ffdd8c365Aravind Akella Vector<SensorRegistrationInfo> mLastNSensorRegistrations; 250fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian}; 251fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 252eb4d628b69831d533f14c09fd63400f75e69ba76Peng Xu} // namespace android 253fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#endif // ANDROID_SENSOR_SERVICE_H 254