diff options
| author | 2024-10-21 02:47:59 +0000 | |
|---|---|---|
| committer | 2024-10-21 02:47:59 +0000 | |
| commit | 50d9df22f20141fc8a988b570e9f84c68fb477b7 (patch) | |
| tree | 169fb24f562717313a9dbfccd85d87020eb7efde | |
| parent | acfb66a3203298f73e399246ee08e07571f82f11 (diff) | |
| parent | cf244b0831dde4d7ffd03adc7796126da4476200 (diff) | |
Merge "Record latest back gesture occur on which task." into main
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); } /** @@ -238,6 +245,14 @@ public final class BackNavigationInfo implements Parcelable { } /** + * @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. * @hide @@ -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() @@ -527,6 +543,14 @@ public final class BackNavigationInfo implements Parcelable { } /** + * @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} */ public BackNavigationInfo build() { @@ -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<BackAnimationCont */ private BackTouchTracker mQueuedTracker = new BackTouchTracker(); + private final FocusTaskTrackerObserver mFocusTaskTrackerObserver = + new FocusTaskTrackerObserver(); + private final Runnable mAnimationTimeoutRunnable = () -> { 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<BackAnimationCont mBackTransitionHandler = new BackTransitionHandler(); mTransitions.addHandler(mBackTransitionHandler); mHandler = handler; + mTransitions.registerObserver(mFocusTaskTrackerObserver); updateTouchableArea(); } @@ -729,6 +733,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } /** + * @return Latest task id which back gesture has occurred on it. + */ + public int getLatestTriggerBackTask() { + return mFocusTaskTrackerObserver.mFocusedTaskId; + } + + /** * Sets to true when the back gesture has passed the triggering threshold, false otherwise. */ public void setTriggerBack(boolean triggerBack) { @@ -792,6 +803,11 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont boolean triggerBack = activeTouchTracker.getTriggerBack(); ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", triggerBack); + if (triggerBack) { + mFocusTaskTrackerObserver.update(mBackNavigationInfo != null + ? mBackNavigationInfo.getFocusedTaskId() + : INVALID_TASK_ID); + } // Reset gesture states. mThresholdCrossed = false; mPointersPilfered = false; @@ -1645,4 +1661,48 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private static boolean canBeTransitionTarget(TransitionInfo.Change change) { return findComponentName(change) != null || findTaskId(change) != INVALID_TASK_ID; } + + // Record the latest back gesture happen on which task. + static class FocusTaskTrackerObserver implements Transitions.TransitionObserver { + int mFocusedTaskId = INVALID_TASK_ID; + IBinder mMonitorBinder; + + void update(int focusedTaskId) { + mFocusedTaskId = focusedTaskId; + } + + @Override + public void onTransitionReady(@NonNull IBinder transition, @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction startTransaction, + @NonNull SurfaceControl.Transaction finishTransaction) { + if (mFocusedTaskId == INVALID_TASK_ID) { + return; + } + for (int i = info.getChanges().size() - 1; i >= 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 70f9ebb0e61e..ccd59969cec8 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -201,6 +201,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, " |