Merge "Add coretest for android.view.InputDevice." into sc-dev

This commit is contained in:
Chris Ye
2021-03-12 21:58:59 +00:00
committed by Android (Google) Code Review
4 changed files with 168 additions and 29 deletions

View File

@@ -16,6 +16,7 @@
package android.view;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.hardware.input.InputManager;
import android.os.Build;
@@ -25,6 +26,8 @@ import android.text.method.MetaKeyKeyListener;
import android.util.AndroidRuntimeException;
import android.util.SparseIntArray;
import com.android.internal.annotations.VisibleForTesting;
import java.text.Normalizer;
/**
@@ -297,6 +300,8 @@ public class KeyCharacterMap implements Parcelable {
private static native char nativeGetDisplayLabel(long ptr, int keyCode);
private static native int nativeGetKeyboardType(long ptr);
private static native KeyEvent[] nativeGetEvents(long ptr, char[] chars);
private static native KeyCharacterMap nativeObtainEmptyKeyCharacterMap(int deviceId);
private static native boolean nativeEquals(long ptr1, long ptr2);
private KeyCharacterMap(Parcel in) {
if (in == null) {
@@ -322,6 +327,18 @@ public class KeyCharacterMap implements Parcelable {
}
}
/**
* Obtain empty key character map
* @param deviceId The input device ID
* @return The KeyCharacterMap object
* @hide
*/
@VisibleForTesting
@Nullable
public static KeyCharacterMap obtainEmptyMap(int deviceId) {
return nativeObtainEmptyKeyCharacterMap(deviceId);
}
/**
* Loads the key character maps for the keyboard with the specified device id.
*
@@ -729,6 +746,18 @@ public class KeyCharacterMap implements Parcelable {
return 0;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof KeyCharacterMap)) {
return false;
}
KeyCharacterMap peer = (KeyCharacterMap) obj;
if (mPtr == 0 || peer.mPtr == 0) {
return mPtr == peer.mPtr;
}
return nativeEquals(mPtr, peer.mPtr);
}
/**
* Thrown by {@link KeyCharacterMap#load} when a key character map could not be loaded.
*/

View File

@@ -16,9 +16,10 @@
#include <android_runtime/AndroidRuntime.h>
#include <input/KeyCharacterMap.h>
#include <input/Input.h>
#include <binder/Parcel.h>
#include <input/Input.h>
#include <input/InputDevice.h>
#include <input/KeyCharacterMap.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
@@ -75,6 +76,10 @@ jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
reinterpret_cast<jlong>(nativeMap));
}
static jobject nativeObtainEmptyKeyCharacterMap(JNIEnv* env, jobject /* clazz */, jint deviceId) {
return android_view_KeyCharacterMap_create(env, deviceId, nullptr);
}
static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) {
Parcel* parcel = parcelForJavaObject(env, parcelObj);
if (!parcel) {
@@ -224,33 +229,37 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr,
return result;
}
static jboolean nativeEquals(JNIEnv* env, jobject clazz, jlong ptr1, jlong ptr2) {
const std::shared_ptr<KeyCharacterMap>& map1 =
(reinterpret_cast<NativeKeyCharacterMap*>(ptr1))->getMap();
const std::shared_ptr<KeyCharacterMap>& map2 =
(reinterpret_cast<NativeKeyCharacterMap*>(ptr2))->getMap();
if (map1 == nullptr || map2 == nullptr) {
return map1 == map2;
}
return static_cast<jboolean>(*map1 == *map2);
}
/*
* JNI registration.
*/
static const JNINativeMethod g_methods[] = {
/* name, signature, funcPtr */
{ "nativeReadFromParcel", "(Landroid/os/Parcel;)J",
(void*)nativeReadFromParcel },
{ "nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
(void*)nativeWriteToParcel },
{ "nativeDispose", "(J)V",
(void*)nativeDispose },
{ "nativeGetCharacter", "(JII)C",
(void*)nativeGetCharacter },
{ "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z",
(void*)nativeGetFallbackAction },
{ "nativeGetNumber", "(JI)C",
(void*)nativeGetNumber },
{ "nativeGetMatch", "(JI[CI)C",
(void*)nativeGetMatch },
{ "nativeGetDisplayLabel", "(JI)C",
(void*)nativeGetDisplayLabel },
{ "nativeGetKeyboardType", "(J)I",
(void*)nativeGetKeyboardType },
{ "nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;",
(void*)nativeGetEvents },
/* name, signature, funcPtr */
{"nativeReadFromParcel", "(Landroid/os/Parcel;)J", (void*)nativeReadFromParcel},
{"nativeWriteToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteToParcel},
{"nativeDispose", "(J)V", (void*)nativeDispose},
{"nativeGetCharacter", "(JII)C", (void*)nativeGetCharacter},
{"nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z",
(void*)nativeGetFallbackAction},
{"nativeGetNumber", "(JI)C", (void*)nativeGetNumber},
{"nativeGetMatch", "(JI[CI)C", (void*)nativeGetMatch},
{"nativeGetDisplayLabel", "(JI)C", (void*)nativeGetDisplayLabel},
{"nativeGetKeyboardType", "(J)I", (void*)nativeGetKeyboardType},
{"nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;", (void*)nativeGetEvents},
{"nativeObtainEmptyKeyCharacterMap", "(I)Landroid/view/KeyCharacterMap;",
(void*)nativeObtainEmptyKeyCharacterMap},
{"nativeEquals", "(JJ)Z", (void*)nativeEquals},
};
int register_android_view_KeyCharacterMap(JNIEnv* env)

View File

@@ -9,14 +9,17 @@ package {
android_test {
name: "InputTests",
srcs: ["src/**/*.kt"],
srcs: [
"src/**/*.java",
"src/**/*.kt",
],
platform_apis: true,
certificate: "platform",
static_libs: [
"androidx.test.ext.junit",
"androidx.test.rules",
"truth-prebuilt",
"ub-uiautomator",
],
"androidx.test.ext.junit",
"androidx.test.rules",
"truth-prebuilt",
"ub-uiautomator",
],
test_suites: ["device-tests"],
}

View File

@@ -0,0 +1,98 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class InputDeviceTest {
private static final float DELTA = 0.01f;
private static final int DEVICE_ID = 1000;
private void assertMotionRangeEquals(InputDevice.MotionRange range,
InputDevice.MotionRange outRange) {
assertEquals(range.getAxis(), outRange.getAxis());
assertEquals(range.getSource(), outRange.getSource());
assertEquals(range.getMin(), outRange.getMin(), DELTA);
assertEquals(range.getMax(), outRange.getMax(), DELTA);
assertEquals(range.getFlat(), outRange.getFlat(), DELTA);
assertEquals(range.getFuzz(), outRange.getFuzz(), DELTA);
assertEquals(range.getResolution(), outRange.getResolution(), DELTA);
}
private void assertDeviceEquals(InputDevice device, InputDevice outDevice) {
assertEquals(device.getId(), outDevice.getId());
assertEquals(device.getGeneration(), outDevice.getGeneration());
assertEquals(device.getControllerNumber(), outDevice.getControllerNumber());
assertEquals(device.getName(), outDevice.getName());
assertEquals(device.getVendorId(), outDevice.getVendorId());
assertEquals(device.getProductId(), outDevice.getProductId());
assertEquals(device.getDescriptor(), outDevice.getDescriptor());
assertEquals(device.isExternal(), outDevice.isExternal());
assertEquals(device.getSources(), outDevice.getSources());
assertEquals(device.getKeyboardType(), outDevice.getKeyboardType());
assertEquals(device.getMotionRanges().size(), outDevice.getMotionRanges().size());
KeyCharacterMap keyCharacterMap = device.getKeyCharacterMap();
KeyCharacterMap outKeyCharacterMap = outDevice.getKeyCharacterMap();
assertTrue("keyCharacterMap not equal", keyCharacterMap.equals(outKeyCharacterMap));
for (int j = 0; j < device.getMotionRanges().size(); j++) {
assertMotionRangeEquals(device.getMotionRanges().get(j),
outDevice.getMotionRanges().get(j));
}
}
private void assertInputDeviceParcelUnparcel(KeyCharacterMap keyCharacterMap) {
final InputDevice device =
new InputDevice(DEVICE_ID, 0 /* generation */, 0 /* controllerNumber */, "name",
0 /* vendorId */, 0 /* productId */, "descriptor", true /* isExternal */,
0 /* sources */, 0 /* keyboardType */, keyCharacterMap,
false /* hasVibrator */, false /* hasMicrophone */, false /* hasButtonUnderpad */,
true /* hasSensor */, false /* hasBattery */);
Parcel parcel = Parcel.obtain();
device.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
InputDevice outDevice = InputDevice.CREATOR.createFromParcel(parcel);
assertDeviceEquals(device, outDevice);
}
@Test
public void testParcelUnparcelInputDevice_VirtualCharacterMap() {
final KeyCharacterMap keyCharacterMap =
KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
assertInputDeviceParcelUnparcel(keyCharacterMap);
}
@Test
public void testParcelUnparcelInputDevice_EmptyCharacterMap() {
final KeyCharacterMap keyCharacterMap = KeyCharacterMap.obtainEmptyMap(DEVICE_ID);
assertInputDeviceParcelUnparcel(keyCharacterMap);
}
}