SensorManager.cpp revision dd5c5cb3b8f3df9b458dff74e247b9a542befee7
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>
30a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian#include <binder/IServiceManager.h>
31a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian
32801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorServer.h>
33801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorEventConnection.h>
34801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/Sensor.h>
35801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/SensorEventQueue.h>
36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android {
39589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
41fe5476a3cc7323f2142c58333984fb98dec50376Peng XuMutex SensorManager::sLock;
42fe5476a3cc7323f2142c58333984fb98dec50376Peng Xustd::map<String16, SensorManager*> SensorManager::sPackageInstances;
43e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
44e2806cb4456e3815e979f333ed23ec7df591a9ffAravind AkellaSensorManager& SensorManager::getInstanceForPackage(const String16& packageName) {
45fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    waitForSensorService(nullptr);
46fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu
47e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    Mutex::Autolock _l(sLock);
48e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    SensorManager* sensorManager;
49fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    auto iterator = sPackageInstances.find(packageName);
50e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
51e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    if (iterator != sPackageInstances.end()) {
52e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        sensorManager = iterator->second;
53e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    } else {
54e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        String16 opPackageName = packageName;
55e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
56e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // It is possible that the calling code has no access to the package name.
57e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // In this case we will get the packages for the calling UID and pick the
58e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // first one for attributing the app op. This will work correctly for
59e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // runtime permissions as for legacy apps we will toggle the app op for
60e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // all packages in the UID. The caveat is that the operation may be attributed
61e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // to the wrong package and stats based on app ops may be slightly off.
62e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        if (opPackageName.size() <= 0) {
63e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            sp<IBinder> binder = defaultServiceManager()->getService(String16("permission"));
64e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            if (binder != 0) {
65e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                const uid_t uid = IPCThreadState::self()->getCallingUid();
66e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                Vector<String16> packages;
67e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages);
68e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                if (!packages.isEmpty()) {
69e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                    opPackageName = packages[0];
70e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                } else {
71e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                    ALOGE("No packages for calling UID");
72e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                }
73e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            } else {
74e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                ALOGE("Cannot get permission service");
75e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            }
76e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        }
77e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
78e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        sensorManager = new SensorManager(opPackageName);
79e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
80e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // If we had no package name, we looked it up from the UID and the sensor
81e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // manager instance we created should also be mapped to the empty package
82e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // name, to avoid looking up the packages for a UID and get the same result.
83e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        if (packageName.size() <= 0) {
84e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            sPackageInstances.insert(std::make_pair(String16(), sensorManager));
85e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        }
86e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
87e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // Stash the per package sensor manager.
88e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        sPackageInstances.insert(std::make_pair(opPackageName, sensorManager));
89e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    }
90e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
91e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella    return *sensorManager;
92e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella}
93e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
94b412f6e203b38f8047f760261a5e3dc6d0722f08SvetoslavSensorManager::SensorManager(const String16& opPackageName)
95e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    : mSensorList(0), mOpPackageName(opPackageName), mDirectConnectionHandle(1) {
961a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    // okay we're not locked here, but it's not needed during construction
971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    assertStateLocked();
98589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
1002576cb63b3fe1592f54816625036566b9eb0793aPeng XuSensorManager::~SensorManager() {
101a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    free(mSensorList);
102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
103589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
104fe5476a3cc7323f2142c58333984fb98dec50376Peng Xustatus_t SensorManager::waitForSensorService(sp<ISensorServer> *server) {
105fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ...
106fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    sp<ISensorServer> s;
107fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    const String16 name("sensorservice");
108fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    for (int i = 0; i < 60; i++) {
109fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu        status_t err = getService(name, &s);
110fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu        switch (err) {
111fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu            case NAME_NOT_FOUND:
112fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                sleep(1);
113fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                continue;
114fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu            case NO_ERROR:
115fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                if (server != nullptr) {
116fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                    *server = s;
117fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                }
118fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                return NO_ERROR;
119fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu            default:
120fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu                return err;
121fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu        }
122fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    }
123fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu    return TIMED_OUT;
124fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu}
125fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu
1262576cb63b3fe1592f54816625036566b9eb0793aPeng Xuvoid SensorManager::sensorManagerDied() {
1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensorServer.clear();
1291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    free(mSensorList);
1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensorList = NULL;
1311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensors.clear();
1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian}
1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1342576cb63b3fe1592f54816625036566b9eb0793aPeng Xustatus_t SensorManager::assertStateLocked() {
1358f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    bool initSensorManager = false;
1361a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (mSensorServer == NULL) {
1378f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        initSensorManager = true;
1388f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    } else {
1398f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        // Ping binder to check if sensorservice is alive.
1408f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        status_t err = IInterface::asBinder(mSensorServer)->pingBinder();
1418f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        if (err != NO_ERROR) {
1428f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella            initSensorManager = true;
1438f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        }
1448f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    }
1458f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    if (initSensorManager) {
146fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu        waitForSensorService(&mSensorServer);
147fe5476a3cc7323f2142c58333984fb98dec50376Peng Xu        LOG_ALWAYS_FATAL_IF(mSensorServer == nullptr, "getService(SensorService) NULL");
1481a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1491a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        class DeathObserver : public IBinder::DeathRecipient {
1502576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            SensorManager& mSensorManager;
1511a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            virtual void binderDied(const wp<IBinder>& who) {
15232397c1cd3327905173b36baa6fd1c579bc328ffSteve Block                ALOGW("sensorservice died [%p]", who.unsafe_get());
1532576cb63b3fe1592f54816625036566b9eb0793aPeng Xu                mSensorManager.sensorManagerDied();
1541a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1551a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        public:
15668a593e7fa07c947fef2c5de53c42e14ed630a8aChih-Hung Hsieh            explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { }
1571a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        };
1581a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
1602ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);
1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
162b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        mSensors = mSensorServer->getSensorList(mOpPackageName);
1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        size_t count = mSensors.size();
164d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        mSensorList =
165d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                static_cast<Sensor const**>(malloc(count * sizeof(Sensor*)));
1668f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL");
1678f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella
1681a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<count ; i++) {
1691a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            mSensorList[i] = mSensors.array() + i;
1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
1721a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1731a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    return NO_ERROR;
1741a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian}
1751a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1762576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getSensorList(Sensor const* const** list) {
1771a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1781a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    status_t err = assertStateLocked();
1791a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (err < 0) {
180d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        return static_cast<ssize_t>(err);
1811a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
182589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *list = mSensorList;
183d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    return static_cast<ssize_t>(mSensors.size());
184589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
185589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
1862576cb63b3fe1592f54816625036566b9eb0793aPeng Xussize_t SensorManager::getDynamicSensorList(Vector<Sensor> & dynamicSensors) {
1872576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    Mutex::Autolock _l(mLock);
1882576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    status_t err = assertStateLocked();
1892576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    if (err < 0) {
1902576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        return static_cast<ssize_t>(err);
1912576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    }
1922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu
1932576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    dynamicSensors = mSensorServer->getDynamicSensorList(mOpPackageName);
1942576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    size_t count = dynamicSensors.size();
1952576cb63b3fe1592f54816625036566b9eb0793aPeng Xu
1962576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    return static_cast<ssize_t>(count);
1972576cb63b3fe1592f54816625036566b9eb0793aPeng Xu}
1982576cb63b3fe1592f54816625036566b9eb0793aPeng Xu
199a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type)
200589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
2011a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
2021a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (assertStateLocked() == NO_ERROR) {
203b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        bool wakeUpSensor = false;
204b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // For the following sensor types, return a wake-up sensor. These types are by default
205b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
206b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // a non_wake-up version.
207b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION ||
208b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE ||
2095e7f79bf29e488ab589daf98b089697b8c767765Nick Vaccaro            type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE ||
2102e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro            type == SENSOR_TYPE_WRIST_TILT_GESTURE ||
2112e990eb59e927187b11c7b5f0abe6dbdb0123d1dNick Vaccaro            type == SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT) {
212b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            wakeUpSensor = true;
213b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        }
2141a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // For now we just return the first sensor of that type we find.
2151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // in the future it will make sense to let the SensorService make
2161a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // that decision.
2171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<mSensors.size() ; i++) {
218b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            if (mSensorList[i]->getType() == type &&
219b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella                mSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
2201a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                return mSensorList[i];
221b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            }
2221a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
223a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    }
224a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    return NULL;
225589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
226589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
227a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) {
228be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    sp<SensorEventQueue> queue;
229be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian
2301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
2311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    while (assertStateLocked() == NO_ERROR) {
2321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        sp<ISensorEventConnection> connection =
233b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav                mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName);
2341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        if (connection == NULL) {
235a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            // SensorService just died or the app doesn't have required permissions.
236a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            ALOGE("createEventQueue: connection is NULL.");
237a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            return NULL;
2381a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
2391a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        queue = new SensorEventQueue(connection);
2401a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        break;
241be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    }
242be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    return queue;
243589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
244589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
245841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() {
246a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    Mutex::Autolock _l(mLock);
247a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    if (assertStateLocked() == NO_ERROR) {
248841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella        return mSensorServer->isDataInjectionEnabled();
249a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    }
250841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella    return false;
251a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella}
252a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella
253e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint SensorManager::createDirectChannel(
254e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        size_t size, int channelType, const native_handle_t *resourceHandle) {
255e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    Mutex::Autolock _l(mLock);
256e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    if (assertStateLocked() != NO_ERROR) {
257e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        return NO_INIT;
258e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
259e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
260d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    if (channelType != SENSOR_DIRECT_MEM_TYPE_ASHMEM
261d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu            && channelType != SENSOR_DIRECT_MEM_TYPE_GRALLOC) {
262d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu        ALOGE("Bad channel shared memory type %d", channelType);
263d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu        return BAD_VALUE;
264e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
265d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu
266d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    sp<ISensorEventConnection> conn =
267d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu              mSensorServer->createSensorDirectConnection(mOpPackageName,
268d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu                  static_cast<uint32_t>(size),
269d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu                  static_cast<int32_t>(channelType),
270d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu                  SENSOR_DIRECT_FMT_SENSORS_EVENT, resourceHandle);
271d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    if (conn == nullptr) {
272d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu        return NO_MEMORY;
273d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    }
274d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu
275d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    int nativeHandle = mDirectConnectionHandle++;
276d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    mDirectConnection.emplace(nativeHandle, conn);
277d9c8a864e193d7ae3d0a04c1aa7ff15da955fb0fPeng Xu    return nativeHandle;
278e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu}
279e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
280e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorManager::destroyDirectChannel(int channelNativeHandle) {
281e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    Mutex::Autolock _l(mLock);
282e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    if (assertStateLocked() == NO_ERROR) {
283e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        mDirectConnection.erase(channelNativeHandle);
284e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
285e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu}
286e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
287e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint SensorManager::configureDirectChannel(int channelNativeHandle, int sensorHandle, int rateLevel) {
288e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    Mutex::Autolock _l(mLock);
289e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    if (assertStateLocked() != NO_ERROR) {
290e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        return NO_INIT;
291e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
292e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
293e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    auto i = mDirectConnection.find(channelNativeHandle);
294e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    if (i == mDirectConnection.end()) {
295e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        ALOGE("Cannot find the handle in client direct connection table");
296e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        return BAD_VALUE;
297e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
298e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
299e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    int ret;
300e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    ret = i->second->configureChannel(sensorHandle, rateLevel);
301e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    ALOGE_IF(ret < 0, "SensorManager::configureChannel (%d, %d) returns %d",
302e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            static_cast<int>(sensorHandle), static_cast<int>(rateLevel),
303e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            static_cast<int>(ret));
304e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    return ret;
305e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu}
306e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
307dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xuint SensorManager::setOperationParameter(
308dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        int type, const Vector<float> &floats, const Vector<int32_t> &ints) {
309dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    Mutex::Autolock _l(mLock);
310dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    if (assertStateLocked() != NO_ERROR) {
311dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        return NO_INIT;
312dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    }
313dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    return mSensorServer->setOperationParameter(type, floats, ints);
314dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu}
315dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu
316589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
317589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
318