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

Commit 08f41ad2 authored by Peng Xu's avatar Peng Xu Committed by Android (Google) Code Review
Browse files

Merge "Dynamic Sensor Discovery implementation"

parents 4e934436 2576cb63
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -207,6 +207,11 @@ typedef struct AHeartRateEvent {
  int8_t status;
} AHeartRateEvent;

typedef struct ADynamicSensorEvent {
    bool  connected;
    int   handle;
} ADynamicSensorEvent;

/* NOTE: Must match hardware/sensors.h */
typedef struct ASensorEvent {
    int32_t version; /* sizeof(struct ASensorEvent) */
@@ -229,6 +234,7 @@ typedef struct ASensorEvent {
            AUncalibratedEvent uncalibrated_magnetic;
            AMetaDataEvent meta_data;
            AHeartRateEvent heart_rate;
            ADynamicSensorEvent dynamic_sensor_meta;
        };
        union {
            uint64_t        data[8];
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ public:
    DECLARE_META_INTERFACE(SensorServer);

    virtual Vector<Sensor> getSensorList(const String16& opPackageName) = 0;
    virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName) = 0;

    virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
             int mode, const String16& opPackageName) = 0;
    virtual int32_t isDataInjectionEnabled() = 0;
+9 −3
Original line number Diff line number Diff line
@@ -52,6 +52,10 @@ public:
        TYPE_PROXIMITY      = ASENSOR_TYPE_PROXIMITY
    };

    typedef struct {
        uint8_t b[16];
    } uuid_t;

    Sensor();
    Sensor(struct sensor_t const* hwSensor, int halVersion = 0);
    ~Sensor();
@@ -77,6 +81,7 @@ public:
    uint32_t getFlags() const;
    bool isWakeUpSensor() const;
    int32_t getReportingMode() const;
    const uuid_t& getUuid() const;

    // LightFlattenable protocol
    inline bool isFixedSize() const { return false; }
@@ -103,6 +108,7 @@ private:
    int32_t mRequiredAppOp;
    int32_t mMaxDelay;
    uint32_t mFlags;
    uuid_t  mUuid;
    static void flattenString8(void*& buffer, size_t& size, const String8& string8);
    static bool unflattenString8(void const*& buffer, size_t& size, String8& outputString8);
};
+8 −7
Original line number Diff line number Diff line
@@ -54,7 +54,8 @@ public:
    static SensorManager& getInstanceForPackage(const String16& packageName);
    ~SensorManager();

    ssize_t getSensorList(Sensor const* const** list) const;
    ssize_t getSensorList(Sensor const* const** list);
    ssize_t getDynamicSensorList(Vector<Sensor>& list);
    Sensor const* getDefaultSensor(int type);
    sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0);
    bool isDataInjectionEnabled();
@@ -64,17 +65,17 @@ private:
    void sensorManagerDied();

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

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

    mutable Mutex mLock;
    mutable sp<ISensorServer> mSensorServer;
    mutable Sensor const** mSensorList;
    mutable Vector<Sensor> mSensors;
    mutable sp<IBinder::DeathRecipient> mDeathObserver;
    Mutex mLock;
    sp<ISensorServer> mSensorServer;
    Sensor const** mSensorList;
    Vector<Sensor> mSensors;
    sp<IBinder::DeathRecipient> mDeathObserver;
    const String16 mOpPackageName;
};

+30 −1
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ namespace android {
enum {
    GET_SENSOR_LIST = IBinder::FIRST_CALL_TRANSACTION,
    CREATE_SENSOR_EVENT_CONNECTION,
    ENABLE_DATA_INJECTION
    ENABLE_DATA_INJECTION,
    GET_DYNAMIC_SENSOR_LIST,
};

class BpSensorServer : public BpInterface<ISensorServer>
@@ -65,6 +66,23 @@ public:
        return v;
    }

    virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
        data.writeString16(opPackageName);
        remote()->transact(GET_DYNAMIC_SENSOR_LIST, data, &reply);
        Sensor s;
        Vector<Sensor> v;
        uint32_t n = reply.readUint32();
        v.setCapacity(n);
        while (n--) {
            reply.read(s);
            v.add(s);
        }
        return v;
    }

    virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
             int mode, const String16& opPackageName)
    {
@@ -124,6 +142,17 @@ status_t BnSensorServer::onTransact(
            reply->writeInt32(static_cast<int32_t>(ret));
            return NO_ERROR;
        }
        case GET_DYNAMIC_SENSOR_LIST: {
            CHECK_INTERFACE(ISensorServer, data, reply);
            const String16& opPackageName = data.readString16();
            Vector<Sensor> v(getDynamicSensorList(opPackageName));
            size_t n = v.size();
            reply->writeUint32(static_cast<uint32_t>(n));
            for (size_t i = 0; i < n; i++) {
                reply->write(v[i]);
            }
            return NO_ERROR;
        }
    }
    return BBinder::onTransact(code, data, reply, flags);
}
Loading