SensorManager.cpp revision e2806cb4456e3815e979f333ed23ec7df591a9ff
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 {
1131a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (mSensorServer == NULL) {
114e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        // try for 10 seconds before giving up ...
1151a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        const String16 name("sensorservice");
116e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        for (int i = 0;i < 10; i++) {
1171a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            status_t err = getService(name, &mSensorServer);
1181a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            if (err == NAME_NOT_FOUND) {
119e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella                sleep(1);
1201a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                continue;
1211a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1221a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            if (err != NO_ERROR) {
1231a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                return err;
1241a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1251a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            break;
1261a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
1271a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1281a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        class DeathObserver : public IBinder::DeathRecipient {
1291a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            SensorManager& mSensorManger;
1301a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            virtual void binderDied(const wp<IBinder>& who) {
13132397c1cd3327905173b36baa6fd1c579bc328ffSteve Block                ALOGW("sensorservice died [%p]", who.unsafe_get());
1321a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                mSensorManger.sensorManagerDied();
1331a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            }
1341a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        public:
1351a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
1361a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        };
1371a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
138e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        if (mSensorServer == NULL) {
139e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella            ALOGE("FATAL getsensorservice returned NULL");
140e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella        }
141e2806cb4456e3815e979f333ed23ec7df591a9ffAravind Akella
1421a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
1432ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);
1441a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
145b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        mSensors = mSensorServer->getSensorList(mOpPackageName);
1461a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        size_t count = mSensors.size();
147d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        mSensorList =
148d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                static_cast<Sensor const**>(malloc(count * sizeof(Sensor*)));
1491a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<count ; i++) {
1501a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian            mSensorList[i] = mSensors.array() + i;
1511a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
1521a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
1531a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
1541a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    return NO_ERROR;
1551a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian}
1561a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian
157a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopianssize_t SensorManager::getSensorList(Sensor const* const** list) const
158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
1591a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1601a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    status_t err = assertStateLocked();
1611a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (err < 0) {
162d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        return static_cast<ssize_t>(err);
1631a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    }
164589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    *list = mSensorList;
165d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    return static_cast<ssize_t>(mSensors.size());
166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
167589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
168a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias AgopianSensor const* SensorManager::getDefaultSensor(int type)
169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
1701a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1711a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    if (assertStateLocked() == NO_ERROR) {
172b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        bool wakeUpSensor = false;
173b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // For the following sensor types, return a wake-up sensor. These types are by default
174b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
175b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        // a non_wake-up version.
176b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION ||
177b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE ||
178b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE) {
179b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            wakeUpSensor = true;
180b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella        }
1811a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // For now we just return the first sensor of that type we find.
1821a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // in the future it will make sense to let the SensorService make
1831a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        // that decision.
1841a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        for (size_t i=0 ; i<mSensors.size() ; i++) {
185b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            if (mSensorList[i]->getType() == type &&
186b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella                mSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
1871a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian                return mSensorList[i];
188b37ba399c1521c3eba40e126f65d9663532de446Aravind Akella            }
1891a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
190a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    }
191a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian    return NULL;
192589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
193589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
194a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akellasp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) {
195be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    sp<SensorEventQueue> queue;
196be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian
1971a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    Mutex::Autolock _l(mLock);
1981a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian    while (assertStateLocked() == NO_ERROR) {
1991a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        sp<ISensorEventConnection> connection =
200b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav                mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName);
2011a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        if (connection == NULL) {
202a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            // SensorService just died or the app doesn't have required permissions.
203a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            ALOGE("createEventQueue: connection is NULL.");
204a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            return NULL;
2051a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        }
2061a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        queue = new SensorEventQueue(connection);
2071a2b83a17d3bdb2440b8b5b96136f7916a5528b5Mathias Agopian        break;
208be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    }
209be58de0d627fa0ecb087eeff95da13c783bf2392Mathias Agopian    return queue;
210589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
211589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
212841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akellabool SensorManager::isDataInjectionEnabled() {
213a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    Mutex::Autolock _l(mLock);
214a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    if (assertStateLocked() == NO_ERROR) {
215841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella        return mSensorServer->isDataInjectionEnabled();
216a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    }
217841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella    return false;
218a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella}
219a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella
220589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
221589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
222