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

Commit ca19b6a4 authored by Nick Vaccaro's avatar Nick Vaccaro Committed by Android (Google) Code Review
Browse files

Merge "[DO NOT MERGE ANYWHERE] Fix bodysensor permission" into cw-e-dev

parents ea2b6c68 b7beb52d
Loading
Loading
Loading
Loading
+19 −7
Original line number Original line Diff line number Diff line
@@ -22,9 +22,11 @@
#include <stdint.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/types.h>


#include <binder/BinderService.h>
#include <binder/IBinder.h>
#include <binder/IBinder.h>
#include <binder/IPCThreadState.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/IServiceManager.h>
#include <binder/PermissionCache.h>


#include <utils/Errors.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/RefBase.h>
@@ -54,7 +56,8 @@ public:
    static SensorManager& getInstanceForPackage(const String16& packageName);
    static SensorManager& getInstanceForPackage(const String16& packageName);
    ~SensorManager();
    ~SensorManager();


    ssize_t getSensorList(Sensor const* const** list) const;
    ssize_t getSensorList(Sensor const* const** list);
    ssize_t getAvailableSensorList(Sensor const* const** list);
    Sensor const* getDefaultSensor(int type);
    Sensor const* getDefaultSensor(int type);
    sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0);
    sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0);
    bool isDataInjectionEnabled();
    bool isDataInjectionEnabled();
@@ -64,18 +67,27 @@ private:
    void sensorManagerDied();
    void sensorManagerDied();


    SensorManager(const String16& opPackageName);
    SensorManager(const String16& opPackageName);
    status_t assertStateLocked() const;
    status_t assertStateLocked();
    void updateAvailableSensorList();


private:
private:
    static Mutex sLock;
    static Mutex sLock;
    static std::map<String16, SensorManager*> sPackageInstances;
    static std::map<String16, SensorManager*> sPackageInstances;


    mutable Mutex mLock;
    Mutex mLock;
    mutable sp<ISensorServer> mSensorServer;
    sp<ISensorServer> mSensorServer;
    mutable Sensor const** mSensorList;

    mutable Vector<Sensor> mSensors;
    // for Java API
    mutable sp<IBinder::DeathRecipient> mDeathObserver;
    Sensor const** mSensorList;

    // for NDK API
    Sensor const** mAvailableSensorList;
    ssize_t mNumAvailableSensor;

    Vector<Sensor> mSensors;
    sp<IBinder::DeathRecipient> mDeathObserver;
    const String16 mOpPackageName;
    const String16 mOpPackageName;
    bool mBodyPermission;
};
};


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
+84 −9
Original line number Original line Diff line number Diff line
@@ -89,7 +89,8 @@ SensorManager& SensorManager::getInstanceForPackage(const String16& packageName)
}
}


SensorManager::SensorManager(const String16& opPackageName)
SensorManager::SensorManager(const String16& opPackageName)
    : mSensorList(0), mOpPackageName(opPackageName)
    : mSensorList(NULL), mAvailableSensorList(NULL), mNumAvailableSensor(0),
      mOpPackageName(opPackageName), mBodyPermission(false)
{
{
    // okay we're not locked here, but it's not needed during construction
    // okay we're not locked here, but it's not needed during construction
    assertStateLocked();
    assertStateLocked();
@@ -98,6 +99,9 @@ SensorManager::SensorManager(const String16& opPackageName)
SensorManager::~SensorManager()
SensorManager::~SensorManager()
{
{
    free(mSensorList);
    free(mSensorList);
    if (mAvailableSensorList) {
        free(mAvailableSensorList);
    }
}
}


void SensorManager::sensorManagerDied()
void SensorManager::sensorManagerDied()
@@ -106,10 +110,14 @@ void SensorManager::sensorManagerDied()
    mSensorServer.clear();
    mSensorServer.clear();
    free(mSensorList);
    free(mSensorList);
    mSensorList = NULL;
    mSensorList = NULL;
    if (mAvailableSensorList) {
        free(mAvailableSensorList);
        mAvailableSensorList = NULL;
    }
    mSensors.clear();
    mSensors.clear();
}
}


status_t SensorManager::assertStateLocked() const {
status_t SensorManager::assertStateLocked() {
    bool initSensorManager = false;
    bool initSensorManager = false;
    if (mSensorServer == NULL) {
    if (mSensorServer == NULL) {
        initSensorManager = true;
        initSensorManager = true;
@@ -159,13 +167,14 @@ status_t SensorManager::assertStateLocked() const {
        for (size_t i=0 ; i<count ; i++) {
        for (size_t i=0 ; i<count ; i++) {
            mSensorList[i] = mSensors.array() + i;
            mSensorList[i] = mSensors.array() + i;
        }
        }

        updateAvailableSensorList();
    }
    }


    return NO_ERROR;
    return NO_ERROR;
}
}


ssize_t SensorManager::getSensorList(Sensor const* const** list) const
ssize_t SensorManager::getSensorList(Sensor const* const** list) {
{
    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);
    status_t err = assertStateLocked();
    status_t err = assertStateLocked();
    if (err < 0) {
    if (err < 0) {
@@ -175,10 +184,76 @@ ssize_t SensorManager::getSensorList(Sensor const* const** list) const
    return static_cast<ssize_t>(mSensors.size());
    return static_cast<ssize_t>(mSensors.size());
}
}


Sensor const* SensorManager::getDefaultSensor(int type)
void SensorManager::updateAvailableSensorList() {
{
    const int uid = static_cast<int>(IPCThreadState::self()->getCallingUid());
    const int pid = static_cast<int>(IPCThreadState::self()->getCallingPid());
    const String16 BODY_SENSOR_PERMISSION("android.permission.BODY_SENSORS");
    const String8 BODY_SENSOR_PERMISSION8("android.permission.BODY_SENSORS");

    bool bodySensorPermission = false;

    sp<IBinder> binder = defaultServiceManager()->getService(String16("permission"));
    if (binder != NULL) {
        bodySensorPermission = interface_cast<IPermissionController>(binder)->
                checkPermission(BODY_SENSOR_PERMISSION, pid, uid);
    }

    // only update if app got BODY_SENSORS permission after last call or the sensor list has not
    // been populated.
    //
    // it is not possible for the reverse transition, as the app will be killed when permission is
    // revoked.
    if ( (bodySensorPermission && !mBodyPermission) || mAvailableSensorList == NULL) {

        // allocate only when necessary
        if (mAvailableSensorList == NULL) {
            // allocate a list big enough to fit all sensors (including those requires permission
            // that the app do not have;
            mAvailableSensorList =
                    static_cast<Sensor const**>(malloc(mSensors.size() * sizeof(Sensor*)));

            // first populate all sensors that do not need body sensor permission
            ssize_t& n = mNumAvailableSensor;
            for (size_t i = 0; i < mSensors.size() ; i++) {
                if (mSensors[i].getRequiredPermission() != BODY_SENSOR_PERMISSION8) {
                    mAvailableSensorList[n++] = mSensors.array() + i;
                }
            }
        }

        if (bodySensorPermission) {
            // if the app just got the sensor permission back, fill the sensor at the end of list
            ssize_t& n = mNumAvailableSensor;
            for (size_t i = 0; i < mSensors.size() ; i++) {
                if (mSensors[i].getRequiredPermission() == BODY_SENSOR_PERMISSION8) {
                    mAvailableSensorList[n++] = mSensors.array() + i;
                }
            }
        }

        mBodyPermission = bodySensorPermission;
    }
}

ssize_t SensorManager::getAvailableSensorList(Sensor const* const** list) {
    Mutex::Autolock _l(mLock);
    status_t err = assertStateLocked();
    if (err < 0) {
        return static_cast<ssize_t>(err);
    }

    updateAvailableSensorList();

    *list = mAvailableSensorList;
    return mNumAvailableSensor;
}

Sensor const* SensorManager::getDefaultSensor(int type) {
    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);
    if (assertStateLocked() == NO_ERROR) {
    if (assertStateLocked() == NO_ERROR) {

        updateAvailableSensorList();

        bool wakeUpSensor = false;
        bool wakeUpSensor = false;
        // For the following sensor types, return a wake-up sensor. These types are by default
        // For the following sensor types, return a wake-up sensor. These types are by default
        // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
        // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return
@@ -192,9 +267,9 @@ Sensor const* SensorManager::getDefaultSensor(int type)
        // in the future it will make sense to let the SensorService make
        // in the future it will make sense to let the SensorService make
        // that decision.
        // that decision.
        for (size_t i=0 ; i<mSensors.size() ; i++) {
        for (size_t i=0 ; i<mSensors.size() ; i++) {
            if (mSensorList[i]->getType() == type &&
            if (mAvailableSensorList[i]->getType() == type &&
                mSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
                mAvailableSensorList[i]->isWakeUpSensor() == wakeUpSensor) {
                return mSensorList[i];
                return mAvailableSensorList[i];
            }
            }
        }
        }
    }
    }
+1 −8
Original line number Original line Diff line number Diff line
@@ -723,14 +723,7 @@ Vector<Sensor> SensorService::getSensorList(const String16& opPackageName)
    Vector<Sensor> accessibleSensorList;
    Vector<Sensor> accessibleSensorList;
    for (size_t i = 0; i < initialSensorList.size(); i++) {
    for (size_t i = 0; i < initialSensorList.size(); i++) {
        Sensor sensor = initialSensorList[i];
        Sensor sensor = initialSensorList[i];
        if (canAccessSensor(sensor, "getSensorList", opPackageName)) {
        accessibleSensorList.add(sensor);
        accessibleSensorList.add(sensor);
        } else {
            ALOGI("Skipped sensor %s because it requires permission %s and app op %d",
                  sensor.getName().string(),
                  sensor.getRequiredPermission().string(),
                  sensor.getRequiredAppOp());
        }
    }
    }
    return accessibleSensorList;
    return accessibleSensorList;
}
}