Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 250c6c8e authored by Omar Miatello's avatar Omar Miatello Committed by Automerger Merge Worker
Browse files

Merge "Support for OnBackAnimationCallback: added for 3-button navigation /...

Merge "Support for OnBackAnimationCallback: added for 3-button navigation / hardware keys" into udc-dev am: b98116ac

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22965557



Change-Id: I9ef8638adce512ad66907b63f3cb5b4dce3e81fe
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 5ccab6e7 b98116ac
Loading
Loading
Loading
Loading
+46 −13
Original line number Diff line number Diff line
@@ -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