Loading libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +19 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.wm.shell.freeform; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import android.app.ActivityManager; import android.os.IBinder; import android.view.SurfaceControl; Loading Loading @@ -57,6 +59,8 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo = new HashMap<>(); private final Map<Integer, ActivityManager.RunningTaskInfo> mPendingHiddenTasks = new HashMap<>(); public FreeformTaskTransitionObserver( ShellInit shellInit, Loading Loading @@ -135,9 +139,15 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs case WindowManager.TRANSIT_TO_FRONT: onToFrontTransitionReady(change, startT, finishT); break; case WindowManager.TRANSIT_TO_BACK: case WindowManager.TRANSIT_TO_BACK: { if (info.getType() == TRANSIT_START_RECENTS_TRANSITION) { // The tasks will be transiently hidden, which means they are still visible. mPendingHiddenTasks.put(taskInfo.taskId, taskInfo); } else { onToBackTransitionReady(change, startT, finishT); } break; } case WindowManager.TRANSIT_CLOSE: { taskInfoList.add(change.getTaskInfo()); onCloseTransitionReady(change, startT, finishT); Loading @@ -158,6 +168,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mTaskChangeListener.ifPresent(listener -> listener.onTaskOpening(change.getTaskInfo())); mWindowDecorViewModel.onTaskOpening( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onCloseTransitionReady( Loading @@ -175,6 +186,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mTaskChangeListener.ifPresent(listener -> listener.onTaskChanging(change.getTaskInfo())); mWindowDecorViewModel.onTaskChanging( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onToFrontTransitionReady( Loading @@ -185,6 +197,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs listener -> listener.onTaskMovingToFront(change.getTaskInfo())); mWindowDecorViewModel.onTaskChanging( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onToBackTransitionReady( Loading Loading @@ -245,5 +258,9 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs for (int i = 0; i < taskInfo.size(); ++i) { mWindowDecorViewModel.destroyWindowDecoration(taskInfo.get(i)); } for (ActivityManager.RunningTaskInfo task: mPendingHiddenTasks.values()) { mTaskChangeListener.ifPresent(it -> it.onTaskMovingToBack(task)); } } } libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -17,12 +17,15 @@ package com.android.wm.shell.freeform; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading Loading @@ -186,6 +189,30 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo()); } @Test public void recentsTransition_onTransitionFinished_notifiesOnTaskMovingToBack() { final TransitionInfo.Change change = createChange(TRANSIT_TO_BACK, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); final TransitionInfo.Change homeChange = createChange(TRANSIT_TO_FRONT, /* taskId= */ 2, WINDOWING_MODE_FULLSCREEN); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_START_RECENTS_TRANSITION, /* flags= */ 0) .addChange(homeChange) .addChange(change) .build(); final IBinder transition = mock(IBinder.class); final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); mTransitionObserver.onTransitionReady(transition, info, startT, finishT); mTransitionObserver.onTransitionStarting(transition); verify(mTaskChangeListener, never()).onTaskMovingToBack(change.getTaskInfo()); mTransitionObserver.onTransitionFinished(transition, false); verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo()); } @Test public void changeTransition_notifiesOnTaskChange() { final TransitionInfo.Change change = Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +19 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.wm.shell.freeform; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import android.app.ActivityManager; import android.os.IBinder; import android.view.SurfaceControl; Loading Loading @@ -57,6 +59,8 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo = new HashMap<>(); private final Map<Integer, ActivityManager.RunningTaskInfo> mPendingHiddenTasks = new HashMap<>(); public FreeformTaskTransitionObserver( ShellInit shellInit, Loading Loading @@ -135,9 +139,15 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs case WindowManager.TRANSIT_TO_FRONT: onToFrontTransitionReady(change, startT, finishT); break; case WindowManager.TRANSIT_TO_BACK: case WindowManager.TRANSIT_TO_BACK: { if (info.getType() == TRANSIT_START_RECENTS_TRANSITION) { // The tasks will be transiently hidden, which means they are still visible. mPendingHiddenTasks.put(taskInfo.taskId, taskInfo); } else { onToBackTransitionReady(change, startT, finishT); } break; } case WindowManager.TRANSIT_CLOSE: { taskInfoList.add(change.getTaskInfo()); onCloseTransitionReady(change, startT, finishT); Loading @@ -158,6 +168,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mTaskChangeListener.ifPresent(listener -> listener.onTaskOpening(change.getTaskInfo())); mWindowDecorViewModel.onTaskOpening( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onCloseTransitionReady( Loading @@ -175,6 +186,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mTaskChangeListener.ifPresent(listener -> listener.onTaskChanging(change.getTaskInfo())); mWindowDecorViewModel.onTaskChanging( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onToFrontTransitionReady( Loading @@ -185,6 +197,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs listener -> listener.onTaskMovingToFront(change.getTaskInfo())); mWindowDecorViewModel.onTaskChanging( change.getTaskInfo(), change.getLeash(), startT, finishT); mPendingHiddenTasks.remove(change.getTaskInfo().taskId); } private void onToBackTransitionReady( Loading Loading @@ -245,5 +258,9 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs for (int i = 0; i < taskInfo.size(); ++i) { mWindowDecorViewModel.destroyWindowDecoration(taskInfo.get(i)); } for (ActivityManager.RunningTaskInfo task: mPendingHiddenTasks.values()) { mTaskChangeListener.ifPresent(it -> it.onTaskMovingToBack(task)); } } }
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -17,12 +17,15 @@ package com.android.wm.shell.freeform; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading Loading @@ -186,6 +189,30 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo()); } @Test public void recentsTransition_onTransitionFinished_notifiesOnTaskMovingToBack() { final TransitionInfo.Change change = createChange(TRANSIT_TO_BACK, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); final TransitionInfo.Change homeChange = createChange(TRANSIT_TO_FRONT, /* taskId= */ 2, WINDOWING_MODE_FULLSCREEN); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_START_RECENTS_TRANSITION, /* flags= */ 0) .addChange(homeChange) .addChange(change) .build(); final IBinder transition = mock(IBinder.class); final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); mTransitionObserver.onTransitionReady(transition, info, startT, finishT); mTransitionObserver.onTransitionStarting(transition); verify(mTaskChangeListener, never()).onTaskMovingToBack(change.getTaskInfo()); mTransitionObserver.onTransitionFinished(transition, false); verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo()); } @Test public void changeTransition_notifiesOnTaskChange() { final TransitionInfo.Change change = Loading