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