SensorManager.cpp revision 2576cb63b3fe1592f54816625036566b9eb0793a
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) 922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu : mSensorList(0), mOpPackageName(opPackageName) { 931a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // okay we're not locked here, but it's not needed during construction 941a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian assertStateLocked(); 95589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 972576cb63b3fe1592f54816625036566b9eb0793aPeng XuSensorManager::~SensorManager() { 98a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian free(mSensorList); 99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 100589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 1012576cb63b3fe1592f54816625036566b9eb0793aPeng Xuvoid SensorManager::sensorManagerDied() { 1021a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1031a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorServer.clear(); 1041a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian free(mSensorList); 1051a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList = NULL; 1061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensors.clear(); 1071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1092576cb63b3fe1592f54816625036566b9eb0793aPeng Xustatus_t SensorManager::assertStateLocked() { 1108f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella bool initSensorManager = false; 1111a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (mSensorServer == NULL) { 1128f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1138f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } else { 1148f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella // Ping binder to check if sensorservice is alive. 1158f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella status_t err = IInterface::asBinder(mSensorServer)->pingBinder(); 1168f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (err != NO_ERROR) { 1178f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1188f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1198f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1208f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (initSensorManager) { 1218f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ... 1221a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian const String16 name("sensorservice"); 1238f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella for (int i = 0; i < 60; i++) { 1241a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = getService(name, &mSensorServer); 1251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err == NAME_NOT_FOUND) { 126e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sleep(1); 1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian continue; 1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err != NO_ERROR) { 1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return err; 1311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian class DeathObserver : public IBinder::DeathRecipient { 1362576cb63b3fe1592f54816625036566b9eb0793aPeng Xu SensorManager& mSensorManager; 1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian virtual void binderDied(const wp<IBinder>& who) { 13832397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("sensorservice died [%p]", who.unsafe_get()); 1392576cb63b3fe1592f54816625036566b9eb0793aPeng Xu mSensorManager.sensorManagerDied(); 1401a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1411a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian public: 1422576cb63b3fe1592f54816625036566b9eb0793aPeng Xu DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { } 1431a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian }; 1441a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1458f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella LOG_ALWAYS_FATAL_IF(mSensorServer.get() == NULL, "getService(SensorService) NULL"); 146e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 1471a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); 1482ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); 1491a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 150b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensors = mSensorServer->getSensorList(mOpPackageName); 1511a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian size_t count = mSensors.size(); 152d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mSensorList = 153d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); 1548f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL"); 1558f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella 1561a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1571a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList[i] = mSensors.array() + i; 1581a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return NO_ERROR; 1621a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1642576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getSensorList(Sensor const* const** list) { 1651a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1661a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = assertStateLocked(); 1671a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err < 0) { 168d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(err); 1691a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 170589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *list = mSensorList; 171d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(mSensors.size()); 172589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 173589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 1742576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getDynamicSensorList(Vector<Sensor> & dynamicSensors) { 1752576cb63b3fe1592f54816625036566b9eb0793aPeng Xu Mutex::Autolock _l(mLock); 1762576cb63b3fe1592f54816625036566b9eb0793aPeng Xu status_t err = assertStateLocked(); 1772576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (err < 0) { 1782576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return static_cast<ssize_t>(err); 1792576cb63b3fe1592f54816625036566b9eb0793aPeng Xu } 1802576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 1812576cb63b3fe1592f54816625036566b9eb0793aPeng Xu dynamicSensors = mSensorServer->getDynamicSensorList(mOpPackageName); 1822576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t count = dynamicSensors.size(); 1832576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 1842576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return static_cast<ssize_t>(count); 1852576cb63b3fe1592f54816625036566b9eb0793aPeng Xu} 1862576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 187a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type) 188589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 1891a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1901a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (assertStateLocked() == NO_ERROR) { 191b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella bool wakeUpSensor = false; 192b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // For the following sensor types, return a wake-up sensor. These types are by default 193b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return 194b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // a non_wake-up version. 195b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION || 196b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE || 197b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE) { 198b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella wakeUpSensor = true; 199b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 2001a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // For now we just return the first sensor of that type we find. 2011a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // in the future it will make sense to let the SensorService make 2021a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // that decision. 2031a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<mSensors.size() ; i++) { 204b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (mSensorList[i]->getType() == type && 205b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { 2061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return mSensorList[i]; 207b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 2081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 209a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian } 210a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian return NULL; 211589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 212589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 213a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) { 214be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian sp<SensorEventQueue> queue; 215be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian 2161a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 2171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian while (assertStateLocked() == NO_ERROR) { 2181a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian sp<ISensorEventConnection> connection = 219b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName); 2201a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (connection == NULL) { 221a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // SensorService just died or the app doesn't have required permissions. 222a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella ALOGE("createEventQueue: connection is NULL."); 223a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella return NULL; 2241a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 2251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian queue = new SensorEventQueue(connection); 2261a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 227be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian } 228be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian return queue; 229589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 230589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 231841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() { 232a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella Mutex::Autolock _l(mLock); 233a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella if (assertStateLocked() == NO_ERROR) { 234841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return mSensorServer->isDataInjectionEnabled(); 235a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella } 236841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return false; 237a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella} 238a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 239589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 240589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 241