Merge "Fix add and remove times for visual indicator" into udc-dev am: ed2c114460 am: 73c5e080de

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

Change-Id: Ifef8bd8499a0cdefda207b5f18ef112fb40f933d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Maryam Dehaini
2023-05-02 21:45:10 +00:00
committed by Automerger Merge Worker
7 changed files with 69 additions and 35 deletions

View File

@@ -162,7 +162,7 @@ public class DesktopModeVisualIndicator {
/** /**
* Release the indicator and its components when it is no longer needed. * Release the indicator and its components when it is no longer needed.
*/ */
public void releaseVisualIndicator() { public void releaseVisualIndicator(SurfaceControl.Transaction t) {
if (mViewHost == null) return; if (mViewHost == null) return;
if (mViewHost != null) { if (mViewHost != null) {
mViewHost.release(); mViewHost.release();
@@ -170,13 +170,8 @@ public class DesktopModeVisualIndicator {
} }
if (mLeash != null) { if (mLeash != null) {
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.remove(mLeash); t.remove(mLeash);
mLeash = null; mLeash = null;
mSyncQueue.runInSync(transaction -> {
transaction.merge(t);
t.close();
});
} }
} }

View File

@@ -78,6 +78,11 @@ class DesktopTasksController(
private val desktopMode: DesktopModeImpl private val desktopMode: DesktopModeImpl
private var visualIndicator: DesktopModeVisualIndicator? = null private var visualIndicator: DesktopModeVisualIndicator? = null
private val mOnAnimationFinishedCallback = Consumer<SurfaceControl.Transaction> {
t: SurfaceControl.Transaction ->
visualIndicator?.releaseVisualIndicator(t)
visualIndicator = null
}
init { init {
desktopMode = DesktopModeImpl() desktopMode = DesktopModeImpl()
@@ -154,14 +159,14 @@ class DesktopTasksController(
if (Transitions.ENABLE_SHELL_TRANSITIONS) { if (Transitions.ENABLE_SHELL_TRANSITIONS) {
enterDesktopTaskTransitionHandler.startTransition( enterDesktopTaskTransitionHandler.startTransition(
Transitions.TRANSIT_ENTER_FREEFORM, wct) Transitions.TRANSIT_ENTER_FREEFORM, wct, mOnAnimationFinishedCallback)
} else { } else {
shellTaskOrganizer.applyTransaction(wct) shellTaskOrganizer.applyTransaction(wct)
} }
} }
/** Brings apps to front and sets freeform task bounds */ /** Brings apps to front and sets freeform task bounds */
fun moveToDesktopWithAnimation( private fun moveToDesktopWithAnimation(
taskInfo: RunningTaskInfo, taskInfo: RunningTaskInfo,
freeformBounds: Rect freeformBounds: Rect
) { ) {
@@ -172,9 +177,10 @@ class DesktopTasksController(
if (Transitions.ENABLE_SHELL_TRANSITIONS) { if (Transitions.ENABLE_SHELL_TRANSITIONS) {
enterDesktopTaskTransitionHandler.startTransition( enterDesktopTaskTransitionHandler.startTransition(
Transitions.TRANSIT_ENTER_DESKTOP_MODE, wct) Transitions.TRANSIT_ENTER_DESKTOP_MODE, wct, mOnAnimationFinishedCallback)
} else { } else {
shellTaskOrganizer.applyTransaction(wct) shellTaskOrganizer.applyTransaction(wct)
releaseVisualIndicator()
} }
} }
@@ -205,21 +211,24 @@ class DesktopTasksController(
val wct = WindowContainerTransaction() val wct = WindowContainerTransaction()
addMoveToFullscreenChanges(wct, task.token) addMoveToFullscreenChanges(wct, task.token)
if (Transitions.ENABLE_SHELL_TRANSITIONS) { if (Transitions.ENABLE_SHELL_TRANSITIONS) {
enterDesktopTaskTransitionHandler.startCancelMoveToDesktopMode(wct, startPosition) enterDesktopTaskTransitionHandler.startCancelMoveToDesktopMode(wct, startPosition,
mOnAnimationFinishedCallback)
} else { } else {
shellTaskOrganizer.applyTransaction(wct) shellTaskOrganizer.applyTransaction(wct)
releaseVisualIndicator()
} }
} }
fun moveToFullscreenWithAnimation(task: ActivityManager.RunningTaskInfo) { private fun moveToFullscreenWithAnimation(task: ActivityManager.RunningTaskInfo) {
val wct = WindowContainerTransaction() val wct = WindowContainerTransaction()
addMoveToFullscreenChanges(wct, task.token) addMoveToFullscreenChanges(wct, task.token)
if (Transitions.ENABLE_SHELL_TRANSITIONS) { if (Transitions.ENABLE_SHELL_TRANSITIONS) {
exitDesktopTaskTransitionHandler.startTransition( exitDesktopTaskTransitionHandler.startTransition(
Transitions.TRANSIT_EXIT_DESKTOP_MODE, wct) Transitions.TRANSIT_EXIT_DESKTOP_MODE, wct, mOnAnimationFinishedCallback)
} else { } else {
shellTaskOrganizer.applyTransaction(wct) shellTaskOrganizer.applyTransaction(wct)
releaseVisualIndicator()
} }
} }
@@ -330,6 +339,16 @@ class DesktopTasksController(
?.let { homeTask -> wct.reorder(homeTask.getToken(), true /* onTop */) } ?.let { homeTask -> wct.reorder(homeTask.getToken(), true /* onTop */) }
} }
private fun releaseVisualIndicator() {
val t = SurfaceControl.Transaction()
visualIndicator?.releaseVisualIndicator(t)
visualIndicator = null
syncQueue.runInSync { transaction ->
transaction.merge(t)
t.close()
}
}
override fun getContext(): Context { override fun getContext(): Context {
return context return context
} }
@@ -471,8 +490,7 @@ class DesktopTasksController(
rootTaskDisplayAreaOrganizer) rootTaskDisplayAreaOrganizer)
visualIndicator?.createFullscreenIndicatorWithAnimatedBounds() visualIndicator?.createFullscreenIndicatorWithAnimatedBounds()
} else if (y > statusBarHeight && visualIndicator != null) { } else if (y > statusBarHeight && visualIndicator != null) {
visualIndicator?.releaseVisualIndicator() releaseVisualIndicator()
visualIndicator = null
} }
} }
} }
@@ -489,8 +507,6 @@ class DesktopTasksController(
) { ) {
val statusBarHeight = getStatusBarHeight(taskInfo) val statusBarHeight = getStatusBarHeight(taskInfo)
if (y <= statusBarHeight && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) { if (y <= statusBarHeight && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) {
visualIndicator?.releaseVisualIndicator()
visualIndicator = null
moveToFullscreenWithAnimation(taskInfo) moveToFullscreenWithAnimation(taskInfo)
} }
} }
@@ -508,6 +524,11 @@ class DesktopTasksController(
taskSurface: SurfaceControl, taskSurface: SurfaceControl,
y: Float y: Float
) { ) {
// If the motion event is above the status bar, return since we do not need to show the
// visual indicator at this point.
if (y < getStatusBarHeight(taskInfo)) {
return
}
if (visualIndicator == null) { if (visualIndicator == null) {
visualIndicator = DesktopModeVisualIndicator(syncQueue, taskInfo, visualIndicator = DesktopModeVisualIndicator(syncQueue, taskInfo,
displayController, context, taskSurface, shellTaskOrganizer, displayController, context, taskSurface, shellTaskOrganizer,
@@ -535,11 +556,8 @@ class DesktopTasksController(
freeformBounds: Rect freeformBounds: Rect
) { ) {
moveToDesktopWithAnimation(taskInfo, freeformBounds) moveToDesktopWithAnimation(taskInfo, freeformBounds)
visualIndicator?.releaseVisualIndicator()
visualIndicator = null
} }
private fun getStatusBarHeight(taskInfo: RunningTaskInfo): Int { private fun getStatusBarHeight(taskInfo: RunningTaskInfo): Int {
return displayController.getDisplayLayout(taskInfo.displayId)?.stableInsets()?.top ?: 0 return displayController.getDisplayLayout(taskInfo.displayId)?.stableInsets()?.top ?: 0
} }
@@ -566,7 +584,6 @@ class DesktopTasksController(
desktopModeTaskRepository.removeTaskCorners(taskId) desktopModeTaskRepository.removeTaskCorners(taskId)
} }
/** /**
* Adds a listener to find out about changes in the visibility of freeform tasks. * Adds a listener to find out about changes in the visibility of freeform tasks.
* *

View File

@@ -39,6 +39,7 @@ import com.android.wm.shell.transition.Transitions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
@@ -58,6 +59,7 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
private final List<IBinder> mPendingTransitionTokens = new ArrayList<>(); private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
private Point mStartPosition; private Point mStartPosition;
private Consumer<SurfaceControl.Transaction> mOnAnimationFinishedCallback;
public EnterDesktopTaskTransitionHandler( public EnterDesktopTaskTransitionHandler(
Transitions transitions) { Transitions transitions) {
@@ -75,9 +77,12 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
* Starts Transition of a given type * Starts Transition of a given type
* @param type Transition type * @param type Transition type
* @param wct WindowContainerTransaction for transition * @param wct WindowContainerTransaction for transition
* @param onAnimationEndCallback to be called after animation
*/ */
public void startTransition(@WindowManager.TransitionType int type, public void startTransition(@WindowManager.TransitionType int type,
@NonNull WindowContainerTransaction wct) { @NonNull WindowContainerTransaction wct,
Consumer<SurfaceControl.Transaction> onAnimationEndCallback) {
mOnAnimationFinishedCallback = onAnimationEndCallback;
final IBinder token = mTransitions.startTransition(type, wct, this); final IBinder token = mTransitions.startTransition(type, wct, this);
mPendingTransitionTokens.add(token); mPendingTransitionTokens.add(token);
} }
@@ -86,11 +91,14 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
* Starts Transition of type TRANSIT_CANCEL_ENTERING_DESKTOP_MODE * Starts Transition of type TRANSIT_CANCEL_ENTERING_DESKTOP_MODE
* @param wct WindowContainerTransaction for transition * @param wct WindowContainerTransaction for transition
* @param startPosition Position of task when transition is triggered * @param startPosition Position of task when transition is triggered
* @param onAnimationEndCallback to be called after animation
*/ */
public void startCancelMoveToDesktopMode(@NonNull WindowContainerTransaction wct, public void startCancelMoveToDesktopMode(@NonNull WindowContainerTransaction wct,
Point startPosition) { Point startPosition,
Consumer<SurfaceControl.Transaction> onAnimationEndCallback) {
mStartPosition = startPosition; mStartPosition = startPosition;
startTransition(Transitions.TRANSIT_CANCEL_ENTERING_DESKTOP_MODE, wct); startTransition(Transitions.TRANSIT_CANCEL_ENTERING_DESKTOP_MODE, wct,
mOnAnimationFinishedCallback);
} }
@Override @Override
@@ -111,7 +119,7 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
if (change.getMode() == WindowManager.TRANSIT_CHANGE) { if (change.getMode() == WindowManager.TRANSIT_CHANGE) {
transitionHandled |= startChangeTransition( transitionHandled |= startChangeTransition(
transition, info.getType(), change, startT, finishCallback); transition, info.getType(), change, startT, finishT, finishCallback);
} }
} }
@@ -125,6 +133,7 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
@WindowManager.TransitionType int type, @WindowManager.TransitionType int type,
@NonNull TransitionInfo.Change change, @NonNull TransitionInfo.Change change,
@NonNull SurfaceControl.Transaction startT, @NonNull SurfaceControl.Transaction startT,
@NonNull SurfaceControl.Transaction finishT,
@NonNull Transitions.TransitionFinishCallback finishCallback) { @NonNull Transitions.TransitionFinishCallback finishCallback) {
if (!mPendingTransitionTokens.contains(transition)) { if (!mPendingTransitionTokens.contains(transition)) {
return false; return false;
@@ -178,6 +187,9 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
animator.addListener(new AnimatorListenerAdapter() { animator.addListener(new AnimatorListenerAdapter() {
@Override @Override
public void onAnimationEnd(Animator animation) { public void onAnimationEnd(Animator animation) {
if (mOnAnimationFinishedCallback != null) {
mOnAnimationFinishedCallback.accept(finishT);
}
mTransitions.getMainExecutor().execute( mTransitions.getMainExecutor().execute(
() -> finishCallback.onTransitionFinished(null, null)); () -> finishCallback.onTransitionFinished(null, null));
} }
@@ -204,7 +216,7 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
animator.setDuration(FREEFORM_ANIMATION_DURATION); animator.setDuration(FREEFORM_ANIMATION_DURATION);
final SurfaceControl.Transaction t = mTransactionSupplier.get(); final SurfaceControl.Transaction t = mTransactionSupplier.get();
animator.addUpdateListener(animation -> { animator.addUpdateListener(animation -> {
final float scale = animation.getAnimatedFraction(); final float scale = (float) animation.getAnimatedValue();
t.setPosition(sc, mStartPosition.x * (1 - scale), mStartPosition.y * (1 - scale)) t.setPosition(sc, mStartPosition.x * (1 - scale), mStartPosition.y * (1 - scale))
.setScale(sc, scale, scale) .setScale(sc, scale, scale)
.show(sc) .show(sc)
@@ -213,6 +225,9 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition
animator.addListener(new AnimatorListenerAdapter() { animator.addListener(new AnimatorListenerAdapter() {
@Override @Override
public void onAnimationEnd(Animator animation) { public void onAnimationEnd(Animator animation) {
if (mOnAnimationFinishedCallback != null) {
mOnAnimationFinishedCallback.accept(finishT);
}
mTransitions.getMainExecutor().execute( mTransitions.getMainExecutor().execute(
() -> finishCallback.onTransitionFinished(null, null)); () -> finishCallback.onTransitionFinished(null, null));
} }

View File

@@ -42,6 +42,7 @@ import com.android.wm.shell.transition.Transitions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -54,7 +55,7 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
private final Context mContext; private final Context mContext;
private final Transitions mTransitions; private final Transitions mTransitions;
private final List<IBinder> mPendingTransitionTokens = new ArrayList<>(); private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
private Consumer<SurfaceControl.Transaction> mOnAnimationFinishedCallback;
private Supplier<SurfaceControl.Transaction> mTransactionSupplier; private Supplier<SurfaceControl.Transaction> mTransactionSupplier;
public ExitDesktopTaskTransitionHandler( public ExitDesktopTaskTransitionHandler(
@@ -76,9 +77,12 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
* Starts Transition of a given type * Starts Transition of a given type
* @param type Transition type * @param type Transition type
* @param wct WindowContainerTransaction for transition * @param wct WindowContainerTransaction for transition
* @param onAnimationEndCallback to be called after animation
*/ */
public void startTransition(@WindowManager.TransitionType int type, public void startTransition(@WindowManager.TransitionType int type,
@NonNull WindowContainerTransaction wct) { @NonNull WindowContainerTransaction wct,
Consumer<SurfaceControl.Transaction> onAnimationEndCallback) {
mOnAnimationFinishedCallback = onAnimationEndCallback;
final IBinder token = mTransitions.startTransition(type, wct, this); final IBinder token = mTransitions.startTransition(type, wct, this);
mPendingTransitionTokens.add(token); mPendingTransitionTokens.add(token);
} }
@@ -101,7 +105,7 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
if (change.getMode() == WindowManager.TRANSIT_CHANGE) { if (change.getMode() == WindowManager.TRANSIT_CHANGE) {
transitionHandled |= startChangeTransition( transitionHandled |= startChangeTransition(
transition, info.getType(), change, startT, finishCallback); transition, info.getType(), change, startT, finishT, finishCallback);
} }
} }
@@ -116,6 +120,7 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
@WindowManager.TransitionType int type, @WindowManager.TransitionType int type,
@NonNull TransitionInfo.Change change, @NonNull TransitionInfo.Change change,
@NonNull SurfaceControl.Transaction startT, @NonNull SurfaceControl.Transaction startT,
@NonNull SurfaceControl.Transaction finishT,
@NonNull Transitions.TransitionFinishCallback finishCallback) { @NonNull Transitions.TransitionFinishCallback finishCallback) {
if (!mPendingTransitionTokens.contains(transition)) { if (!mPendingTransitionTokens.contains(transition)) {
return false; return false;
@@ -156,6 +161,9 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH
animator.addListener(new AnimatorListenerAdapter() { animator.addListener(new AnimatorListenerAdapter() {
@Override @Override
public void onAnimationEnd(Animator animation) { public void onAnimationEnd(Animator animation) {
if (mOnAnimationFinishedCallback != null) {
mOnAnimationFinishedCallback.accept(finishT);
}
mTransitions.getMainExecutor().execute( mTransitions.getMainExecutor().execute(
() -> finishCallback.onTransitionFinished(null, null)); () -> finishCallback.onTransitionFinished(null, null));
} }

View File

@@ -111,7 +111,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
private ValueAnimator mDragToDesktopValueAnimator; private ValueAnimator mDragToDesktopValueAnimator;
private final Rect mDragToDesktopAnimationStartBounds = new Rect(); private final Rect mDragToDesktopAnimationStartBounds = new Rect();
private boolean mDragToDesktopAnimationStarted; private boolean mDragToDesktopAnimationStarted;
private float mCaptionDragStartX;
public DesktopModeWindowDecorViewModel( public DesktopModeWindowDecorViewModel(
Context context, Context context,
@@ -525,7 +524,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
DesktopModeWindowDecoration relevantDecor) { DesktopModeWindowDecoration relevantDecor) {
switch (ev.getActionMasked()) { switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: { case MotionEvent.ACTION_DOWN: {
mCaptionDragStartX = ev.getX();
// Begin drag through status bar if applicable. // Begin drag through status bar if applicable.
if (relevantDecor != null) { if (relevantDecor != null) {
mDragToDesktopAnimationStartBounds.set( mDragToDesktopAnimationStartBounds.set(
@@ -580,7 +578,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
} }
if (mTransitionDragActive) { if (mTransitionDragActive) {
mDesktopTasksController.ifPresent( mDesktopTasksController.ifPresent(
c -> c.onDragPositioningMoveThroughStatusBar(relevantDecor.mTaskInfo, c -> c.onDragPositioningMoveThroughStatusBar(
relevantDecor.mTaskInfo,
relevantDecor.mTaskSurface, ev.getY())); relevantDecor.mTaskSurface, ev.getY()));
final int statusBarHeight = getStatusBarHeight( final int statusBarHeight = getStatusBarHeight(
relevantDecor.mTaskInfo.displayId); relevantDecor.mTaskInfo.displayId);

View File

@@ -94,7 +94,7 @@ public class EnterDesktopTaskTransitionHandlerTest {
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
doReturn(mToken).when(mTransitions) doReturn(mToken).when(mTransitions)
.startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler); .startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler);
mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct); mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct, null);
TransitionInfo.Change change = TransitionInfo.Change change =
createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM); createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM);
@@ -115,7 +115,7 @@ public class EnterDesktopTaskTransitionHandlerTest {
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
doReturn(mToken).when(mTransitions) doReturn(mToken).when(mTransitions)
.startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler); .startTransition(transitionType, wct, mEnterDesktopTaskTransitionHandler);
mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct); mEnterDesktopTaskTransitionHandler.startTransition(transitionType, wct, null);
TransitionInfo.Change change = TransitionInfo.Change change =
createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM); createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FREEFORM);

View File

@@ -100,7 +100,7 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase {
doReturn(mToken).when(mTransitions) doReturn(mToken).when(mTransitions)
.startTransition(transitionType, wct, mExitDesktopTaskTransitionHandler); .startTransition(transitionType, wct, mExitDesktopTaskTransitionHandler);
mExitDesktopTaskTransitionHandler.startTransition(transitionType, wct); mExitDesktopTaskTransitionHandler.startTransition(transitionType, wct, null);
TransitionInfo.Change change = TransitionInfo.Change change =
createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FULLSCREEN); createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FULLSCREEN);