diff options
| author | 2023-05-10 09:03:11 +0000 | |
|---|---|---|
| committer | 2023-05-10 09:03:11 +0000 | |
| commit | 54ec957792626d8182ce816d73be98ff926d1afe (patch) | |
| tree | 1e318e0576b0fda895d1b2aed5303d4d6e279a5e | |
| parent | 5f4ecfa0865c36944d01eab304fc61ff6be7162c (diff) | |
| parent | b98116acd296c1d493247cc7005b92c8fb573d25 (diff) | |
Merge "Support for OnBackAnimationCallback: added for 3-button navigation / hardware keys" into udc-dev am: b98116acd2
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22965557
Change-Id: I3116313e6289147b19354d9b96bb83901ed90727
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 8d74e99c56ba..f662c7372667 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -200,8 +200,10 @@ import android.view.contentcapture.MainContentCaptureSession; import android.view.inputmethod.ImeTracker; import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; +import android.window.BackEvent; import android.window.ClientWindowFrames; import android.window.CompatOnBackInvokedCallback; +import android.window.OnBackAnimationCallback; import android.window.OnBackInvokedCallback; import android.window.OnBackInvokedDispatcher; import android.window.ScreenCapture; @@ -6526,6 +6528,7 @@ public final class ViewRootImpl implements ViewParent, */ final class NativePreImeInputStage extends AsyncInputStage implements InputQueue.FinishedInputEventCallback { + public NativePreImeInputStage(InputStage next, String traceCounter) { super(next, traceCounter); } @@ -6533,32 +6536,62 @@ public final class ViewRootImpl implements ViewParent, @Override protected int onProcess(QueuedInputEvent q) { if (q.mEvent instanceof KeyEvent) { - final KeyEvent event = (KeyEvent) q.mEvent; + final KeyEvent keyEvent = (KeyEvent) q.mEvent; // If the new back dispatch is enabled, intercept KEYCODE_BACK before it reaches the // view tree or IME, and invoke the appropriate {@link OnBackInvokedCallback}. - if (isBack(event) + if (isBack(keyEvent) && mContext != null && mOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled()) { - OnBackInvokedCallback topCallback = - getOnBackInvokedDispatcher().getTopCallback(); - if (event.getAction() == KeyEvent.ACTION_UP) { - if (topCallback != null) { + return doOnBackKeyEvent(keyEvent); + } + + if (mInputQueue != null) { + mInputQueue.sendInputEvent(q.mEvent, q, true, this); + return DEFER; + } + } + return FORWARD; + } + + private int doOnBackKeyEvent(KeyEvent keyEvent) { + OnBackInvokedCallback topCallback = getOnBackInvokedDispatcher().getTopCallback(); + if (topCallback instanceof OnBackAnimationCallback) { + final OnBackAnimationCallback animationCallback = + (OnBackAnimationCallback) topCallback; + switch (keyEvent.getAction()) { + case KeyEvent.ACTION_DOWN: + // ACTION_DOWN is emitted twice: once when the user presses the button, + // and again a few milliseconds later. + // Based on the result of `keyEvent.getRepeatCount()` we have: + // - 0 means the button was pressed. + // - 1 means the button continues to be pressed (long press). + if (keyEvent.getRepeatCount() == 0) { + animationCallback.onBackStarted( + new BackEvent(0, 0, 0f, BackEvent.EDGE_LEFT)); + } + break; + case KeyEvent.ACTION_UP: + if (keyEvent.isCanceled()) { + animationCallback.onBackCancelled(); + } else { topCallback.onBackInvoked(); return FINISH_HANDLED; } + break; + } + } else if (topCallback != null) { + if (keyEvent.getAction() == KeyEvent.ACTION_UP) { + if (!keyEvent.isCanceled()) { + topCallback.onBackInvoked(); + return FINISH_HANDLED; } else { - // Drop other actions such as {@link KeyEvent.ACTION_DOWN}. - return FINISH_NOT_HANDLED; + Log.d(mTag, "Skip onBackInvoked(), reason: keyEvent.isCanceled=true"); } } } - if (mInputQueue != null && q.mEvent instanceof KeyEvent) { - mInputQueue.sendInputEvent(q.mEvent, q, true, this); - return DEFER; - } - return FORWARD; + return FINISH_NOT_HANDLED; } @Override |