From dade629fefa2fd8504bf08618c7aa1dcd3647bed Mon Sep 17 00:00:00 2001 From: Hinix Date: Fri, 4 Jul 2025 17:39:56 +0800 Subject: [PATCH] fix touch and add va_gfx.ini --- .../inputflinger/dispatcher/InputTarget.cpp | 134 ++++++++++++++++++ aosp/vendor/common/etc/va_gfx.ini | 6 + aosp/vendor/isula/copyfiles.mk | 1 + 3 files changed, 141 insertions(+) create mode 100644 aosp/frameworks/native/services/inputflinger/dispatcher/InputTarget.cpp create mode 100644 aosp/vendor/common/etc/va_gfx.ini diff --git a/aosp/frameworks/native/services/inputflinger/dispatcher/InputTarget.cpp b/aosp/frameworks/native/services/inputflinger/dispatcher/InputTarget.cpp new file mode 100644 index 000000000..9455c2723 --- /dev/null +++ b/aosp/frameworks/native/services/inputflinger/dispatcher/InputTarget.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2019 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. + */ + +#include "InputTarget.h" + +#include +#include +#include +#include +#include + +using android::base::StringPrintf; + +namespace android::inputdispatcher { + +namespace { + +const static ui::Transform kIdentityTransform{}; + +} + +InputTarget::InputTarget(const std::shared_ptr& connection, ftl::Flags flags) + : connection(connection), flags(flags) {} + +void InputTarget::addPointers(std::bitset newPointerIds, + const ui::Transform& transform) { + // The pointerIds can be empty, but still a valid InputTarget. This can happen when there is no + // valid pointer property from the input event. + if (newPointerIds.none()) { + setDefaultPointerTransform(transform); + return; + } + + // Ensure that the new set of pointers doesn't overlap with the current set of pointers. + if ((getPointerIds() & newPointerIds).any()) { + LOG(ERROR) << __func__ << " - overlap with incoming pointers " + << bitsetToString(newPointerIds) << " in " << *this; + return; + } + + for (auto& [existingTransform, existingPointers] : mPointerTransforms) { + if (transform == existingTransform) { + existingPointers |= newPointerIds; + return; + } + } + mPointerTransforms.emplace_back(transform, newPointerIds); +} + +void InputTarget::setDefaultPointerTransform(const ui::Transform& transform) { + mPointerTransforms = {{transform, {}}}; +} + +bool InputTarget::useDefaultPointerTransform() const { + return mPointerTransforms.size() <= 1; +} + +const ui::Transform& InputTarget::getDefaultPointerTransform() const { + if (!useDefaultPointerTransform()) { + LOG(FATAL) << __func__ << ": Not using default pointer transform"; + } + return mPointerTransforms.size() == 1 ? mPointerTransforms[0].first : kIdentityTransform; +} + +const ui::Transform& InputTarget::getTransformForPointer(int32_t pointerId) const { + for (const auto& [transform, ids] : mPointerTransforms) { + if (ids.test(pointerId)) { + return transform; + } + } + + LOG(FATAL) << __func__ + << ": Cannot get transform: The following Pointer ID does not exist in target: " + << pointerId; + return kIdentityTransform; +} + +std::string InputTarget::getPointerInfoString() const { + std::string out = "\n"; + if (useDefaultPointerTransform()) { + const ui::Transform& transform = getDefaultPointerTransform(); + transform.dump(out, "default", " "); + return out; + } + + for (const auto& [transform, ids] : mPointerTransforms) { + const std::string name = "pointerIds " + bitsetToString(ids) + ":"; + transform.dump(out, name.c_str(), " "); + } + return out; +} + +std::bitset InputTarget::getPointerIds() const { + PointerIds allIds; + for (const auto& [_, ids] : mPointerTransforms) { + allIds |= ids; + } + return allIds; +} + +std::ostream& operator<<(std::ostream& out, const InputTarget& target) { + out << "{connection="; + if (target.connection != nullptr) { + out << target.connection->getInputChannelName(); + } else { + out << ""; + } + out << ", windowHandle="; + if (target.windowHandle != nullptr) { + out << target.windowHandle->getName(); + } else { + out << ""; + } + out << ", dispatchMode=" << ftl::enum_string(target.dispatchMode).c_str(); + out << ", targetFlags=" << target.flags.string(); + out << ", pointers=" << target.getPointerInfoString(); + out << "}"; + return out; +} + +} // namespace android::inputdispatcher diff --git a/aosp/vendor/common/etc/va_gfx.ini b/aosp/vendor/common/etc/va_gfx.ini new file mode 100644 index 000000000..0cf408474 --- /dev/null +++ b/aosp/vendor/common/etc/va_gfx.ini @@ -0,0 +1,6 @@ +; example: +; [com.***] +; VendorName=ARM +; RendererName=Mali-G57 + +; End of va_gfx.ini \ No newline at end of file diff --git a/aosp/vendor/isula/copyfiles.mk b/aosp/vendor/isula/copyfiles.mk index 091c339bc..3872af268 100644 --- a/aosp/vendor/isula/copyfiles.mk +++ b/aosp/vendor/isula/copyfiles.mk @@ -9,6 +9,7 @@ PRODUCT_COPY_FILES += \ vendor/common/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \ vendor/common/scripts/hook.sh:system/bin/hook.sh \ vendor/common/etc/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf \ + vendor/common/etc/va_gfx.ini:system/etc/va_gfx.ini \ # hals -- Gitee