SensorManager.cpp revision 8f35ca973063e1449c5ec40b618393187a47ec58
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)
92b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav    : mSensorList(0), mOpPackageName(opPackageName)
93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
941a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    // okay we're not locked here, but it's not needed during construction
951a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    assertStateLocked();
96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
97589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
98589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianSensorManager::~SensorManager()
99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
100a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    free(mSensorList);
101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
1031a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopianvoid SensorManager::sensorManagerDied()
1041a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian{
1051a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensorServer.clear();
1071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    free(mSensorList);
1081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensorList = NULL;
1091a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    mSensors.clear();
1101a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian}
1111a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1121a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopianstatus_t SensorManager::assertStateLocked() const {
1138f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    bool initSensorManager = false;
1141a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (mSensorServer == NULL) {
1158f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        initSensorManager = true;
1168f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    } else {
1178f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        // Ping binder to check if sensorservice is alive.
1188f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        status_t err = IInterface::asBinder(mSensorServer)->pingBinder();
1198f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        if (err != NO_ERROR) {
1208f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella            initSensorManager = true;
1218f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        }
1228f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    }
1238f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella    if (initSensorManager) {
1248f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ...
1251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        const String16 name("sensorservice");
1268f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        for (int i = 0; i < 60; i++) {
1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            status_t err = getService(name, &mSensorServer);
1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            if (err == NAME_NOT_FOUND) {
129e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                sleep(1);
1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                continue;
1311a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            if (err != NO_ERROR) {
1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                return err;
1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            break;
1361a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1381a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        class DeathObserver : public IBinder::DeathRecipient {
1391a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            SensorManager& mSensorManger;
1401a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            virtual void binderDied(const wp<IBinder>& who) {
14132397c1cd3327905173b36baa6fd1c579bc328ffSteve Block                ALOGW("sensorservice died [%p]", who.unsafe_get());
1421a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                mSensorManger.sensorManagerDied();
1431a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1441a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        public:
1451a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
1461a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        };
1471a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1488f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        LOG_ALWAYS_FATAL_IF(mSensorServer.get() == NULL, "getService(SensorService) NULL");
149e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
1501a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
1512ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);
1521a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
153b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        mSensors = mSensorServer->getSensorList(mOpPackageName);
1541a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        size_t count = mSensors.size();
155d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        mSensorList =
156d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                static_cast<Sensor const**>(malloc(count * sizeof(Sensor*)));
1578f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella        LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL");
1588f35ca973063e1449c5ec40b618393187a47ec58Aravind Akella
1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<count ; i++) {
1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            mSensorList[i] = mSensors.array() + i;
1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
1621a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1641a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    return NO_ERROR;
1651a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian}
1661a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
167a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopianssize_t SensorManager::getSensorList(Sensor const* const** list) const
168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
1691a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    status_t err = assertStateLocked();
1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (err < 0) {
172d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        return static_cast<ssize_t>(err);
1731a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
174589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *list = mSensorList;
175d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    return static_cast<ssize_t>(mSensors.size());
176589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
177589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
178a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type)
179589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
1801a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1811a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (assertStateLocked() == NO_ERROR) {
182b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        bool wakeUpSensor = false;
183b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // For the following sensor types, return a wake-up sensor. These types are by default
184b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
185b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // a non_wake-up version.
186b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION ||
187b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE ||
188b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE) {
189b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            wakeUpSensor = true;
190b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        }
1911a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // For now we just return the first sensor of that type we find.
1921a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // in the future it will make sense to let the SensorService make
1931a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // that decision.
1941a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<mSensors.size() ; i++) {
195b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            if (mSensorList[i]->getType() == type &&
196b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella                mSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
1971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                return mSensorList[i];
198b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            }
1991a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
200a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    }
201a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    return NULL;
202589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
203589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
204a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) {
205be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    sp<SensorEventQueue> queue;
206be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian
2071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
2081a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    while (assertStateLocked() == NO_ERROR) {
2091a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        sp<ISensorEventConnection> connection =
210b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav                mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName);
2111a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        if (connection == NULL) {
212a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            // SensorService just died or the app doesn't have required permissions.
213a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            ALOGE("createEventQueue: connection is NULL.");
214a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            return NULL;
2151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
2161a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        queue = new SensorEventQueue(connection);
2171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        break;
218be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    }
219be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    return queue;
220589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
221589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
222841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() {
223a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    Mutex::Autolock _l(mLock);
224a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    if (assertStateLocked() == NO_ERROR) {
225841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella        return mSensorServer->isDataInjectionEnabled();
226a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    }
227841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella    return false;
228a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella}
229a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella
230589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
231589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
232