SensorManager.cpp revision fe5476a3cc7323f2142c58333984fb98dec50376
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "Sensors" 18 19#include <sensor/SensorManager.h> 20 21#include <stdint.h> 22#include <sys/types.h> 23 24#include <cutils/native_handle.h> 25#include <utils/Errors.h> 26#include <utils/RefBase.h> 27#include <utils/Singleton.h> 28 29#include <binder/IBinder.h> 30#include <binder/IServiceManager.h> 31 32#include <sensor/ISensorServer.h> 33#include <sensor/ISensorEventConnection.h> 34#include <sensor/Sensor.h> 35#include <sensor/SensorEventQueue.h> 36 37// ---------------------------------------------------------------------------- 38namespace android { 39// ---------------------------------------------------------------------------- 40 41Mutex SensorManager::sLock; 42std::map<String16, SensorManager*> SensorManager::sPackageInstances; 43 44SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) { 45 waitForSensorService(nullptr); 46 47 Mutex::Autolock _l(sLock); 48 SensorManager* sensorManager; 49 auto iterator = sPackageInstances.find(packageName); 50 51 if (iterator != sPackageInstances.end()) { 52 sensorManager = iterator->second; 53 } else { 54 String16 opPackageName = packageName; 55 56 // It is possible that the calling code has no access to the package name. 57 // In this case we will get the packages for the calling UID and pick the 58 // first one for attributing the app op. This will work correctly for 59 // runtime permissions as for legacy apps we will toggle the app op for 60 // all packages in the UID. The caveat is that the operation may be attributed 61 // to the wrong package and stats based on app ops may be slightly off. 62 if (opPackageName.size() <= 0) { 63 sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); 64 if (binder != 0) { 65 const uid_t uid = IPCThreadState::self()->getCallingUid(); 66 Vector<String16> packages; 67 interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); 68 if (!packages.isEmpty()) { 69 opPackageName = packages[0]; 70 } else { 71 ALOGE("No packages for calling UID"); 72 } 73 } else { 74 ALOGE("Cannot get permission service"); 75 } 76 } 77 78 sensorManager = new SensorManager(opPackageName); 79 80 // If we had no package name, we looked it up from the UID and the sensor 81 // manager instance we created should also be mapped to the empty package 82 // name, to avoid looking up the packages for a UID and get the same result. 83 if (packageName.size() <= 0) { 84 sPackageInstances.insert(std::make_pair(String16(), sensorManager)); 85 } 86 87 // Stash the per package sensor manager. 88 sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); 89 } 90 91 return *sensorManager; 92} 93 94SensorManager::SensorManager(const String16& opPackageName) 95 : mSensorList(0), mOpPackageName(opPackageName), mDirectConnectionHandle(1) { 96 // okay we're not locked here, but it's not needed during construction 97 assertStateLocked(); 98} 99 100SensorManager::~SensorManager() { 101 free(mSensorList); 102} 103 104status_t SensorManager::waitForSensorService(sp<ISensorServer> *server) { 105 // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ... 106 sp<ISensorServer> s; 107 const String16 name("sensorservice"); 108 for (int i = 0; i < 60; i++) { 109 status_t err = getService(name, &s); 110 switch (err) { 111 case NAME_NOT_FOUND: 112 sleep(1); 113 continue; 114 case NO_ERROR: 115 if (server != nullptr) { 116 *server = s; 117 } 118 return NO_ERROR; 119 default: 120 return err; 121 } 122 } 123 return TIMED_OUT; 124} 125 126void SensorManager::sensorManagerDied() { 127 Mutex::Autolock _l(mLock); 128 mSensorServer.clear(); 129 free(mSensorList); 130 mSensorList = NULL; 131 mSensors.clear(); 132} 133 134status_t SensorManager::assertStateLocked() { 135 bool initSensorManager = false; 136 if (mSensorServer == NULL) { 137 initSensorManager = true; 138 } else { 139 // Ping binder to check if sensorservice is alive. 140 status_t err = IInterface::asBinder(mSensorServer)->pingBinder(); 141 if (err != NO_ERROR) { 142 initSensorManager = true; 143 } 144 } 145 if (initSensorManager) { 146 waitForSensorService(&mSensorServer); 147 LOG_ALWAYS_FATAL_IF(mSensorServer == nullptr, "getService(SensorService) NULL"); 148 149 class DeathObserver : public IBinder::DeathRecipient { 150 SensorManager& mSensorManager; 151 virtual void binderDied(const wp<IBinder>& who) { 152 ALOGW("sensorservice died [%p]", who.unsafe_get()); 153 mSensorManager.sensorManagerDied(); 154 } 155 public: 156 explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { } 157 }; 158 159 mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); 160 IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); 161 162 mSensors = mSensorServer->getSensorList(mOpPackageName); 163 size_t count = mSensors.size(); 164 mSensorList = 165 static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); 166 LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL"); 167 168 for (size_t i=0 ; i<count ; i++) { 169 mSensorList[i] = mSensors.array() + i; 170 } 171 } 172 173 return NO_ERROR; 174} 175 176ssize_t SensorManager::getSensorList(Sensor const* const** list) { 177 Mutex::Autolock _l(mLock); 178 status_t err = assertStateLocked(); 179 if (err < 0) { 180 return static_cast<ssize_t>(err); 181 } 182 *list = mSensorList; 183 return static_cast<ssize_t>(mSensors.size()); 184} 185 186ssize_t SensorManager::getDynamicSensorList(Vector<Sensor> & dynamicSensors) { 187 Mutex::Autolock _l(mLock); 188 status_t err = assertStateLocked(); 189 if (err < 0) { 190 return static_cast<ssize_t>(err); 191 } 192 193 dynamicSensors = mSensorServer->getDynamicSensorList(mOpPackageName); 194 size_t count = dynamicSensors.size(); 195 196 return static_cast<ssize_t>(count); 197} 198 199Sensor const* SensorManager::getDefaultSensor(int type) 200{ 201 Mutex::Autolock _l(mLock); 202 if (assertStateLocked() == NO_ERROR) { 203 bool wakeUpSensor = false; 204 // For the following sensor types, return a wake-up sensor. These types are by default 205 // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return 206 // a non_wake-up version. 207 if (type == SENSOR_TYPE_PROXIMITY || type == SENSOR_TYPE_SIGNIFICANT_MOTION || 208 type == SENSOR_TYPE_TILT_DETECTOR || type == SENSOR_TYPE_WAKE_GESTURE || 209 type == SENSOR_TYPE_GLANCE_GESTURE || type == SENSOR_TYPE_PICK_UP_GESTURE || 210 type == SENSOR_TYPE_WRIST_TILT_GESTURE || 211 type == SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT) { 212 wakeUpSensor = true; 213 } 214 // For now we just return the first sensor of that type we find. 215 // in the future it will make sense to let the SensorService make 216 // that decision. 217 for (size_t i=0 ; i<mSensors.size() ; i++) { 218 if (mSensorList[i]->getType() == type && 219 mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { 220 return mSensorList[i]; 221 } 222 } 223 } 224 return NULL; 225} 226 227sp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) { 228 sp<SensorEventQueue> queue; 229 230 Mutex::Autolock _l(mLock); 231 while (assertStateLocked() == NO_ERROR) { 232 sp<ISensorEventConnection> connection = 233 mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName); 234 if (connection == NULL) { 235 // SensorService just died or the app doesn't have required permissions. 236 ALOGE("createEventQueue: connection is NULL."); 237 return NULL; 238 } 239 queue = new SensorEventQueue(connection); 240 break; 241 } 242 return queue; 243} 244 245bool SensorManager::isDataInjectionEnabled() { 246 Mutex::Autolock _l(mLock); 247 if (assertStateLocked() == NO_ERROR) { 248 return mSensorServer->isDataInjectionEnabled(); 249 } 250 return false; 251} 252 253int SensorManager::createDirectChannel( 254 size_t size, int channelType, const native_handle_t *resourceHandle) { 255 Mutex::Autolock _l(mLock); 256 if (assertStateLocked() != NO_ERROR) { 257 return NO_INIT; 258 } 259 260 if (channelType != SENSOR_DIRECT_MEM_TYPE_ASHMEM 261 && channelType != SENSOR_DIRECT_MEM_TYPE_GRALLOC) { 262 ALOGE("Bad channel shared memory type %d", channelType); 263 return BAD_VALUE; 264 } 265 266 sp<ISensorEventConnection> conn = 267 mSensorServer->createSensorDirectConnection(mOpPackageName, 268 static_cast<uint32_t>(size), 269 static_cast<int32_t>(channelType), 270 SENSOR_DIRECT_FMT_SENSORS_EVENT, resourceHandle); 271 if (conn == nullptr) { 272 return NO_MEMORY; 273 } 274 275 int nativeHandle = mDirectConnectionHandle++; 276 mDirectConnection.emplace(nativeHandle, conn); 277 return nativeHandle; 278} 279 280void SensorManager::destroyDirectChannel(int channelNativeHandle) { 281 Mutex::Autolock _l(mLock); 282 if (assertStateLocked() == NO_ERROR) { 283 mDirectConnection.erase(channelNativeHandle); 284 } 285} 286 287int SensorManager::configureDirectChannel(int channelNativeHandle, int sensorHandle, int rateLevel) { 288 Mutex::Autolock _l(mLock); 289 if (assertStateLocked() != NO_ERROR) { 290 return NO_INIT; 291 } 292 293 auto i = mDirectConnection.find(channelNativeHandle); 294 if (i == mDirectConnection.end()) { 295 ALOGE("Cannot find the handle in client direct connection table"); 296 return BAD_VALUE; 297 } 298 299 int ret; 300 ret = i->second->configureChannel(sensorHandle, rateLevel); 301 ALOGE_IF(ret < 0, "SensorManager::configureChannel (%d, %d) returns %d", 302 static_cast<int>(sensorHandle), static_cast<int>(rateLevel), 303 static_cast<int>(ret)); 304 return ret; 305} 306 307// ---------------------------------------------------------------------------- 308}; // namespace android 309