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 19801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/SensorManager.h> 20801ea093b0e923a61b832f2adba698a273479880Mathias Agopian 21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h> 22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h> 23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 24e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#include <cutils/native_handle.h> 25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h> 26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/RefBase.h> 27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Singleton.h> 28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian#include <binder/IBinder.h> 3047f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#include <binder/IPermissionController.h> 31a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian#include <binder/IServiceManager.h> 32a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian 33801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorServer.h> 34801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorEventConnection.h> 35801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/Sensor.h> 36801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/SensorEventQueue.h> 37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 39589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android { 40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 41589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 42fe5476a3cc7323f2142c58333984fb98dec50376Peng XuMutex SensorManager::sLock; 43fe5476a3cc7323f2142c58333984fb98dec50376Peng Xustd::map<String16, SensorManager*> SensorManager::sPackageInstances; 44e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 45e2806cb4456e3815e979f333ed23ec7df591a9ffAravind AkellaSensorManager& SensorManager::getInstanceForPackage(const String16& packageName) { 46fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu waitForSensorService(nullptr); 47fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu 48e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella Mutex::Autolock _l(sLock); 49e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella SensorManager* sensorManager; 50fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu auto iterator = sPackageInstances.find(packageName); 51e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 52e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (iterator != sPackageInstances.end()) { 53e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sensorManager = iterator->second; 54e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 55e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella String16 opPackageName = packageName; 56e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 57e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // It is possible that the calling code has no access to the package name. 58e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // In this case we will get the packages for the calling UID and pick the 59e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // first one for attributing the app op. This will work correctly for 60e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // runtime permissions as for legacy apps we will toggle the app op for 61e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // all packages in the UID. The caveat is that the operation may be attributed 62e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // to the wrong package and stats based on app ops may be slightly off. 63e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (opPackageName.size() <= 0) { 64e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 65e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (binder != 0) { 66e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella const uid_t uid = IPCThreadState::self()->getCallingUid(); 67e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella Vector<String16> packages; 68e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); 69e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (!packages.isEmpty()) { 70e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella opPackageName = packages[0]; 71e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 72e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella ALOGE("No packages for calling UID"); 73e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 74e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } else { 75e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella ALOGE("Cannot get permission service"); 76e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 77e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 78e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 79e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sensorManager = new SensorManager(opPackageName); 80e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 81e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // If we had no package name, we looked it up from the UID and the sensor 82e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // manager instance we created should also be mapped to the empty package 83e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // name, to avoid looking up the packages for a UID and get the same result. 84e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella if (packageName.size() <= 0) { 85e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sPackageInstances.insert(std::make_pair(String16(), sensorManager)); 86e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 87e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 88e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella // Stash the per package sensor manager. 89e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); 90e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella } 91e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 92e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella return *sensorManager; 93e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella} 94e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella 95b412f6e203b38f8047f760261a5e3dc6d0722f08SvetoslavSensorManager::SensorManager(const String16& opPackageName) 96e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu : mSensorList(0), mOpPackageName(opPackageName), mDirectConnectionHandle(1) { 971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // okay we're not locked here, but it's not needed during construction 981a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian assertStateLocked(); 99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 100589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 1012576cb63b3fe1592f54816625036566b9eb0793aPeng XuSensorManager::~SensorManager() { 102a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian free(mSensorList); 103589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 104589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 105fe5476a3cc7323f2142c58333984fb98dec50376Peng Xustatus_t SensorManager::waitForSensorService(sp<ISensorServer> *server) { 106fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ... 107fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu sp<ISensorServer> s; 108fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu const String16 name("sensorservice"); 109fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu for (int i = 0; i < 60; i++) { 110fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu status_t err = getService(name, &s); 111fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu switch (err) { 112fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu case NAME_NOT_FOUND: 113fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu sleep(1); 114fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu continue; 115fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu case NO_ERROR: 116fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu if (server != nullptr) { 117fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu *server = s; 118fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu } 119fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu return NO_ERROR; 120fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu default: 121fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu return err; 122fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu } 123fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu } 124fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu return TIMED_OUT; 125fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu} 126fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu 1272576cb63b3fe1592f54816625036566b9eb0793aPeng Xuvoid SensorManager::sensorManagerDied() { 1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorServer.clear(); 1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian free(mSensorList); 1311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList = NULL; 1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensors.clear(); 1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1352576cb63b3fe1592f54816625036566b9eb0793aPeng Xustatus_t SensorManager::assertStateLocked() { 1368f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella bool initSensorManager = false; 1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (mSensorServer == NULL) { 1388f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1398f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } else { 1408f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella // Ping binder to check if sensorservice is alive. 1418f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella status_t err = IInterface::asBinder(mSensorServer)->pingBinder(); 1428f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (err != NO_ERROR) { 1438f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella initSensorManager = true; 1448f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1458f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella } 1468f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella if (initSensorManager) { 147fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu waitForSensorService(&mSensorServer); 148fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu LOG_ALWAYS_FATAL_IF(mSensorServer == nullptr, "getService(SensorService) NULL"); 1491a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1501a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian class DeathObserver : public IBinder::DeathRecipient { 1512576cb63b3fe1592f54816625036566b9eb0793aPeng Xu SensorManager& mSensorManager; 1521a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian virtual void binderDied(const wp<IBinder>& who) { 15332397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("sensorservice died [%p]", who.unsafe_get()); 1542576cb63b3fe1592f54816625036566b9eb0793aPeng Xu mSensorManager.sensorManagerDied(); 1551a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1561a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian public: 15768a593e7fa07c947fef2c5de53c42e14ed630a8aChih-Hung Hsieh explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { } 1581a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian }; 1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); 1612ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); 1621a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 163b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensors = mSensorServer->getSensorList(mOpPackageName); 1641a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian size_t count = mSensors.size(); 165d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza mSensorList = 166d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); 1678f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL"); 1688f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella 1691a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<count ; i++) { 1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian mSensorList[i] = mSensors.array() + i; 1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1721a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 1731a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1741a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return NO_ERROR; 1751a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian} 1761a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian 1772576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getSensorList(Sensor const* const** list) { 1781a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 1791a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian status_t err = assertStateLocked(); 1801a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (err < 0) { 181d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(err); 1821a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 183589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *list = mSensorList; 184d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza return static_cast<ssize_t>(mSensors.size()); 185589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 186589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 1872576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getDynamicSensorList(Vector<Sensor> & dynamicSensors) { 1882576cb63b3fe1592f54816625036566b9eb0793aPeng Xu Mutex::Autolock _l(mLock); 1892576cb63b3fe1592f54816625036566b9eb0793aPeng Xu status_t err = assertStateLocked(); 1902576cb63b3fe1592f54816625036566b9eb0793aPeng Xu if (err < 0) { 1912576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return static_cast<ssize_t>(err); 1922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu } 1932576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 1942576cb63b3fe1592f54816625036566b9eb0793aPeng Xu dynamicSensors = mSensorServer->getDynamicSensorList(mOpPackageName); 1952576cb63b3fe1592f54816625036566b9eb0793aPeng Xu size_t count = dynamicSensors.size(); 1962576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 1972576cb63b3fe1592f54816625036566b9eb0793aPeng Xu return static_cast<ssize_t>(count); 1982576cb63b3fe1592f54816625036566b9eb0793aPeng Xu} 1992576cb63b3fe1592f54816625036566b9eb0793aPeng Xu 200a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type) 201589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{ 2021a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 2031a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (assertStateLocked() == NO_ERROR) { 204b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella bool wakeUpSensor = false; 205b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // For the following sensor types, return a wake-up sensor. These types are by default 206b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return 207b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella // a non_wake-up version. 208b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION || 209b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE || 2105e7f79bf29e488ab589daf98b089697b8c767765Nick Vaccaro type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE || 2112e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro type == SENSOR_TYPE_WRIST_TILT_GESTURE || 2122e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro type == SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT) { 213b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella wakeUpSensor = true; 214b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 2151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // For now we just return the first sensor of that type we find. 2161a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // in the future it will make sense to let the SensorService make 2171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian // that decision. 2181a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian for (size_t i=0 ; i<mSensors.size() ; i++) { 219b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella if (mSensorList[i]->getType() == type && 220b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { 2211a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian return mSensorList[i]; 222b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella } 2231a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 224a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian } 225a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian return NULL; 226589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 227589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 228a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) { 229be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian sp<SensorEventQueue> queue; 230be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian 2311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian Mutex::Autolock _l(mLock); 2321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian while (assertStateLocked() == NO_ERROR) { 2331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian sp<ISensorEventConnection> connection = 234b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName); 2351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian if (connection == NULL) { 236a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella // SensorService just died or the app doesn't have required permissions. 237a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella ALOGE("createEventQueue: connection is NULL."); 238a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella return NULL; 2391a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian } 2401a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian queue = new SensorEventQueue(connection); 2411a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian break; 242be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian } 243be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian return queue; 244589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian} 245589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian 246841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() { 247a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella Mutex::Autolock _l(mLock); 248a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella if (assertStateLocked() == NO_ERROR) { 249841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return mSensorServer->isDataInjectionEnabled(); 250a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella } 251841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella return false; 252a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella} 253a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella 254e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint SensorManager::createDirectChannel( 255e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu size_t size, int channelType, const native_handle_t *resourceHandle) { 256e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mLock); 257e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (assertStateLocked() != NO_ERROR) { 258e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return NO_INIT; 259e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 260e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 261d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu if (channelType != SENSOR_DIRECT_MEM_TYPE_ASHMEM 262d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu && channelType != SENSOR_DIRECT_MEM_TYPE_GRALLOC) { 263d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu ALOGE("Bad channel shared memory type %d", channelType); 264d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu return BAD_VALUE; 265e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 266d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu 267d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu sp<ISensorEventConnection> conn = 268d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu mSensorServer->createSensorDirectConnection(mOpPackageName, 269d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu static_cast<uint32_t>(size), 270d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu static_cast<int32_t>(channelType), 271d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu SENSOR_DIRECT_FMT_SENSORS_EVENT, resourceHandle); 272d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu if (conn == nullptr) { 273d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu return NO_MEMORY; 274d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu } 275d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu 276d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu int nativeHandle = mDirectConnectionHandle++; 277d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu mDirectConnection.emplace(nativeHandle, conn); 278d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu return nativeHandle; 279e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 280e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 281e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorManager::destroyDirectChannel(int channelNativeHandle) { 282e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mLock); 283e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (assertStateLocked() == NO_ERROR) { 284e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mDirectConnection.erase(channelNativeHandle); 285e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 286e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 287e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 288e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint SensorManager::configureDirectChannel(int channelNativeHandle, int sensorHandle, int rateLevel) { 289e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mLock); 290e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (assertStateLocked() != NO_ERROR) { 291e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return NO_INIT; 292e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 293e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 294e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu auto i = mDirectConnection.find(channelNativeHandle); 295e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (i == mDirectConnection.end()) { 296e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ALOGE("Cannot find the handle in client direct connection table"); 297e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return BAD_VALUE; 298e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 299e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 300e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu int ret; 301e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ret = i->second->configureChannel(sensorHandle, rateLevel); 302e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ALOGE_IF(ret < 0, "SensorManager::configureChannel (%d, %d) returns %d", 303e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu static_cast<int>(sensorHandle), static_cast<int>(rateLevel), 304e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu static_cast<int>(ret)); 305e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return ret; 306e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 307e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 308dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xuint SensorManager::setOperationParameter( 30988711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov int handle, int type, 31088711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov const Vector<float> &floats, const Vector<int32_t> &ints) { 311dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu Mutex::Autolock _l(mLock); 312dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu if (assertStateLocked() != NO_ERROR) { 313dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu return NO_INIT; 314dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu } 31588711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov return mSensorServer->setOperationParameter(handle, type, floats, ints); 316dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu} 317dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu 318589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ---------------------------------------------------------------------------- 319589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android 320