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