Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5fa32d4b authored by Svet Ganov's avatar Svet Ganov Committed by Svetoslav
Browse files

Fix broken NDK sensor manager API.

Change-Id: I21bb8b0dcfd3f1c812753a9fd77dea792e7155f2
parent cbe13ef5
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -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.
 */
 */
+57 −0
Original line number Original line Diff line number Diff line
@@ -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;