From cf244b0831dde4d7ffd03adc7796126da4476200 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 4 Oct 2024 02:06:18 +0000 Subject: Record latest back gesture occur on which task. To help check if the coming close transition could be triggerred from back gesture, and clear it when transition finish. Flag: EXEMPT bugfix Bug: 372458739 Test: verify latest back gesture can be record in BAC, and reset when transition finish. Change-Id: I1e05419e339577e73fd9ee839bc908c0c0667087 --- core/java/android/window/BackNavigationInfo.java | 29 ++++++++++- .../wm/shell/back/BackAnimationController.java | 60 ++++++++++++++++++++++ .../server/wm/BackNavigationController.java | 3 ++ 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/core/java/android/window/BackNavigationInfo.java b/core/java/android/window/BackNavigationInfo.java index 59639d04b45b..6cefc4d2fecf 100644 --- a/core/java/android/window/BackNavigationInfo.java +++ b/core/java/android/window/BackNavigationInfo.java @@ -16,6 +16,8 @@ package android.window; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; + import android.annotation.AnimRes; import android.annotation.ColorInt; import android.annotation.IntDef; @@ -118,6 +120,7 @@ public final class BackNavigationInfo implements Parcelable { private final Rect mTouchableRegion; private final boolean mAppProgressGenerationAllowed; + private final int mFocusedTaskId; /** * Create a new {@link BackNavigationInfo} instance. @@ -135,7 +138,8 @@ public final class BackNavigationInfo implements Parcelable { @Nullable CustomAnimationInfo customAnimationInfo, int letterboxColor, @Nullable Rect touchableRegion, - boolean appProgressGenerationAllowed) { + boolean appProgressGenerationAllowed, + int focusedTaskId) { mType = type; mOnBackNavigationDone = onBackNavigationDone; mOnBackInvokedCallback = onBackInvokedCallback; @@ -145,6 +149,7 @@ public final class BackNavigationInfo implements Parcelable { mLetterboxColor = letterboxColor; mTouchableRegion = new Rect(touchableRegion); mAppProgressGenerationAllowed = appProgressGenerationAllowed; + mFocusedTaskId = focusedTaskId; } private BackNavigationInfo(@NonNull Parcel in) { @@ -157,6 +162,7 @@ public final class BackNavigationInfo implements Parcelable { mLetterboxColor = in.readInt(); mTouchableRegion = in.readTypedObject(Rect.CREATOR); mAppProgressGenerationAllowed = in.readBoolean(); + mFocusedTaskId = in.readInt(); } /** @hide */ @@ -171,6 +177,7 @@ public final class BackNavigationInfo implements Parcelable { dest.writeInt(mLetterboxColor); dest.writeTypedObject(mTouchableRegion, flags); dest.writeBoolean(mAppProgressGenerationAllowed); + dest.writeInt(mFocusedTaskId); } /** @@ -237,6 +244,14 @@ public final class BackNavigationInfo implements Parcelable { return mAppProgressGenerationAllowed; } + /** + * @return The focused task id when back gesture start. + * @hide + */ + public int getFocusedTaskId() { + return mFocusedTaskId; + } + /** * Callback to be called when the back preview is finished in order to notify the server that * it can clean up the resources created for the animation. @@ -435,6 +450,7 @@ public final class BackNavigationInfo implements Parcelable { private int mLetterboxColor = Color.TRANSPARENT; private Rect mTouchableRegion; private boolean mAppProgressGenerationAllowed; + private int mFocusedTaskId = INVALID_TASK_ID; /** * @see BackNavigationInfo#getType() @@ -526,6 +542,14 @@ public final class BackNavigationInfo implements Parcelable { return this; } + /** + * @param focusedTaskId The current focused taskId when back gesture start. + */ + public Builder setFocusedTaskId(int focusedTaskId) { + mFocusedTaskId = focusedTaskId; + return this; + } + /** * Builds and returns an instance of {@link BackNavigationInfo} */ @@ -537,7 +561,8 @@ public final class BackNavigationInfo implements Parcelable { mCustomAnimationInfo, mLetterboxColor, mTouchableRegion, - mAppProgressGenerationAllowed); + mAppProgressGenerationAllowed, + mFocusedTaskId); } } } 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 19b51f143241..fafb69cc8089 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 @@ -164,6 +164,9 @@ public class BackAnimationController implements RemoteCallable { ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...", MAX_ANIMATION_DURATION); @@ -268,6 +271,7 @@ public class BackAnimationController implements RemoteCallable= 0; --i) { + final TransitionInfo.Change c = info.getChanges().get(i); + if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) { + mMonitorBinder = transition; + break; + } + } + // Transition happen but the task isn't involved, reset. + if (mMonitorBinder == null) { + mFocusedTaskId = INVALID_TASK_ID; + } + } + + @Override + public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { + if (mMonitorBinder == merged) { + mMonitorBinder = playing; + } + } + + @Override + public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { + if (mMonitorBinder == transition) { + mFocusedTaskId = INVALID_TASK_ID; + } + } + } } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 94cd2e64b057..bab2210f29aa 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -200,6 +200,9 @@ class BackNavigationController { infoBuilder.setTouchableRegion(window.getFrame()); infoBuilder.setAppProgressAllowed((window.getAttrs().privateFlags & PRIVATE_FLAG_APP_PROGRESS_GENERATION_ALLOWED) != 0); + if (currentTask != null) { + infoBuilder.setFocusedTaskId(currentTask.mTaskId); + } mNavigationMonitor.startMonitor(window, navigationObserver); ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "startBackNavigation currentTask=%s, " -- cgit v1.2.3-59-g8ed1b