summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Omar Miatello <omarmt@google.com> 2023-05-10 09:03:11 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-05-10 09:03:11 +0000
commit54ec957792626d8182ce816d73be98ff926d1afe (patch)
tree1e318e0576b0fda895d1b2aed5303d4d6e279a5e
parent5f4ecfa0865c36944d01eab304fc61ff6be7162c (diff)
parentb98116acd296c1d493247cc7005b92c8fb573d25 (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.java59
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