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

Commit d80e3bfd authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Create KCM copy when manipulating contents per language

Earlier we were using Virtual KCM and applying an overlay
KCM on it which was updating the keys map (from the
caller thread) which can corrupt the data.

We should not touch Virtual KCM file which can be
accessed from multiple processes, just create a copy
and manipulate the copy instead.

Test: manual
Bug: 407036640
Flag: EXEMPT bugfix
Change-Id: I50f1d142ea7a2eac3ed613a2d9cae3acd8bba354
parent 70014ef9
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -313,8 +313,8 @@ public class KeyCharacterMap implements Parcelable {
    private static native KeyCharacterMap nativeObtainEmptyKeyCharacterMap(int deviceId);
    private static native boolean nativeEquals(long ptr1, long ptr2);

    private static native void nativeApplyOverlay(long ptr, String layoutDescriptor,
            String overlay);
    private static native KeyCharacterMap nativeObtainMapWithOverlay(long ptrForBaseMap,
            String layoutDescriptor, String overlay);
    private static native int nativeGetMappedKey(long ptr, int scanCode);

    private KeyCharacterMap(Parcel in) {
@@ -387,13 +387,13 @@ public class KeyCharacterMap implements Parcelable {
     * @hide
     */
    public static KeyCharacterMap load(@NonNull String layoutDescriptor, @NonNull String overlay) {
        KeyCharacterMap kcm = KeyCharacterMap.load(VIRTUAL_KEYBOARD);
        kcm.applyOverlay(layoutDescriptor, overlay);
        return kcm;
        KeyCharacterMap virtualKcm = KeyCharacterMap.load(VIRTUAL_KEYBOARD);
        KeyCharacterMap kcmWithOverlay = nativeObtainMapWithOverlay(virtualKcm.mPtr,
                layoutDescriptor, overlay);
        if (kcmWithOverlay == null) {
            return virtualKcm;
        }

    private void applyOverlay(@NonNull String layoutDescriptor, @NonNull String overlay) {
        nativeApplyOverlay(mPtr, layoutDescriptor, overlay);
        return kcmWithOverlay;
    }

    /**
+13 −9
Original line number Diff line number Diff line
@@ -242,21 +242,24 @@ static jboolean nativeEquals(JNIEnv* env, jobject clazz, jlong ptr1, jlong ptr2)
    return static_cast<jboolean>(*map1 == *map2);
}

static void nativeApplyOverlay(JNIEnv* env, jobject clazz, jlong ptr, jstring nameObj,
        jstring overlayObj) {
    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr);
static jobject nativeObtainMapWithOverlay(JNIEnv* env, jobject clazz, jlong baseMapPtr,
                                          jstring nameObj, jstring overlayObj) {
    NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(baseMapPtr);
    if (!map || !map->getMap()) {
        return;
        return nullptr;
    }
    ScopedUtfChars nameChars(env, nameObj);
    ScopedUtfChars overlayChars(env, overlayObj);
    base::Result<std::shared_ptr<KeyCharacterMap>> ret =
            KeyCharacterMap::loadContents(nameChars.c_str(), overlayChars.c_str(),
                                          KeyCharacterMap::Format::OVERLAY);
    if (ret.ok()) {
        std::shared_ptr<KeyCharacterMap> overlay = *ret;
        map->getMap()->combine(*overlay);
    if (!ret.ok()) {
        return nullptr;
    }
    std::shared_ptr<KeyCharacterMap> overlay = *ret;
    std::unique_ptr<KeyCharacterMap> result = std::make_unique<KeyCharacterMap>(*map->getMap());
    result->combine(*overlay);
    return android_view_KeyCharacterMap_create(env, map->getDeviceId(), std::move(result));
}

static jint nativeGetMappedKey(JNIEnv* env, jobject clazz, jlong ptr, jint scanCode) {
@@ -292,8 +295,9 @@ static const JNINativeMethod g_methods[] = {
        {"nativeObtainEmptyKeyCharacterMap", "(I)Landroid/view/KeyCharacterMap;",
         (void*)nativeObtainEmptyKeyCharacterMap},
        {"nativeEquals", "(JJ)Z", (void*)nativeEquals},
        {"nativeApplyOverlay", "(JLjava/lang/String;Ljava/lang/String;)V",
         (void*)nativeApplyOverlay},
        {"nativeObtainMapWithOverlay",
         "(JLjava/lang/String;Ljava/lang/String;)Landroid/view/KeyCharacterMap;",
         (void*)nativeObtainMapWithOverlay},
        {"nativeGetMappedKey", "(JI)I", (void*)nativeGetMappedKey}};

int register_android_view_KeyCharacterMap(JNIEnv* env)