summaryrefslogtreecommitdiffstats
path: root/libs/gui
diff options
context:
space:
mode:
authorAravind Akella <aakella@google.com>2015-07-29 18:03:48 -0700
committerAravind Akella <aakella@google.com>2015-07-30 19:05:21 +0000
commite2806cb4456e3815e979f333ed23ec7df591a9ff (patch)
tree8d1271b3c4ec5f4829c02a9e4edafd25d734a8d7 /libs/gui
parent65f1d44cd8d96a4555ce6929bb5e2022307738e8 (diff)
downloadframeworks_native-e2806cb4456e3815e979f333ed23ec7df591a9ff.zip
frameworks_native-e2806cb4456e3815e979f333ed23ec7df591a9ff.tar.gz
frameworks_native-e2806cb4456e3815e979f333ed23ec7df591a9ff.tar.bz2
Bug fix in SensorManager.
If SensorService hasn't started when SensorManager instance is requested, keep retrying for a longer duration. Bug: 22529981 Change-Id: I3c506d962b61347085fc80b2c5832289539d6853
Diffstat (limited to 'libs/gui')
-rw-r--r--libs/gui/SensorManager.cpp62
1 files changed, 59 insertions, 3 deletions
diff --git a/libs/gui/SensorManager.cpp b/libs/gui/SensorManager.cpp
index dd37781..9934151 100644
--- a/libs/gui/SensorManager.cpp
+++ b/libs/gui/SensorManager.cpp
@@ -36,6 +36,58 @@
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)
: mSensorList(0), mOpPackageName(opPackageName)
{
@@ -59,12 +111,12 @@ void SensorManager::sensorManagerDied()
status_t SensorManager::assertStateLocked() const {
if (mSensorServer == NULL) {
- // try for one second
+ // try for 10 seconds before giving up ...
const String16 name("sensorservice");
- for (int i=0 ; i<4 ; i++) {
+ for (int i = 0;i < 10; i++) {
status_t err = getService(name, &mSensorServer);
if (err == NAME_NOT_FOUND) {
- usleep(250000);
+ sleep(1);
continue;
}
if (err != NO_ERROR) {
@@ -83,6 +135,10 @@ status_t SensorManager::assertStateLocked() const {
DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { }
};
+ if (mSensorServer == NULL) {
+ ALOGE("FATAL getsensorservice returned NULL");
+ }
+
mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);