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

Commit e8da2d3a authored by Chris Ye's avatar Chris Ye
Browse files

Move KeyCharacterMap from RefBase to shared_ptr.

Move KeyCharacterMap from RefBase and make it shared_ptr in it's owner
class like EventHub and InputDeviceInfo. When loaded from file, KeyCharacterMap
as shared_ptr is stored in both InputDeviceInfo and EventHub device.

Bug: 160010896
Test: atest inputflinger, atest libinput_tests
Change-Id: Ib3c489c3e87e04d68e4681994e430e43aa46164b
parent dc275f8c
Loading
Loading
Loading
Loading
+25 −29
Original line number Diff line number Diff line
@@ -47,9 +47,8 @@ static struct {

class NativeKeyCharacterMap {
public:
    NativeKeyCharacterMap(int32_t deviceId, const sp<KeyCharacterMap>& map) :
        mDeviceId(deviceId), mMap(map) {
    }
    NativeKeyCharacterMap(int32_t deviceId, std::shared_ptr<KeyCharacterMap> map)
          : mDeviceId(deviceId), mMap(std::move(map)) {}

    ~NativeKeyCharacterMap() {
    }
@@ -58,26 +57,22 @@ public:
        return mDeviceId;
    }

    inline const sp<KeyCharacterMap>& getMap() const {
        return mMap;
    }
    inline const std::shared_ptr<KeyCharacterMap> getMap() const { return mMap; }

private:
    int32_t mDeviceId;
    sp<KeyCharacterMap> mMap;
    std::shared_ptr<KeyCharacterMap> mMap;
};


jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
        const sp<KeyCharacterMap>& kcm) {
    NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId,
            kcm.get() ? kcm : KeyCharacterMap::empty());
    if (!map) {
        return NULL;
                                            const std::shared_ptr<KeyCharacterMap> kcm) {
    NativeKeyCharacterMap* nativeMap = new NativeKeyCharacterMap(deviceId, kcm);
    if (!nativeMap) {
        return nullptr;
    }

    return env->NewObject(gKeyCharacterMapClassInfo.clazz, gKeyCharacterMapClassInfo.ctor,
            reinterpret_cast<jlong>(map));
                          reinterpret_cast<jlong>(nativeMap));
}

static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) {
@@ -91,7 +86,7 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj)
        return 0;
    }

    sp<KeyCharacterMap> kcm = KeyCharacterMap::readFromParcel(parcel);
    std::shared_ptr<KeyCharacterMap> kcm = KeyCharacterMap::readFromParcel(parcel);
    if (!kcm.get()) {
        return 0;
    }
@@ -102,6 +97,9 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj)

static void nativeWriteToParcel(JNIEnv* env, jobject clazz, jlong ptr, jobject parcelObj) {
    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
    if (!map->getMap()) {
        return;
    }
    Parcel* parcel = parcelForJavaObject(env, parcelObj);
    if (parcel) {
        parcel->writeInt32(map->getDeviceId());
@@ -150,9 +148,8 @@ static jchar nativeGetMatch(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode,
        return 0;
    }

    char16_t result = map->getMap()->getMatch(
        keyCode, reinterpret_cast<char16_t*>(chars), size_t(numChars),
        metaState);
    char16_t result = map->getMap()->getMatch(keyCode, reinterpret_cast<char16_t*>(chars),
                                              size_t(numChars), metaState);

    env->ReleasePrimitiveArrayCritical(charsArray, chars, JNI_ABORT);
    return result;
@@ -180,8 +177,7 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr,

    Vector<KeyEvent> events;
    jobjectArray result = NULL;
    if (map->getMap()->getEvents(map->getDeviceId(),
                                 reinterpret_cast<char16_t*>(chars),
    if (map->getMap()->getEvents(map->getDeviceId(), reinterpret_cast<char16_t*>(chars),
                                 size_t(numChars), events)) {
        result = env->NewObjectArray(jsize(events.size()), gKeyEventClassInfo.clazz, NULL);
        if (result) {
+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ namespace android {

/* Creates a KeyCharacterMap object from the given information. */
extern jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
        const sp<KeyCharacterMap>& map);
                                                   const std::shared_ptr<KeyCharacterMap> kcm);

} // namespace android

+10 −5
Original line number Diff line number Diff line
@@ -233,7 +233,8 @@ public:
    virtual void getReaderConfiguration(InputReaderConfiguration* outConfig);
    virtual std::shared_ptr<PointerControllerInterface> obtainPointerController(int32_t deviceId);
    virtual void notifyInputDevicesChanged(const std::vector<InputDeviceInfo>& inputDevices);
    virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier& identifier);
    virtual std::shared_ptr<KeyCharacterMap> getKeyboardLayoutOverlay(
            const InputDeviceIdentifier& identifier);
    virtual std::string getDeviceAlias(const InputDeviceIdentifier& identifier);
    virtual TouchAffineTransformation getTouchAffineTransformation(JNIEnv *env,
            jfloatArray matrixArr);
@@ -622,12 +623,12 @@ void NativeInputManager::notifyInputDevicesChanged(const std::vector<InputDevice
    checkAndClearExceptionFromCallback(env, "notifyInputDevicesChanged");
}

sp<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay(
std::shared_ptr<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay(
        const InputDeviceIdentifier& identifier) {
    ATRACE_CALL();
    JNIEnv* env = jniEnv();

    sp<KeyCharacterMap> result;
    std::shared_ptr<KeyCharacterMap> result;
    ScopedLocalRef<jstring> descriptor(env, env->NewStringUTF(identifier.descriptor.c_str()));
    ScopedLocalRef<jobject> identifierObj(env, env->NewObject(gInputDeviceIdentifierInfo.clazz,
            gInputDeviceIdentifierInfo.constructor, descriptor.get(),
@@ -642,8 +643,12 @@ sp<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay(
        ScopedUtfChars filenameChars(env, filenameObj.get());
        ScopedUtfChars contentsChars(env, contentsObj.get());

        KeyCharacterMap::loadContents(filenameChars.c_str(),
                contentsChars.c_str(), KeyCharacterMap::FORMAT_OVERLAY, &result);
        base::Result<std::shared_ptr<KeyCharacterMap>> ret =
                KeyCharacterMap::loadContents(filenameChars.c_str(), contentsChars.c_str(),
                                              KeyCharacterMap::FORMAT_OVERLAY);
        if (ret) {
            result = *ret;
        }
    }
    checkAndClearExceptionFromCallback(env, "getKeyboardLayoutOverlay");
    return result;
+4 −5
Original line number Diff line number Diff line
@@ -105,11 +105,10 @@ static bool validateFile(const char* filename) {
    }

    case FILETYPE_KEYCHARACTERMAP: {
        sp<KeyCharacterMap> map;
        status_t status = KeyCharacterMap::load(filename,
                KeyCharacterMap::FORMAT_ANY, &map);
        if (status) {
            error("Error %d parsing key character map file.\n\n", status);
        base::Result<std::shared_ptr<KeyCharacterMap>> ret = KeyCharacterMap::load(filename,
                KeyCharacterMap::FORMAT_ANY);
        if (!ret) {
            error("Error %s parsing key character map file.\n\n", ret.error().message().c_str());
            return false;
        }
        break;