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
This commit is contained in:
Winson Chung 2022-01-20 23:55:17 +00:00
parent 88c671ee71
commit eff9a120c6
3 changed files with 28 additions and 1 deletions

View File

@ -99,6 +99,8 @@ public interface InputConsumer {
default void onMotionEvent(MotionEvent ev) { } default void onMotionEvent(MotionEvent ev) { }
default void onHoverEvent(MotionEvent ev) { }
default void onKeyEvent(KeyEvent ev) { } default void onKeyEvent(KeyEvent ev) { }
default void onInputEvent(InputEvent ev) { default void onInputEvent(InputEvent ev) {

View File

@ -100,6 +100,13 @@ public class OverviewInputConsumer<S extends BaseState<S>, T extends StatefulAct
} }
} }
@Override
public void onHoverEvent(MotionEvent ev) {
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
mActivity.dispatchGenericMotionEvent(ev);
}
}
@Override @Override
public void onKeyEvent(KeyEvent ev) { public void onKeyEvent(KeyEvent ev) {
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) { if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {

View File

@ -71,7 +71,16 @@ public class InputConsumerProxy {
private boolean onInputConsumerEvent(InputEvent ev) { private boolean onInputConsumerEvent(InputEvent ev) {
if (ev instanceof MotionEvent) { 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) { } else if (ev instanceof KeyEvent) {
initInputConsumerIfNeeded(); initInputConsumerIfNeeded();
mInputConsumer.onKeyEvent((KeyEvent) ev); mInputConsumer.onKeyEvent((KeyEvent) ev);
@ -113,6 +122,15 @@ public class InputConsumerProxy {
return true; 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() { public void destroy() {
if (mTouchInProgress) { if (mTouchInProgress) {
mDestroyPending = true; mDestroyPending = true;