Loading include/gui/SensorManager.h +2 −51 Original line number Original line Diff line number Diff line Loading @@ -51,57 +51,7 @@ class SensorManager : public ASensorManager public ASensorManager { { public: public: static SensorManager& getInstanceForPackage(const String16& packageName) { static SensorManager& getInstanceForPackage(const String16& packageName); Mutex::Autolock _l(sLock); SensorManager* sensorManager; std::map<String16, SensorManager*>::iterator iterator = sPackageInstances.find(packageName); if (iterator != sPackageInstances.end()) { sensorManager = iterator->second; } else { String16 opPackageName = packageName; // It is possible that the calling code has no access to the package name. // In this case we will get the packages for the calling UID and pick the // first one for attributing the app op. This will work correctly for // runtime permissions as for legacy apps we will toggle the app op for // all packages in the UID. The caveat is that the operation may be attributed // to the wrong package and stats based on app ops may be slightly off. if (opPackageName.size() <= 0) { sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); if (binder != 0) { const uid_t uid = IPCThreadState::self()->getCallingUid(); Vector<String16> packages; interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); if (!packages.isEmpty()) { opPackageName = packages[0]; } else { ALOGE("No packages for calling UID"); } } else { ALOGE("Cannot get permission service"); } } sensorManager = new SensorManager(opPackageName); // If we had no package name, we looked it up from the UID and the sensor // manager instance we created should also be mapped to the empty package // name, to avoid looking up the packages for a UID and get the same result. if (packageName.size() <= 0) { sPackageInstances.insert(std::make_pair(String16(), sensorManager)); } // Stash the per package sensor manager. sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); } return *sensorManager; } SensorManager(const String16& opPackageName); ~SensorManager(); ~SensorManager(); ssize_t getSensorList(Sensor const* const** list) const; ssize_t getSensorList(Sensor const* const** list) const; Loading @@ -113,6 +63,7 @@ private: // DeathRecipient interface // DeathRecipient interface void sensorManagerDied(); void sensorManagerDied(); SensorManager(const String16& opPackageName); status_t assertStateLocked() const; status_t assertStateLocked() const; private: private: Loading libs/gui/SensorManager.cpp +59 −3 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,58 @@ namespace android { namespace android { // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- android::Mutex android::SensorManager::sLock; std::map<String16, SensorManager*> android::SensorManager::sPackageInstances; SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) { Mutex::Autolock _l(sLock); SensorManager* sensorManager; std::map<String16, SensorManager*>::iterator iterator = sPackageInstances.find(packageName); if (iterator != sPackageInstances.end()) { sensorManager = iterator->second; } else { String16 opPackageName = packageName; // It is possible that the calling code has no access to the package name. // In this case we will get the packages for the calling UID and pick the // first one for attributing the app op. This will work correctly for // runtime permissions as for legacy apps we will toggle the app op for // all packages in the UID. The caveat is that the operation may be attributed // to the wrong package and stats based on app ops may be slightly off. if (opPackageName.size() <= 0) { sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); if (binder != 0) { const uid_t uid = IPCThreadState::self()->getCallingUid(); Vector<String16> packages; interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); if (!packages.isEmpty()) { opPackageName = packages[0]; } else { ALOGE("No packages for calling UID"); } } else { ALOGE("Cannot get permission service"); } } sensorManager = new SensorManager(opPackageName); // If we had no package name, we looked it up from the UID and the sensor // manager instance we created should also be mapped to the empty package // name, to avoid looking up the packages for a UID and get the same result. if (packageName.size() <= 0) { sPackageInstances.insert(std::make_pair(String16(), sensorManager)); } // Stash the per package sensor manager. sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); } return *sensorManager; } SensorManager::SensorManager(const String16& opPackageName) SensorManager::SensorManager(const String16& opPackageName) : mSensorList(0), mOpPackageName(opPackageName) : mSensorList(0), mOpPackageName(opPackageName) { { Loading @@ -59,12 +111,12 @@ void SensorManager::sensorManagerDied() status_t SensorManager::assertStateLocked() const { status_t SensorManager::assertStateLocked() const { if (mSensorServer == NULL) { if (mSensorServer == NULL) { // try for one second // try for 10 seconds before giving up ... const String16 name("sensorservice"); const String16 name("sensorservice"); for (int i=0 ; i<4 ; i++) { for (int i = 0;i < 10; i++) { status_t err = getService(name, &mSensorServer); status_t err = getService(name, &mSensorServer); if (err == NAME_NOT_FOUND) { if (err == NAME_NOT_FOUND) { usleep(250000); sleep(1); continue; continue; } } if (err != NO_ERROR) { if (err != NO_ERROR) { Loading @@ -83,6 +135,10 @@ status_t SensorManager::assertStateLocked() const { DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } }; }; if (mSensorServer == NULL) { ALOGE("FATAL getsensorservice returned NULL"); } mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); Loading Loading
include/gui/SensorManager.h +2 −51 Original line number Original line Diff line number Diff line Loading @@ -51,57 +51,7 @@ class SensorManager : public ASensorManager public ASensorManager { { public: public: static SensorManager& getInstanceForPackage(const String16& packageName) { static SensorManager& getInstanceForPackage(const String16& packageName); Mutex::Autolock _l(sLock); SensorManager* sensorManager; std::map<String16, SensorManager*>::iterator iterator = sPackageInstances.find(packageName); if (iterator != sPackageInstances.end()) { sensorManager = iterator->second; } else { String16 opPackageName = packageName; // It is possible that the calling code has no access to the package name. // In this case we will get the packages for the calling UID and pick the // first one for attributing the app op. This will work correctly for // runtime permissions as for legacy apps we will toggle the app op for // all packages in the UID. The caveat is that the operation may be attributed // to the wrong package and stats based on app ops may be slightly off. if (opPackageName.size() <= 0) { sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); if (binder != 0) { const uid_t uid = IPCThreadState::self()->getCallingUid(); Vector<String16> packages; interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); if (!packages.isEmpty()) { opPackageName = packages[0]; } else { ALOGE("No packages for calling UID"); } } else { ALOGE("Cannot get permission service"); } } sensorManager = new SensorManager(opPackageName); // If we had no package name, we looked it up from the UID and the sensor // manager instance we created should also be mapped to the empty package // name, to avoid looking up the packages for a UID and get the same result. if (packageName.size() <= 0) { sPackageInstances.insert(std::make_pair(String16(), sensorManager)); } // Stash the per package sensor manager. sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); } return *sensorManager; } SensorManager(const String16& opPackageName); ~SensorManager(); ~SensorManager(); ssize_t getSensorList(Sensor const* const** list) const; ssize_t getSensorList(Sensor const* const** list) const; Loading @@ -113,6 +63,7 @@ private: // DeathRecipient interface // DeathRecipient interface void sensorManagerDied(); void sensorManagerDied(); SensorManager(const String16& opPackageName); status_t assertStateLocked() const; status_t assertStateLocked() const; private: private: Loading
libs/gui/SensorManager.cpp +59 −3 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,58 @@ namespace android { namespace android { // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- android::Mutex android::SensorManager::sLock; std::map<String16, SensorManager*> android::SensorManager::sPackageInstances; SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) { Mutex::Autolock _l(sLock); SensorManager* sensorManager; std::map<String16, SensorManager*>::iterator iterator = sPackageInstances.find(packageName); if (iterator != sPackageInstances.end()) { sensorManager = iterator->second; } else { String16 opPackageName = packageName; // It is possible that the calling code has no access to the package name. // In this case we will get the packages for the calling UID and pick the // first one for attributing the app op. This will work correctly for // runtime permissions as for legacy apps we will toggle the app op for // all packages in the UID. The caveat is that the operation may be attributed // to the wrong package and stats based on app ops may be slightly off. if (opPackageName.size() <= 0) { sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); if (binder != 0) { const uid_t uid = IPCThreadState::self()->getCallingUid(); Vector<String16> packages; interface_cast<IPermissionController>(binder)->getPackagesForUid(uid, packages); if (!packages.isEmpty()) { opPackageName = packages[0]; } else { ALOGE("No packages for calling UID"); } } else { ALOGE("Cannot get permission service"); } } sensorManager = new SensorManager(opPackageName); // If we had no package name, we looked it up from the UID and the sensor // manager instance we created should also be mapped to the empty package // name, to avoid looking up the packages for a UID and get the same result. if (packageName.size() <= 0) { sPackageInstances.insert(std::make_pair(String16(), sensorManager)); } // Stash the per package sensor manager. sPackageInstances.insert(std::make_pair(opPackageName, sensorManager)); } return *sensorManager; } SensorManager::SensorManager(const String16& opPackageName) SensorManager::SensorManager(const String16& opPackageName) : mSensorList(0), mOpPackageName(opPackageName) : mSensorList(0), mOpPackageName(opPackageName) { { Loading @@ -59,12 +111,12 @@ void SensorManager::sensorManagerDied() status_t SensorManager::assertStateLocked() const { status_t SensorManager::assertStateLocked() const { if (mSensorServer == NULL) { if (mSensorServer == NULL) { // try for one second // try for 10 seconds before giving up ... const String16 name("sensorservice"); const String16 name("sensorservice"); for (int i=0 ; i<4 ; i++) { for (int i = 0;i < 10; i++) { status_t err = getService(name, &mSensorServer); status_t err = getService(name, &mSensorServer); if (err == NAME_NOT_FOUND) { if (err == NAME_NOT_FOUND) { usleep(250000); sleep(1); continue; continue; } } if (err != NO_ERROR) { if (err != NO_ERROR) { Loading @@ -83,6 +135,10 @@ status_t SensorManager::assertStateLocked() const { DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } }; }; if (mSensorServer == NULL) { ALOGE("FATAL getsensorservice returned NULL"); } mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this)); IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver); Loading