summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Siarhei Vishniakou <svv@google.com> 2023-10-24 14:22:58 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-10-24 14:22:58 +0000
commit81083c17be1199f97ba4532848269864bab14e1c (patch)
tree7995730874778912b5bcba5edb57656de2c8bb6d
parenta5eb4588a25aa5fb5cea5c3889c009033d1b2503 (diff)
parentcb2581e62b3d6ee7c439d5484c3c8dcabeb19730 (diff)
Merge "Receive owned copy of KeyCharacterMap in InputDevice" into main
-rw-r--r--core/jni/android_view_InputDevice.cpp14
-rw-r--r--core/jni/android_view_KeyCharacterMap.cpp20
-rw-r--r--core/jni/android_view_KeyCharacterMap.h2
3 files changed, 18 insertions, 18 deletions
diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp
index f97d41b6a122..262f5e8e761e 100644
--- a/core/jni/android_view_InputDevice.cpp
+++ b/core/jni/android_view_InputDevice.cpp
@@ -42,13 +42,6 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi
return NULL;
}
- // b/274058082: Pass a copy of the key character map to avoid concurrent
- // access
- std::shared_ptr<KeyCharacterMap> map = deviceInfo.getKeyCharacterMap();
- if (map != nullptr) {
- map = std::make_shared<KeyCharacterMap>(*map);
- }
-
ScopedLocalRef<jstring> descriptorObj(env,
env->NewStringUTF(deviceInfo.getIdentifier().descriptor.c_str()));
if (!descriptorObj.get()) {
@@ -67,9 +60,14 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi
? layoutInfo->layoutType.c_str()
: NULL));
+ std::shared_ptr<KeyCharacterMap> map = deviceInfo.getKeyCharacterMap();
+ std::unique_ptr<KeyCharacterMap> mapCopy;
+ if (map != nullptr) {
+ mapCopy = std::make_unique<KeyCharacterMap>(*map);
+ }
ScopedLocalRef<jobject> kcmObj(env,
android_view_KeyCharacterMap_create(env, deviceInfo.getId(),
- map));
+ std::move(mapCopy)));
if (!kcmObj.get()) {
return NULL;
}
diff --git a/core/jni/android_view_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp
index 7f69e22fb0d1..a79e37afd4cd 100644
--- a/core/jni/android_view_KeyCharacterMap.cpp
+++ b/core/jni/android_view_KeyCharacterMap.cpp
@@ -48,7 +48,7 @@ static struct {
class NativeKeyCharacterMap {
public:
- NativeKeyCharacterMap(int32_t deviceId, std::shared_ptr<KeyCharacterMap> map)
+ NativeKeyCharacterMap(int32_t deviceId, std::unique_ptr<KeyCharacterMap> map)
: mDeviceId(deviceId), mMap(std::move(map)) {}
~NativeKeyCharacterMap() {
@@ -58,16 +58,18 @@ public:
return mDeviceId;
}
- inline const std::shared_ptr<KeyCharacterMap> getMap() const { return mMap; }
+ inline const std::unique_ptr<KeyCharacterMap>& getMap() const {
+ return mMap;
+ }
private:
int32_t mDeviceId;
- std::shared_ptr<KeyCharacterMap> mMap;
+ std::unique_ptr<KeyCharacterMap> mMap;
};
jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
- const std::shared_ptr<KeyCharacterMap> kcm) {
- NativeKeyCharacterMap* nativeMap = new NativeKeyCharacterMap(deviceId, kcm);
+ std::unique_ptr<KeyCharacterMap> kcm) {
+ NativeKeyCharacterMap* nativeMap = new NativeKeyCharacterMap(deviceId, std::move(kcm));
if (!nativeMap) {
return nullptr;
}
@@ -91,7 +93,7 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj)
return 0;
}
- std::shared_ptr<KeyCharacterMap> kcm = nullptr;
+ std::unique_ptr<KeyCharacterMap> kcm;
// Check if map is a null character map
if (parcel->readBool()) {
kcm = KeyCharacterMap::readFromParcel(parcel);
@@ -99,7 +101,7 @@ static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj)
return 0;
}
}
- NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm);
+ NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, std::move(kcm));
return reinterpret_cast<jlong>(map);
}
@@ -230,9 +232,9 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr,
}
static jboolean nativeEquals(JNIEnv* env, jobject clazz, jlong ptr1, jlong ptr2) {
- const std::shared_ptr<KeyCharacterMap>& map1 =
+ const std::unique_ptr<KeyCharacterMap>& map1 =
(reinterpret_cast<NativeKeyCharacterMap*>(ptr1))->getMap();
- const std::shared_ptr<KeyCharacterMap>& map2 =
+ const std::unique_ptr<KeyCharacterMap>& map2 =
(reinterpret_cast<NativeKeyCharacterMap*>(ptr2))->getMap();
if (map1 == nullptr || map2 == nullptr) {
return map1 == map2;
diff --git a/core/jni/android_view_KeyCharacterMap.h b/core/jni/android_view_KeyCharacterMap.h
index be0335380f87..a8aabd1d464a 100644
--- a/core/jni/android_view_KeyCharacterMap.h
+++ b/core/jni/android_view_KeyCharacterMap.h
@@ -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 std::shared_ptr<KeyCharacterMap> kcm);
+ std::unique_ptr<KeyCharacterMap> kcm);
} // namespace android