diff --git a/core/java/android/view/OnBackInvokedCallback.java b/core/java/android/view/OnBackInvokedCallback.java index b5cd89cfa4e13..37f858abf8184 100644 --- a/core/java/android/view/OnBackInvokedCallback.java +++ b/core/java/android/view/OnBackInvokedCallback.java @@ -18,6 +18,7 @@ package android.view; import android.app.Activity; import android.app.Dialog; +import android.window.BackEvent; /** * Interface for applications to register back invocation callbacks. This allows the client @@ -46,14 +47,12 @@ public interface OnBackInvokedCallback { /** * Called on back gesture progress. * - * @param touchX Absolute X location of the touch point. - * @param touchY Absolute Y location of the touch point. - * @param progress Value between 0 and 1 on how far along the back gesture is. + * @param backEvent An {@link android.window.BackEvent} object describing the progress event. * + * @see android.window.BackEvent * @hide */ - // TODO(b/210539672): combine back progress params into BackEvent. - default void onBackProgressed(int touchX, int touchY, float progress) { }; + default void onBackProgressed(BackEvent backEvent) { }; /** * Called when a back gesture or back button press has been cancelled. diff --git a/core/java/android/window/BackEvent.aidl b/core/java/android/window/BackEvent.aidl new file mode 100644 index 0000000000000..821f1fa9830fc --- /dev/null +++ b/core/java/android/window/BackEvent.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.window; + +/** + * @hide + */ +parcelable BackEvent; diff --git a/core/java/android/window/BackEvent.java b/core/java/android/window/BackEvent.java new file mode 100644 index 0000000000000..14985c987f974 --- /dev/null +++ b/core/java/android/window/BackEvent.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.window; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.Parcel; +import android.os.Parcelable; +import android.view.RemoteAnimationTarget; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Represents an event that is sent out by the system during back navigation gesture. + * Holds information about the touch event, swipe direction and overall progress of the gesture + * interaction. + * + * @hide + */ +public class BackEvent implements Parcelable { + /** Indicates that the edge swipe starts from the left edge of the screen */ + public static final int EDGE_LEFT = 0; + /** Indicates that the edge swipe starts from the right edge of the screen */ + public static final int EDGE_RIGHT = 1; + + @IntDef({ + EDGE_LEFT, + EDGE_RIGHT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SwipeEdge{} + + private final int mTouchX; + private final int mTouchY; + private final float mProgress; + + @SwipeEdge + private final int mSwipeEdge; + @Nullable + private final RemoteAnimationTarget mDepartingAnimationTarget; + + /** + * Creates a new {@link BackEvent} instance. + * + * @param touchX Absolute X location of the touch point. + * @param touchY Absolute Y location of the touch point. + * @param progress Value between 0 and 1 on how far along the back gesture is. + * @param swipeEdge Indicates which edge the swipe starts from. + * @param departingAnimationTarget The remote animation target of the departing application + * window. + */ + public BackEvent(int touchX, int touchY, float progress, @SwipeEdge int swipeEdge, + @Nullable RemoteAnimationTarget departingAnimationTarget) { + mTouchX = touchX; + mTouchY = touchY; + mProgress = progress; + mSwipeEdge = swipeEdge; + mDepartingAnimationTarget = departingAnimationTarget; + } + + private BackEvent(@NonNull Parcel in) { + mTouchX = in.readInt(); + mTouchY = in.readInt(); + mProgress = in.readFloat(); + mSwipeEdge = in.readInt(); + mDepartingAnimationTarget = in.readTypedObject(RemoteAnimationTarget.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public BackEvent createFromParcel(Parcel in) { + return new BackEvent(in); + } + + @Override + public BackEvent[] newArray(int size) { + return new BackEvent[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(mTouchX); + dest.writeInt(mTouchY); + dest.writeFloat(mProgress); + dest.writeInt(mSwipeEdge); + dest.writeTypedObject(mDepartingAnimationTarget, flags); + } + + /** + * Returns a value between 0 and 1 on how far along the back gesture is. + */ + public float getProgress() { + return mProgress; + } + + /** + * Returns the absolute X location of the touch point. + */ + public int getTouchX() { + return mTouchX; + } + + /** + * Returns the absolute Y location of the touch point. + */ + public int getTouchY() { + return mTouchY; + } + + /** + * Returns the screen edge that the swipe starts from. + */ + public int getSwipeEdge() { + return mSwipeEdge; + } + + /** + * Returns the {@link RemoteAnimationTarget} of the top departing application window, + * or {@code null} if the top window should not be moved for the current type of back + * destination. + */ + @Nullable + public RemoteAnimationTarget getDepartingAnimationTarget() { + return mDepartingAnimationTarget; + } + + @Override + public String toString() { + return "BackEvent{" + + "mTouchX=" + mTouchX + + ", mTouchY=" + mTouchY + + ", mProgress=" + mProgress + + ", mSwipeEdge" + mSwipeEdge + + ", mDepartingAnimationTarget" + mDepartingAnimationTarget + + "}"; + } +} diff --git a/core/java/android/window/IOnBackInvokedCallback.aidl b/core/java/android/window/IOnBackInvokedCallback.aidl index a42863c3126fe..47796de11dd5a 100644 --- a/core/java/android/window/IOnBackInvokedCallback.aidl +++ b/core/java/android/window/IOnBackInvokedCallback.aidl @@ -17,6 +17,8 @@ package android.window; +import android.window.BackEvent; + /** * Interface that wraps a {@link OnBackInvokedCallback} object, to be stored in window manager * and called from back handling process when back is invoked. @@ -38,7 +40,7 @@ oneway interface IOnBackInvokedCallback { * @param touchY Absolute Y location of the touch point. * @param progress Value between 0 and 1 on how far along the back gesture is. */ - void onBackProgressed(int touchX, int touchY, float progress); + void onBackProgressed(in BackEvent backEvent); /** * Called when a back gesture or back button press has been cancelled. diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java index d37d3b42872f7..f87592fa4db7a 100644 --- a/core/java/android/window/WindowOnBackInvokedDispatcher.java +++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java @@ -202,9 +202,9 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { } @Override - public void onBackProgressed(int touchX, int touchY, float progress) + public void onBackProgressed(BackEvent backEvent) throws RemoteException { - Handler.getMain().post(() -> mCallback.onBackProgressed(touchX, touchY, progress)); + Handler.getMain().post(() -> mCallback.onBackProgressed(backEvent)); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java index 9a6df23ca9714..4c505f6583fc7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java @@ -17,6 +17,7 @@ package com.android.wm.shell.back; import android.view.MotionEvent; +import android.window.BackEvent; import com.android.wm.shell.common.annotations.ExternalThread; @@ -29,7 +30,7 @@ public interface BackAnimation { /** * Called when a {@link MotionEvent} is generated by a back gesture. */ - void onBackMotion(MotionEvent event); + void onBackMotion(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge); /** * Sets whether the back gesture is past the trigger threshold or not. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index a5140c3aafff2..32ac43da951c9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -36,6 +36,7 @@ import android.os.SystemProperties; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceControl; +import android.window.BackEvent; import android.window.BackNavigationInfo; import android.window.IOnBackInvokedCallback; @@ -127,8 +128,8 @@ public class BackAnimationController implements RemoteCallable onMotionEvent(event)); + public void onBackMotion(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge) { + mShellExecutor.execute(() -> onMotionEvent(event, swipeEdge)); } @Override @@ -183,12 +184,12 @@ public class BackAnimationController implements RemoteCallable