summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Siarhei Vishniakou <svv@google.com> 2022-11-04 10:09:53 -0700
committer Siarhei Vishniakou <svv@google.com> 2022-11-04 10:12:13 -0700
commit3ad385bfc5db16ae0ed2c54ff9c7f474c77aff82 (patch)
treee460f589c458ea09cfba93773ea88e8095684937
parent89ea6a91e3ceb2abbc6cfce890dd622c7e219dbb (diff)
Remove TouchState::down variable
This variable determines whether touch is currently down. However, we are already storing the pointers that are down for each window. We can just check whether any of the touched windows have pointers inside to replace it. Bug: 211379801 Test: m inputflinger_tests && adb sync data && adb shell -t /data/nativetest64/inputflinger_tests/inputflinger_tests Change-Id: I4137e180835da1e689c89feff7c8f223b79aa85e
-rw-r--r--services/inputflinger/dispatcher/InputDispatcher.cpp16
-rw-r--r--services/inputflinger/dispatcher/TouchState.cpp5
-rw-r--r--services/inputflinger/dispatcher/TouchState.h4
3 files changed, 14 insertions, 11 deletions
diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp
index 9a6ebaaed2..a47f40ccbb 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -2104,7 +2104,7 @@ std::vector<TouchedWindow> InputDispatcher::findTouchedWindowTargetsLocked(
const bool isFromMouse = isFromSource(entry.source, AINPUT_SOURCE_MOUSE);
if (newGesture) {
bool down = maskedAction == AMOTION_EVENT_ACTION_DOWN;
- if (switchedDevice && tempTouchState.down && !down && !isHoverAction) {
+ if (switchedDevice && tempTouchState.isDown() && !down && !isHoverAction) {
ALOGI("Dropping event because a pointer for a different device is already down "
"in display %" PRId32,
displayId);
@@ -2113,7 +2113,6 @@ std::vector<TouchedWindow> InputDispatcher::findTouchedWindowTargetsLocked(
return touchedWindows; // wrong device
}
tempTouchState.reset();
- tempTouchState.down = down;
tempTouchState.deviceId = entry.deviceId;
tempTouchState.source = entry.source;
tempTouchState.displayId = displayId;
@@ -2234,7 +2233,7 @@ std::vector<TouchedWindow> InputDispatcher::findTouchedWindowTargetsLocked(
/* Case 2: Pointer move, up, cancel or non-splittable pointer down. */
// If the pointer is not currently down, then ignore the event.
- if (!tempTouchState.down) {
+ if (!tempTouchState.isDown()) {
if (DEBUG_FOCUS) {
ALOGD("Dropping event because the pointer is not down or we previously "
"dropped the pointer down event in display %" PRId32,
@@ -2445,7 +2444,7 @@ Failed:
if (isHoverAction) {
// Started hovering, therefore no longer down.
- if (oldState && oldState->down) {
+ if (oldState && oldState->isDown()) {
if (DEBUG_FOCUS) {
ALOGD("Conflicting pointer actions: Hover received while pointer was "
"down.");
@@ -2465,7 +2464,7 @@ Failed:
tempTouchState.reset();
} else if (maskedAction == AMOTION_EVENT_ACTION_DOWN) {
// First pointer went down.
- if (oldState && oldState->down) {
+ if (oldState && oldState->isDown()) {
if (DEBUG_FOCUS) {
ALOGD("Conflicting pointer actions: Down received while already down.");
}
@@ -5326,9 +5325,8 @@ void InputDispatcher::dumpDispatchStateLocked(std::string& dump) {
dump += StringPrintf(INDENT "TouchStatesByDisplay:\n");
for (const std::pair<int32_t, TouchState>& pair : mTouchStatesByDisplay) {
const TouchState& state = pair.second;
- dump += StringPrintf(INDENT2 "%d: down=%s, deviceId=%d, source=0x%08x\n",
- state.displayId, toString(state.down), state.deviceId,
- state.source);
+ dump += StringPrintf(INDENT2 "%d: deviceId=%d, source=0x%08x\n", state.displayId,
+ state.deviceId, state.source);
if (!state.windows.empty()) {
dump += INDENT3 "Windows:\n";
for (size_t i = 0; i < state.windows.size(); i++) {
@@ -5688,7 +5686,7 @@ status_t InputDispatcher::pilferPointersLocked(const sp<IBinder>& token) {
}
auto [statePtr, windowPtr] = findTouchStateAndWindowLocked(token);
- if (statePtr == nullptr || windowPtr == nullptr || !statePtr->down) {
+ if (statePtr == nullptr || windowPtr == nullptr || windowPtr->pointerIds.isEmpty()) {
ALOGW("Attempted to pilfer points from a channel without any on-going pointer streams."
" Ignoring.");
return BAD_VALUE;
diff --git a/services/inputflinger/dispatcher/TouchState.cpp b/services/inputflinger/dispatcher/TouchState.cpp
index a3f45cfce3..f5b7cb88d9 100644
--- a/services/inputflinger/dispatcher/TouchState.cpp
+++ b/services/inputflinger/dispatcher/TouchState.cpp
@@ -138,4 +138,9 @@ sp<WindowInfoHandle> TouchState::getWallpaperWindow() const {
return nullptr;
}
+bool TouchState::isDown() const {
+ return std::any_of(windows.begin(), windows.end(),
+ [](const TouchedWindow& window) { return !window.pointerIds.isEmpty(); });
+}
+
} // namespace android::inputdispatcher
diff --git a/services/inputflinger/dispatcher/TouchState.h b/services/inputflinger/dispatcher/TouchState.h
index f6e9fb69f8..ceeeb1eb3d 100644
--- a/services/inputflinger/dispatcher/TouchState.h
+++ b/services/inputflinger/dispatcher/TouchState.h
@@ -28,8 +28,6 @@ class WindowInfoHandle;
namespace inputdispatcher {
struct TouchState {
- bool down = false;
-
// id of the device that is currently down, others are rejected
int32_t deviceId = -1;
// source of the device that is current down, others are rejected
@@ -59,6 +57,8 @@ struct TouchState {
sp<android::gui::WindowInfoHandle> getFirstForegroundWindowHandle() const;
bool isSlippery() const;
sp<android::gui::WindowInfoHandle> getWallpaperWindow() const;
+ // Whether any of the windows are currently being touched
+ bool isDown() const;
};
} // namespace inputdispatcher