SensorManager.cpp revision e2806cb4456e3815e979f333ed23ec7df591a9ff
1589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian/* 2589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Copyright (C) 2010 The Android Open Source Project 3589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 4589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * you may not use this file except in compliance with the License. 6589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * You may obtain a copy of the License at 7589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 8589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * 10589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Unless required by applicable law or agreed to in writing, software 11589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * See the License for the specific language governing permissions and 14589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * limitations under the License. 15589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian */ 16589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 17a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian#define LOG_TAG "Sensors" 18a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h> 20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h> 21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h> 23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/RefBase.h> 24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Singleton.h> 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 261a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian#include <binder/IBinder.h> 27a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian#include <binder/IServiceManager.h> 28a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 29589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/ISensorServer.h> 30589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/ISensorEventConnection.h> 31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/Sensor.h> 32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/SensorManager.h> 33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/SensorEventQueue.h> 34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 39e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akellaandroid::Mutex android::SensorManager::sLock; 40e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akellastd::map<String16, SensorManager*> android::SensorManager::sPackageInstances; 41e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 42e2806cb4456e3815e979f333ed23ec7df591a9ffAravind AkellaSensorManager& SensorManager::getInstanceForPackage(const String16& packageName) { 43e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella Mutex::Autolock _l(sLock); 44e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella SensorManager* sensorManager; 45e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella std::map<String16, SensorManager*>::iterator iterator = 46e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sPackageInstances.find(packageName); 47e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 48e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (iterator != sPackageInstances.end()) { 49e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sensorManager = iterator->second; 50e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 51e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella String16 opPackageName = packageName; 52e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 53e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // It is possible that the calling code has no access to the package name. 54e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // In this case we will get the packages for the calling UID and pick the 55e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // first one for attributing the app op. This will work correctly for 56e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // runtime permissions as for legacy apps we will toggle the app op for 57e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // all packages in the UID. The caveat is that the operation may be attributed 58e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // to the wrong package and stats based on app ops may be slightly off. 59e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (opPackageName.size() <= 0) { 60e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 61e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (binder != 0) { 62e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella const uid_t uid = IPCThreadState::self()->getCallingUid(); 63e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella Vector<String16> packages; 64e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); 65e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (!packages.isEmpty()) { 66e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella opPackageName = packages[0]; 67e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 68e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella ALOGE("No packages for calling UID"); 69e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 70e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 71e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella ALOGE("Cannot get permission service"); 72e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 73e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 74e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 75e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sensorManager = new SensorManager(opPackageName); 76e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 77e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // If we had no package name, we looked it up from the UID and the sensor 78e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // manager instance we created should also be mapped to the empty package 79e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // name, to avoid looking up the packages for a UID and get the same result. 80e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (packageName.size() <= 0) { 81e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sPackageInstances.insert(std::make_pair(String16(), sensorManager)); 82e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 83e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 84e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // Stash the per package sensor manager. 85e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); 86e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 87e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 88e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella return *sensorManager; 89e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella} 90e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 91b412f6e203b38f8047f760261a5e3dc6d0722f08SvetoslavSensorManager::SensorManager(const String16& opPackageName) 92b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav : mSensorList(0), mOpPackageName(opPackageName) 93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 941a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // okay we're not locked here, but it's not needed during construction 951a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian assertStateLocked(); 96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 97589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 98589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensorManager::~SensorManager() 99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 100a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian free(mSensorList); 101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 1031a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopianvoid SensorManager::sensorManagerDied() 1041a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian{ 1051a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorServer.clear(); 1071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian free(mSensorList); 1081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList = NULL; 1091a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensors.clear(); 1101a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1111a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1121a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopianstatus_t SensorManager::assertStateLocked() const { 1131a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (mSensorServer == NULL) { 114e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // try for 10 seconds before giving up ... 1151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian const String16 name("sensorservice"); 116e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella for (int i = 0;i < 10; i++) { 1171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = getService(name, &mSensorServer); 1181a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err == NAME_NOT_FOUND) { 119e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sleep(1); 1201a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian continue; 1211a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1221a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err != NO_ERROR) { 1231a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return err; 1241a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 1261a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian class DeathObserver : public IBinder::DeathRecipient { 1291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian SensorManager& mSensorManger; 1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian virtual void binderDied(const wp<IBinder>& who) { 13132397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("sensorservice died [%p]", who.unsafe_get()); 1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorManger.sensorManagerDied(); 1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian public: 1351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } 1361a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian }; 1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 138e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (mSensorServer == NULL) { 139e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella ALOGE("FATAL getsensorservice returned NULL"); 140e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 141e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 1421a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); 1432ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); 1441a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 145b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensors = mSensorServer->getSensorList(mOpPackageName); 1461a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian size_t count = mSensors.size(); 147d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mSensorList = 148d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); 1491a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1501a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList[i] = mSensors.array() + i; 1511a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1521a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1531a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1541a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return NO_ERROR; 1551a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1561a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 157a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopianssize_t SensorManager::getSensorList(Sensor const* const** list) const 158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = assertStateLocked(); 1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err < 0) { 162d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(err); 1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 164589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *list = mSensorList; 165d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(mSensors.size()); 166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 167589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 168a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type) 169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (assertStateLocked() == NO_ERROR) { 172b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella bool wakeUpSensor = false; 173b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // For the following sensor types, return a wake-up sensor. These types are by default 174b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return 175b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // a non_wake-up version. 176b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION || 177b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE || 178b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE) { 179b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella wakeUpSensor = true; 180b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 1811a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // For now we just return the first sensor of that type we find. 1821a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // in the future it will make sense to let the SensorService make 1831a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // that decision. 1841a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<mSensors.size() ; i++) { 185b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (mSensorList[i]->getType() == type && 186b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { 1871a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return mSensorList[i]; 188b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 1891a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 190a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian } 191a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian return NULL; 192589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 193589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 194a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) { 195be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian sp<SensorEventQueue> queue; 196be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian 1971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1981a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian while (assertStateLocked() == NO_ERROR) { 1991a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian sp<ISensorEventConnection> connection = 200b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName); 2011a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (connection == NULL) { 202a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // SensorService just died or the app doesn't have required permissions. 203a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella ALOGE("createEventQueue: connection is NULL."); 204a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella return NULL; 2051a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 2061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian queue = new SensorEventQueue(connection); 2071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 208be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian } 209be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian return queue; 210589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 211589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 212841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() { 213a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella Mutex::Autolock _l(mLock); 214a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella if (assertStateLocked() == NO_ERROR) { 215841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return mSensorServer->isDataInjectionEnabled(); 216a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella } 217841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return false; 218a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella} 219a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 220589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 221589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 222