SensorManager.cpp revision 8f35ca973063e1449c5ec40b618393187a47ec58
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 { 1138f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella bool initSensorManager = false; 1141a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (mSensorServer == NULL) { 1158f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1168f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } else { 1178f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella // Ping binder to check if sensorservice is alive. 1188f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella status_t err = IInterface::asBinder(mSensorServer)->pingBinder(); 1198f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (err != NO_ERROR) { 1208f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1218f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1228f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1238f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (initSensorManager) { 1248f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ... 1251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian const String16 name("sensorservice"); 1268f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella for (int i = 0; i < 60; i++) { 1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = getService(name, &mSensorServer); 1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err == NAME_NOT_FOUND) { 129e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sleep(1); 1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian continue; 1311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err != NO_ERROR) { 1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return err; 1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 1361a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1381a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian class DeathObserver : public IBinder::DeathRecipient { 1391a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian SensorManager& mSensorManger; 1401a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian virtual void binderDied(const wp<IBinder>& who) { 14132397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("sensorservice died [%p]", who.unsafe_get()); 1421a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorManger.sensorManagerDied(); 1431a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1441a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian public: 1451a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } 1461a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian }; 1471a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1488f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella LOG_ALWAYS_FATAL_IF(mSensorServer.get() == NULL, "getService(SensorService) NULL"); 149e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 1501a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); 1512ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); 1521a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 153b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensors = mSensorServer->getSensorList(mOpPackageName); 1541a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian size_t count = mSensors.size(); 155d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mSensorList = 156d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); 1578f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL"); 1588f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella 1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList[i] = mSensors.array() + i; 1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1621a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1641a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return NO_ERROR; 1651a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1661a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 167a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopianssize_t SensorManager::getSensorList(Sensor const* const** list) const 168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 1691a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = assertStateLocked(); 1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err < 0) { 172d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(err); 1731a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 174589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *list = mSensorList; 175d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(mSensors.size()); 176589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 177589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 178a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type) 179589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 1801a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1811a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (assertStateLocked() == NO_ERROR) { 182b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella bool wakeUpSensor = false; 183b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // For the following sensor types, return a wake-up sensor. These types are by default 184b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return 185b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // a non_wake-up version. 186b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION || 187b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE || 188b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE) { 189b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella wakeUpSensor = true; 190b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 1911a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // For now we just return the first sensor of that type we find. 1921a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // in the future it will make sense to let the SensorService make 1931a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // that decision. 1941a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<mSensors.size() ; i++) { 195b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (mSensorList[i]->getType() == type && 196b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { 1971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return mSensorList[i]; 198b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 1991a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 200a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian } 201a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian return NULL; 202589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 203589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 204a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) { 205be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian sp<SensorEventQueue> queue; 206be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian 2071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 2081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian while (assertStateLocked() == NO_ERROR) { 2091a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian sp<ISensorEventConnection> connection = 210b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName); 2111a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (connection == NULL) { 212a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // SensorService just died or the app doesn't have required permissions. 213a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella ALOGE("createEventQueue: connection is NULL."); 214a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella return NULL; 2151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 2161a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian queue = new SensorEventQueue(connection); 2171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 218be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian } 219be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian return queue; 220589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 221589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 222841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() { 223a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella Mutex::Autolock _l(mLock); 224a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella if (assertStateLocked() == NO_ERROR) { 225841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return mSensorServer->isDataInjectionEnabled(); 226a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella } 227841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return false; 228a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella} 229a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 230589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 231589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 232