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

Commit d9505841 authored by Harry Cutts's avatar Harry Cutts
Browse files

uinput: set device version IDs from evemu files

Bug: 302297266
Test: atest UinputTests
Test: play a recording with version ID set, check `getevent -li` output
      while it's running
Change-Id: Idd3b6166a3912c26720dddbf4ad72b5a07a604a5
parent 45094325
Loading
Loading
Loading
Loading
+12 −11
Original line number Original line Diff line number Diff line
@@ -96,9 +96,9 @@ JNIEnv* DeviceCallback::getJNIEnv() {
    return env;
    return env;
}
}


std::unique_ptr<UinputDevice> UinputDevice::open(int32_t id, const char* name, int32_t vid,
std::unique_ptr<UinputDevice> UinputDevice::open(int32_t id, const char* name, int32_t vendorId,
                                                 int32_t pid, uint16_t bus, uint32_t ffEffectsMax,
                                                 int32_t productId, int32_t versionId, uint16_t bus,
                                                 const char* port,
                                                 uint32_t ffEffectsMax, const char* port,
                                                 std::unique_ptr<DeviceCallback> callback) {
                                                 std::unique_ptr<DeviceCallback> callback) {
    android::base::unique_fd fd(::open(UINPUT_PATH, O_RDWR | O_NONBLOCK | O_CLOEXEC));
    android::base::unique_fd fd(::open(UINPUT_PATH, O_RDWR | O_NONBLOCK | O_CLOEXEC));
    if (!fd.ok()) {
    if (!fd.ok()) {
@@ -118,8 +118,9 @@ std::unique_ptr<UinputDevice> UinputDevice::open(int32_t id, const char* name, i
    strlcpy(setupDescriptor.name, name, UINPUT_MAX_NAME_SIZE);
    strlcpy(setupDescriptor.name, name, UINPUT_MAX_NAME_SIZE);
    setupDescriptor.id.version = 1;
    setupDescriptor.id.version = 1;
    setupDescriptor.id.bustype = bus;
    setupDescriptor.id.bustype = bus;
    setupDescriptor.id.vendor = vid;
    setupDescriptor.id.vendor = vendorId;
    setupDescriptor.id.product = pid;
    setupDescriptor.id.product = productId;
    setupDescriptor.id.version = versionId;
    setupDescriptor.ff_effects_max = ffEffectsMax;
    setupDescriptor.ff_effects_max = ffEffectsMax;


    // Request device configuration.
    // Request device configuration.
@@ -242,9 +243,9 @@ std::vector<int32_t> toVector(JNIEnv* env, jintArray javaArray) {
    return data;
    return data;
}
}


static jlong openUinputDevice(JNIEnv* env, jclass /* clazz */, jstring rawName, jint id, jint vid,
static jlong openUinputDevice(JNIEnv* env, jclass /* clazz */, jstring rawName, jint id,
                              jint pid, jint bus, jint ffEffectsMax, jstring rawPort,
                              jint vendorId, jint productId, jint versionId, jint bus,
                              jobject callback) {
                              jint ffEffectsMax, jstring rawPort, jobject callback) {
    ScopedUtfChars name(env, rawName);
    ScopedUtfChars name(env, rawName);
    if (name.c_str() == nullptr) {
    if (name.c_str() == nullptr) {
        return 0;
        return 0;
@@ -255,8 +256,8 @@ static jlong openUinputDevice(JNIEnv* env, jclass /* clazz */, jstring rawName,
            std::make_unique<uinput::DeviceCallback>(env, callback);
            std::make_unique<uinput::DeviceCallback>(env, callback);


    std::unique_ptr<uinput::UinputDevice> d =
    std::unique_ptr<uinput::UinputDevice> d =
            uinput::UinputDevice::open(id, name.c_str(), vid, pid, bus, ffEffectsMax, port.c_str(),
            uinput::UinputDevice::open(id, name.c_str(), vendorId, productId, versionId, bus,
                                       std::move(cb));
                                       ffEffectsMax, port.c_str(), std::move(cb));
    return reinterpret_cast<jlong>(d.release());
    return reinterpret_cast<jlong>(d.release());
}
}


@@ -326,7 +327,7 @@ static jint getEvdevInputPropByLabel(JNIEnv* env, jclass /* clazz */, jstring ra


static JNINativeMethod sMethods[] = {
static JNINativeMethod sMethods[] = {
        {"nativeOpenUinputDevice",
        {"nativeOpenUinputDevice",
         "(Ljava/lang/String;IIIIILjava/lang/String;"
         "(Ljava/lang/String;IIIIIILjava/lang/String;"
         "Lcom/android/commands/uinput/Device$DeviceCallback;)J",
         "Lcom/android/commands/uinput/Device$DeviceCallback;)J",
         reinterpret_cast<void*>(openUinputDevice)},
         reinterpret_cast<void*>(openUinputDevice)},
        {"nativeInjectEvent", "(JIII)V", reinterpret_cast<void*>(injectEvent)},
        {"nativeInjectEvent", "(JIII)V", reinterpret_cast<void*>(injectEvent)},
+3 −3
Original line number Original line Diff line number Diff line
@@ -46,9 +46,9 @@ private:


class UinputDevice {
class UinputDevice {
public:
public:
    static std::unique_ptr<UinputDevice> open(int32_t id, const char* name, int32_t vid,
    static std::unique_ptr<UinputDevice> open(int32_t id, const char* name, int32_t vendorId,
                                              int32_t pid, uint16_t bus, uint32_t ff_effects_max,
                                              int32_t productId, int32_t versionId, uint16_t bus,
                                              const char* port,
                                              uint32_t ff_effects_max, const char* port,
                                              std::unique_ptr<DeviceCallback> callback);
                                              std::unique_ptr<DeviceCallback> callback);


    virtual ~UinputDevice();
    virtual ~UinputDevice();
+15 −11
Original line number Original line Diff line number Diff line
@@ -61,8 +61,9 @@ public class Device {
        System.loadLibrary("uinputcommand_jni");
        System.loadLibrary("uinputcommand_jni");
    }
    }


    private static native long nativeOpenUinputDevice(String name, int id, int vid, int pid,
    private static native long nativeOpenUinputDevice(String name, int id, int vendorId,
            int bus, int ffEffectsMax, String port, DeviceCallback callback);
            int productId, int versionId, int bus, int ffEffectsMax, String port,
            DeviceCallback callback);
    private static native void nativeCloseUinputDevice(long ptr);
    private static native void nativeCloseUinputDevice(long ptr);
    private static native void nativeInjectEvent(long ptr, int type, int code, int value);
    private static native void nativeInjectEvent(long ptr, int type, int code, int value);
    private static native void nativeConfigure(int handle, int code, int[] configs);
    private static native void nativeConfigure(int handle, int code, int[] configs);
@@ -71,7 +72,7 @@ public class Device {
    private static native int nativeGetEvdevEventCodeByLabel(int type, String label);
    private static native int nativeGetEvdevEventCodeByLabel(int type, String label);
    private static native int nativeGetEvdevInputPropByLabel(String label);
    private static native int nativeGetEvdevInputPropByLabel(String label);


    public Device(int id, String name, int vid, int pid, int bus,
    public Device(int id, String name, int vendorId, int productId, int versionId, int bus,
            SparseArray<int[]> configuration, int ffEffectsMax,
            SparseArray<int[]> configuration, int ffEffectsMax,
            SparseArray<InputAbsInfo> absInfo, String port) {
            SparseArray<InputAbsInfo> absInfo, String port) {
        mId = id;
        mId = id;
@@ -83,19 +84,20 @@ public class Device {
        mOutputStream = System.out;
        mOutputStream = System.out;
        SomeArgs args = SomeArgs.obtain();
        SomeArgs args = SomeArgs.obtain();
        args.argi1 = id;
        args.argi1 = id;
        args.argi2 = vid;
        args.argi2 = vendorId;
        args.argi3 = pid;
        args.argi3 = productId;
        args.argi4 = bus;
        args.argi4 = versionId;
        args.argi5 = ffEffectsMax;
        args.argi5 = bus;
        args.argi6 = ffEffectsMax;
        if (name != null) {
        if (name != null) {
            args.arg1 = name;
            args.arg1 = name;
        } else {
        } else {
            args.arg1 = id + ":" + vid + ":" + pid;
            args.arg1 = id + ":" + vendorId + ":" + productId;
        }
        }
        if (port != null) {
        if (port != null) {
            args.arg2 = port;
            args.arg2 = port;
        } else {
        } else {
            args.arg2 = "uinput:" + id + ":" + vid + ":" + pid;
            args.arg2 = "uinput:" + id + ":" + vendorId + ":" + productId;
        }
        }


        mHandler.obtainMessage(MSG_OPEN_UINPUT_DEVICE, args).sendToTarget();
        mHandler.obtainMessage(MSG_OPEN_UINPUT_DEVICE, args).sendToTarget();
@@ -161,8 +163,10 @@ public class Device {
                case MSG_OPEN_UINPUT_DEVICE:
                case MSG_OPEN_UINPUT_DEVICE:
                    SomeArgs args = (SomeArgs) msg.obj;
                    SomeArgs args = (SomeArgs) msg.obj;
                    String name = (String) args.arg1;
                    String name = (String) args.arg1;
                    mPtr = nativeOpenUinputDevice(name, args.argi1, args.argi2,
                    mPtr = nativeOpenUinputDevice(name, args.argi1 /* id */,
                            args.argi3, args.argi4, args.argi5, (String) args.arg2,
                            args.argi2 /* vendorId */, args.argi3 /* productId */,
                            args.argi4 /* versionId */, args.argi5 /* bus */,
                            args.argi6 /* ffEffectsMax */, (String) args.arg2 /* port */,
                            new DeviceCallback());
                            new DeviceCallback());
                    if (mPtr == 0) {
                    if (mPtr == 0) {
                        RuntimeException ex = new RuntimeException(
                        RuntimeException ex = new RuntimeException(
+3 −3
Original line number Original line Diff line number Diff line
@@ -224,9 +224,9 @@ public class EvemuParser implements EventParser {
        final String idsLine = expectLine("I");
        final String idsLine = expectLine("I");
        final String[] idStrings = expectParts(idsLine, 4);
        final String[] idStrings = expectParts(idsLine, 4);
        eb.setBusId(parseInt(idStrings[0], 16));
        eb.setBusId(parseInt(idStrings[0], 16));
        eb.setVid(parseInt(idStrings[1], 16));
        eb.setVendorId(parseInt(idStrings[1], 16));
        eb.setPid(parseInt(idStrings[2], 16));
        eb.setProductId(parseInt(idStrings[2], 16));
        // TODO(b/302297266): support setting the version ID, and set it to idStrings[3].
        eb.setVersionId(parseInt(idStrings[3], 16));


        final SparseArray<int[]> config = new SparseArray<>();
        final SparseArray<int[]> config = new SparseArray<>();
        config.append(Event.UinputControlCode.UI_SET_PROPBIT.getValue(), parseProperties());
        config.append(Event.UinputControlCode.UI_SET_PROPBIT.getValue(), parseProperties());
+19 −10
Original line number Original line Diff line number Diff line
@@ -94,8 +94,9 @@ public class Event {
    private int mId;
    private int mId;
    private Command mCommand;
    private Command mCommand;
    private String mName;
    private String mName;
    private int mVid;
    private int mVendorId;
    private int mPid;
    private int mProductId;
    private int mVersionId;
    private int mBusId;
    private int mBusId;
    private int[] mInjections;
    private int[] mInjections;
    private SparseArray<int[]> mConfiguration;
    private SparseArray<int[]> mConfiguration;
@@ -118,11 +119,15 @@ public class Event {
    }
    }


    public int getVendorId() {
    public int getVendorId() {
        return mVid;
        return mVendorId;
    }
    }


    public int getProductId() {
    public int getProductId() {
        return mPid;
        return mProductId;
    }

    public int getVersionId() {
        return mVersionId;
    }
    }


    public int getBus() {
    public int getBus() {
@@ -172,8 +177,8 @@ public class Event {
        return "Event{id=" + mId
        return "Event{id=" + mId
            + ", command=" + mCommand
            + ", command=" + mCommand
            + ", name=" + mName
            + ", name=" + mName
            + ", vid=" + mVid
            + ", vid=" + mVendorId
            + ", pid=" + mPid
            + ", pid=" + mProductId
            + ", busId=" + mBusId
            + ", busId=" + mBusId
            + ", events=" + Arrays.toString(mInjections)
            + ", events=" + Arrays.toString(mInjections)
            + ", configuration=" + mConfiguration
            + ", configuration=" + mConfiguration
@@ -216,12 +221,16 @@ public class Event {
            mEvent.mConfiguration = configuration;
            mEvent.mConfiguration = configuration;
        }
        }


        public void setVid(int vid) {
        public void setVendorId(int vendorId) {
            mEvent.mVid = vid;
            mEvent.mVendorId = vendorId;
        }

        public void setProductId(int productId) {
            mEvent.mProductId = productId;
        }
        }


        public void setPid(int pid) {
        public void setVersionId(int versionId) {
            mEvent.mPid = pid;
            mEvent.mVersionId = versionId;
        }
        }


        public void setBusId(int busId) {
        public void setBusId(int busId) {
Loading