Introduce WindowInfo::InputConfig flag to control input behavior

Set the InputConfig flags when creating WindowInfo from
InputWindowHandle.

Bug: 216806304
Test: atest libgui_test
Test: atest inputflinger_tests
Change-Id: I82f7dd41607642182e0b0f38b6f6ded9d1bb4f56
This commit is contained in:
Prabir Pradhan
2022-01-31 11:18:44 -08:00
parent ee435ebcb2
commit fb1e57ddce

View File

@@ -129,10 +129,6 @@ bool NativeInputWindowHandle::updateInfo() {
mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>");
mInfo.flags = Flags<WindowInfo::Flag>(
env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags));
mInfo.type = static_cast<WindowInfo::Type>(
env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType));
mInfo.dispatchingTimeout = std::chrono::milliseconds(
env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis));
mInfo.frameLeft = env->GetIntField(obj,
@@ -158,14 +154,77 @@ bool NativeInputWindowHandle::updateInfo() {
env->DeleteLocalRef(regionObj);
}
mInfo.visible = env->GetBooleanField(obj,
gInputWindowHandleClassInfo.visible);
mInfo.focusable = env->GetBooleanField(obj, gInputWindowHandleClassInfo.focusable);
mInfo.hasWallpaper = env->GetBooleanField(obj,
gInputWindowHandleClassInfo.hasWallpaper);
mInfo.paused = env->GetBooleanField(obj,
gInputWindowHandleClassInfo.paused);
mInfo.trustedOverlay = env->GetBooleanField(obj, gInputWindowHandleClassInfo.trustedOverlay);
const auto flags = Flags<WindowInfo::Flag>(
env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags));
const auto type = static_cast<WindowInfo::Type>(
env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType));
mInfo.layoutParamsFlags = flags;
mInfo.layoutParamsType = type;
using InputConfig = gui::WindowInfo::InputConfig;
// Determine the value for each of the InputConfig flags. We rely on a switch statement and
// -Wswitch-enum to give us a build error if we forget to explicitly handle an InputConfig flag.
mInfo.inputConfig = InputConfig::NONE;
InputConfig enumerationStart = InputConfig::NONE;
switch (enumerationStart) {
case InputConfig::NONE:
FALLTHROUGH_INTENDED;
case InputConfig::NOT_VISIBLE:
if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.visible) == JNI_FALSE) {
mInfo.inputConfig |= InputConfig::NOT_VISIBLE;
}
FALLTHROUGH_INTENDED;
case InputConfig::NOT_FOCUSABLE:
if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.focusable) == JNI_FALSE) {
mInfo.inputConfig |= InputConfig::NOT_FOCUSABLE;
}
FALLTHROUGH_INTENDED;
case InputConfig::NOT_TOUCHABLE:
if (flags.test(WindowInfo::Flag::NOT_TOUCHABLE)) {
mInfo.inputConfig |= InputConfig::NOT_TOUCHABLE;
}
FALLTHROUGH_INTENDED;
case InputConfig::NOT_TOUCH_MODAL:
if (flags.test(WindowInfo::Flag::NOT_TOUCH_MODAL)) {
mInfo.inputConfig |= InputConfig::NOT_TOUCH_MODAL;
}
FALLTHROUGH_INTENDED;
case InputConfig::SPLIT_TOUCH:
if (flags.test(WindowInfo::Flag::SPLIT_TOUCH)) {
mInfo.inputConfig |= InputConfig::SPLIT_TOUCH;
}
FALLTHROUGH_INTENDED;
case InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER:
if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.hasWallpaper) == JNI_TRUE) {
mInfo.inputConfig |= InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER;
}
FALLTHROUGH_INTENDED;
case InputConfig::IS_WALLPAPER:
if (type == WindowInfo::Type::WALLPAPER) {
mInfo.inputConfig |= InputConfig::IS_WALLPAPER;
}
FALLTHROUGH_INTENDED;
case InputConfig::PAUSE_DISPATCHING:
if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.paused) == JNI_TRUE) {
mInfo.inputConfig |= InputConfig::PAUSE_DISPATCHING;
}
FALLTHROUGH_INTENDED;
case InputConfig::TRUSTED_OVERLAY:
if (env->GetBooleanField(obj, gInputWindowHandleClassInfo.trustedOverlay) == JNI_TRUE) {
mInfo.inputConfig |= InputConfig::TRUSTED_OVERLAY;
}
FALLTHROUGH_INTENDED;
case InputConfig::WATCH_OUTSIDE_TOUCH:
if (flags.test(WindowInfo::Flag::WATCH_OUTSIDE_TOUCH)) {
mInfo.inputConfig |= InputConfig::WATCH_OUTSIDE_TOUCH;
}
FALLTHROUGH_INTENDED;
case InputConfig::SLIPPERY:
if (flags.test(WindowInfo::Flag::SLIPPERY)) {
mInfo.inputConfig |= InputConfig::SLIPPERY;
}
}
mInfo.touchOcclusionMode = static_cast<TouchOcclusionMode>(
env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode));
mInfo.ownerPid = env->GetIntField(obj,
@@ -267,9 +326,9 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.name,
env->NewStringUTF(windowInfo.name.data()));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.layoutParamsFlags,
static_cast<uint32_t>(windowInfo.flags.get()));
static_cast<uint32_t>(windowInfo.layoutParamsFlags.get()));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.layoutParamsType,
static_cast<int32_t>(windowInfo.type));
static_cast<int32_t>(windowInfo.layoutParamsType));
env->SetLongField(inputWindowHandle, gInputWindowHandleClassInfo.dispatchingTimeoutMillis,
std::chrono::duration_cast<std::chrono::milliseconds>(
windowInfo.dispatchingTimeout)
@@ -298,15 +357,17 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.touchableRegion,
regionObj.get());
using InputConfig = gui::WindowInfo::InputConfig;
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.visible,
windowInfo.visible);
!windowInfo.inputConfig.test(InputConfig::NOT_VISIBLE));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.focusable,
windowInfo.focusable);
!windowInfo.inputConfig.test(gui::WindowInfo::InputConfig::NOT_FOCUSABLE));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.hasWallpaper,
windowInfo.hasWallpaper);
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.paused, windowInfo.paused);
windowInfo.inputConfig.test(InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.paused,
windowInfo.inputConfig.test(InputConfig::PAUSE_DISPATCHING));
env->SetBooleanField(inputWindowHandle, gInputWindowHandleClassInfo.trustedOverlay,
windowInfo.trustedOverlay);
windowInfo.inputConfig.test(InputConfig::TRUSTED_OVERLAY));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.touchOcclusionMode,
static_cast<int32_t>(windowInfo.touchOcclusionMode));
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.ownerPid, windowInfo.ownerPid);