Merge "Add coretest for android.view.InputDevice." into sc-dev
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package android.view;
|
package android.view;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
import android.hardware.input.InputManager;
|
import android.hardware.input.InputManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -25,6 +26,8 @@ import android.text.method.MetaKeyKeyListener;
|
|||||||
import android.util.AndroidRuntimeException;
|
import android.util.AndroidRuntimeException;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import java.text.Normalizer;
|
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 char nativeGetDisplayLabel(long ptr, int keyCode);
|
||||||
private static native int nativeGetKeyboardType(long ptr);
|
private static native int nativeGetKeyboardType(long ptr);
|
||||||
private static native KeyEvent[] nativeGetEvents(long ptr, char[] chars);
|
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) {
|
private KeyCharacterMap(Parcel in) {
|
||||||
if (in == null) {
|
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.
|
* Loads the key character maps for the keyboard with the specified device id.
|
||||||
*
|
*
|
||||||
@@ -729,6 +746,18 @@ public class KeyCharacterMap implements Parcelable {
|
|||||||
return 0;
|
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.
|
* Thrown by {@link KeyCharacterMap#load} when a key character map could not be loaded.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -16,9 +16,10 @@
|
|||||||
|
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
|
|
||||||
#include <input/KeyCharacterMap.h>
|
|
||||||
#include <input/Input.h>
|
|
||||||
#include <binder/Parcel.h>
|
#include <binder/Parcel.h>
|
||||||
|
#include <input/Input.h>
|
||||||
|
#include <input/InputDevice.h>
|
||||||
|
#include <input/KeyCharacterMap.h>
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <nativehelper/JNIHelp.h>
|
#include <nativehelper/JNIHelp.h>
|
||||||
@@ -75,6 +76,10 @@ jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId,
|
|||||||
reinterpret_cast<jlong>(nativeMap));
|
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) {
|
static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) {
|
||||||
Parcel* parcel = parcelForJavaObject(env, parcelObj);
|
Parcel* parcel = parcelForJavaObject(env, parcelObj);
|
||||||
if (!parcel) {
|
if (!parcel) {
|
||||||
@@ -224,33 +229,37 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr,
|
|||||||
return result;
|
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.
|
* JNI registration.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const JNINativeMethod g_methods[] = {
|
static const JNINativeMethod g_methods[] = {
|
||||||
/* name, signature, funcPtr */
|
/* name, signature, funcPtr */
|
||||||
{ "nativeReadFromParcel", "(Landroid/os/Parcel;)J",
|
{"nativeReadFromParcel", "(Landroid/os/Parcel;)J", (void*)nativeReadFromParcel},
|
||||||
(void*)nativeReadFromParcel },
|
{"nativeWriteToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteToParcel},
|
||||||
{ "nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
|
{"nativeDispose", "(J)V", (void*)nativeDispose},
|
||||||
(void*)nativeWriteToParcel },
|
{"nativeGetCharacter", "(JII)C", (void*)nativeGetCharacter},
|
||||||
{ "nativeDispose", "(J)V",
|
{"nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z",
|
||||||
(void*)nativeDispose },
|
(void*)nativeGetFallbackAction},
|
||||||
{ "nativeGetCharacter", "(JII)C",
|
{"nativeGetNumber", "(JI)C", (void*)nativeGetNumber},
|
||||||
(void*)nativeGetCharacter },
|
{"nativeGetMatch", "(JI[CI)C", (void*)nativeGetMatch},
|
||||||
{ "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z",
|
{"nativeGetDisplayLabel", "(JI)C", (void*)nativeGetDisplayLabel},
|
||||||
(void*)nativeGetFallbackAction },
|
{"nativeGetKeyboardType", "(J)I", (void*)nativeGetKeyboardType},
|
||||||
{ "nativeGetNumber", "(JI)C",
|
{"nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;", (void*)nativeGetEvents},
|
||||||
(void*)nativeGetNumber },
|
{"nativeObtainEmptyKeyCharacterMap", "(I)Landroid/view/KeyCharacterMap;",
|
||||||
{ "nativeGetMatch", "(JI[CI)C",
|
(void*)nativeObtainEmptyKeyCharacterMap},
|
||||||
(void*)nativeGetMatch },
|
{"nativeEquals", "(JJ)Z", (void*)nativeEquals},
|
||||||
{ "nativeGetDisplayLabel", "(JI)C",
|
|
||||||
(void*)nativeGetDisplayLabel },
|
|
||||||
{ "nativeGetKeyboardType", "(J)I",
|
|
||||||
(void*)nativeGetKeyboardType },
|
|
||||||
{ "nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;",
|
|
||||||
(void*)nativeGetEvents },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int register_android_view_KeyCharacterMap(JNIEnv* env)
|
int register_android_view_KeyCharacterMap(JNIEnv* env)
|
||||||
|
|||||||
@@ -9,14 +9,17 @@ package {
|
|||||||
|
|
||||||
android_test {
|
android_test {
|
||||||
name: "InputTests",
|
name: "InputTests",
|
||||||
srcs: ["src/**/*.kt"],
|
srcs: [
|
||||||
|
"src/**/*.java",
|
||||||
|
"src/**/*.kt",
|
||||||
|
],
|
||||||
platform_apis: true,
|
platform_apis: true,
|
||||||
certificate: "platform",
|
certificate: "platform",
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"androidx.test.ext.junit",
|
"androidx.test.ext.junit",
|
||||||
"androidx.test.rules",
|
"androidx.test.rules",
|
||||||
"truth-prebuilt",
|
"truth-prebuilt",
|
||||||
"ub-uiautomator",
|
"ub-uiautomator",
|
||||||
],
|
],
|
||||||
test_suites: ["device-tests"],
|
test_suites: ["device-tests"],
|
||||||
}
|
}
|
||||||
|
|||||||
98
tests/Input/src/com/android/test/input/InputDeviceTest.java
Normal file
98
tests/Input/src/com/android/test/input/InputDeviceTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user