From eff9a120c67bb85d66f6d2244da05f283f30f93d Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 20 Jan 2022 23:55:17 +0000 Subject: [PATCH] Dispatch hover events through the input consumer proxy - Touch explore uses hover events to focus views for accessibility, but we were dropping these events when handling them through the input consumer proxy. The reason this changed is that in sc-v2 we moved the recents input consumer to the top of the task display area to ensure that it was always above any of the tasks in splitscreen, but by doing so, it was always above launcher even after settling in overview. The existing path for handling motion events is heavily tied to touch handling (action down/move/up) so we just add a separate path for dispatching hover events through the normal mechanism to launcher via the consumer. Bug: 197043796 Change-Id: I5f8cfd357ff13971fe172ce1d0179535479cd26c --- .../com/android/quickstep/InputConsumer.java | 2 ++ .../inputconsumers/OverviewInputConsumer.java | 7 +++++++ .../quickstep/util/InputConsumerProxy.java | 20 ++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/InputConsumer.java b/quickstep/src/com/android/quickstep/InputConsumer.java index 0b093234f3..c455dc7462 100644 --- a/quickstep/src/com/android/quickstep/InputConsumer.java +++ b/quickstep/src/com/android/quickstep/InputConsumer.java @@ -99,6 +99,8 @@ public interface InputConsumer { default void onMotionEvent(MotionEvent ev) { } + default void onHoverEvent(MotionEvent ev) { } + default void onKeyEvent(KeyEvent ev) { } default void onInputEvent(InputEvent ev) { diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java index b0df2869c7..02ac48ebeb 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java @@ -100,6 +100,13 @@ public class OverviewInputConsumer, T extends StatefulAct } } + @Override + public void onHoverEvent(MotionEvent ev) { + if (ENABLE_QUICKSTEP_LIVE_TILE.get()) { + mActivity.dispatchGenericMotionEvent(ev); + } + } + @Override public void onKeyEvent(KeyEvent ev) { if (ENABLE_QUICKSTEP_LIVE_TILE.get()) { diff --git a/quickstep/src/com/android/quickstep/util/InputConsumerProxy.java b/quickstep/src/com/android/quickstep/util/InputConsumerProxy.java index c2101a848e..91b53c7ff2 100644 --- a/quickstep/src/com/android/quickstep/util/InputConsumerProxy.java +++ b/quickstep/src/com/android/quickstep/util/InputConsumerProxy.java @@ -71,7 +71,16 @@ public class InputConsumerProxy { private boolean onInputConsumerEvent(InputEvent ev) { if (ev instanceof MotionEvent) { - onInputConsumerMotionEvent((MotionEvent) ev); + MotionEvent event = (MotionEvent) ev; + int action = event.getActionMasked(); + boolean isHoverEvent = action == MotionEvent.ACTION_HOVER_ENTER + || action == MotionEvent.ACTION_HOVER_MOVE + || action == MotionEvent.ACTION_HOVER_EXIT; + if (isHoverEvent) { + onInputConsumerHoverEvent(event); + } else { + onInputConsumerMotionEvent(event); + } } else if (ev instanceof KeyEvent) { initInputConsumerIfNeeded(); mInputConsumer.onKeyEvent((KeyEvent) ev); @@ -113,6 +122,15 @@ public class InputConsumerProxy { return true; } + private void onInputConsumerHoverEvent(MotionEvent ev) { + initInputConsumerIfNeeded(); + if (mInputConsumer != null) { + SimpleOrientationTouchTransformer.INSTANCE.get(mContext).transform(ev, + mRotationSupplier.get()); + mInputConsumer.onHoverEvent(ev); + } + } + public void destroy() { if (mTouchInProgress) { mDestroyPending = true;