Fix broken NDK sensor manager API.
Change-Id: I21bb8b0dcfd3f1c812753a9fd77dea792e7155f2
This commit is contained in:
parent
cbe13ef59b
commit
5fa32d4b08
@ -192,6 +192,30 @@ typedef ASensorRef const* ASensorList;
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a reference to the sensor manager. ASensorManager is a singleton
|
||||||
|
* per package as different packages may have access to different sensors.
|
||||||
|
*
|
||||||
|
* Deprecated: Use ASensorManager_getInstanceForPackage(const char*) instead.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ASensorManager* sensorManager = ASensorManager_getInstance();
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
__attribute__ ((deprecated)) ASensorManager* ASensorManager_getInstance();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a reference to the sensor manager. ASensorManager is a singleton
|
||||||
|
* per package as different packages may have access to different sensors.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ASensorManager* sensorManager = ASensorManager_getInstanceForPackage("foo.bar.baz");
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the list of available sensors.
|
* Returns the list of available sensors.
|
||||||
*/
|
*/
|
||||||
|
@ -17,10 +17,14 @@
|
|||||||
#ifndef ANDROID_GUI_SENSOR_MANAGER_H
|
#ifndef ANDROID_GUI_SENSOR_MANAGER_H
|
||||||
#define ANDROID_GUI_SENSOR_MANAGER_H
|
#define ANDROID_GUI_SENSOR_MANAGER_H
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <binder/IBinder.h>
|
#include <binder/IBinder.h>
|
||||||
|
#include <binder/IPCThreadState.h>
|
||||||
|
#include <binder/IServiceManager.h>
|
||||||
|
|
||||||
#include <utils/Errors.h>
|
#include <utils/Errors.h>
|
||||||
#include <utils/RefBase.h>
|
#include <utils/RefBase.h>
|
||||||
@ -47,6 +51,56 @@ class SensorManager :
|
|||||||
public ASensorManager
|
public ASensorManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
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(const String16& opPackageName);
|
||||||
~SensorManager();
|
~SensorManager();
|
||||||
|
|
||||||
@ -62,6 +116,9 @@ private:
|
|||||||
status_t assertStateLocked() const;
|
status_t assertStateLocked() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static Mutex sLock;
|
||||||
|
static std::map<String16, SensorManager*> sPackageInstances;
|
||||||
|
|
||||||
mutable Mutex mLock;
|
mutable Mutex mLock;
|
||||||
mutable sp<ISensorServer> mSensorServer;
|
mutable sp<ISensorServer> mSensorServer;
|
||||||
mutable Sensor const** mSensorList;
|
mutable Sensor const** mSensorList;
|
||||||
|
Loading…
Reference in New Issue
Block a user