Loading core/java/android/window/DesktopExperienceFlags.java +2 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,8 @@ public enum DesktopExperienceFlags { Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX), ENABLE_NON_DEFAULT_DISPLAY_SPLIT(Flags::enableNonDefaultDisplaySplit, true, Flags.FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT), ENABLE_NO_WINDOW_DECORATION_FOR_DESKS(Flags::enableNoWindowDecorationForDesks, false, Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS), ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS( Flags::enablePersistingDisplaySizeForConnectedDisplays, true, Flags.FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS), Loading core/java/android/window/flags/lse_desktop_experience.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -1280,6 +1280,16 @@ flag { } } flag { name: "enable_no_window_decoration_for_desks" namespace: "lse_desktop_experience" description: "Stops the creation of a window decoration for desk tasks." bug: "414449402" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "enable_window_repositioning_api" namespace: "lse_desktop_experience" Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -515,6 +515,7 @@ public abstract class WMShellModule { WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener, FocusTransitionObserver focusTransitionObserver, DesksOrganizer desksOrganizer, Optional<DesksTransitionObserver> desksTransitionObserver, DesktopState desktopState, Optional<DesktopImeHandler> desktopImeHandler, Loading @@ -526,6 +527,7 @@ public abstract class WMShellModule { windowDecorViewModel, taskChangeListener, focusTransitionObserver, desksOrganizer, desksTransitionObserver, desktopState, desktopImeHandler, Loading libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +12 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting; import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver; import com.android.wm.shell.desktopmode.DesktopImeHandler; import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer; import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver; import com.android.wm.shell.shared.desktopmode.DesktopState; import com.android.wm.shell.sysui.ShellInit; Loading @@ -58,6 +59,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs private final WindowDecorViewModel mWindowDecorViewModel; private final Optional<TaskChangeListener> mTaskChangeListener; private final FocusTransitionObserver mFocusTransitionObserver; private final DesksOrganizer mDesksOrganizer; private final Optional<DesksTransitionObserver> mDesksTransitionObserver; private final Optional<DesktopImeHandler> mDesktopImeHandler; private final Optional<DesktopBackNavTransitionObserver> mDesktopBackNavTransitionObserver; Loading @@ -75,6 +77,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener, FocusTransitionObserver focusTransitionObserver, DesksOrganizer desksOrganizer, Optional<DesksTransitionObserver> desksTransitionObserver, DesktopState desktopState, Optional<DesktopImeHandler> desktopImeHandler, Loading @@ -84,6 +87,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mWindowDecorViewModel = windowDecorViewModel; mTaskChangeListener = taskChangeListener; mFocusTransitionObserver = focusTransitionObserver; mDesksOrganizer = desksOrganizer; mDesksTransitionObserver = desksTransitionObserver; mDesktopImeHandler = desktopImeHandler; mDesktopBackNavTransitionObserver = desktopBackNavTransitionObserver; Loading Loading @@ -178,7 +182,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs } } private static boolean shouldSkipChange( private boolean shouldSkipChange( @NonNull TransitionInfo info, TransitionInfo.Change change, ArrayList<WindowContainerToken> taskParents) { Loading @@ -186,6 +190,12 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs return true; } // Skip desk changes so that window decorations are not added to desk root tasks if (DesktopExperienceFlags.ENABLE_NO_WINDOW_DECORATION_FOR_DESKS.isTrue() && mDesksOrganizer.isDeskChange(change)) { return true; } final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); if (taskInfo == null || taskInfo.taskId == -1) { return true; Loading @@ -199,10 +209,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs // between tasks (hierarchically). taskParents.add(change.getParent()); } if (taskParents.contains(change.getContainer())) { return true; } return false; return taskParents.contains(change.getContainer()); } private void onOpenTransitionReady( Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading @@ -49,6 +50,7 @@ import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver; import com.android.wm.shell.desktopmode.DesktopImeHandler; import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer; import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver; import com.android.wm.shell.shared.desktopmode.FakeDesktopState; import com.android.wm.shell.sysui.ShellInit; Loading Loading @@ -77,6 +79,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { @Mock private WindowDecorViewModel mWindowDecorViewModel; @Mock private TaskChangeListener mTaskChangeListener; @Mock private FocusTransitionObserver mFocusTransitionObserver; @Mock private DesksOrganizer mDesksOrganizer; @Mock private DesksTransitionObserver mDesksTransitionObserver; @Mock private DesktopImeHandler mDesktopImeHandler; @Mock private DesktopBackNavTransitionObserver mDesktopBackNavTransitionObserver; Loading @@ -93,6 +96,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { PackageManager pm = mock(PackageManager.class); doReturn(true).when(pm).hasSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT); doReturn(false).when(mDesksOrganizer).isDeskChange(any()); final Context context = mock(Context.class); doReturn(pm).when(context).getPackageManager(); Loading @@ -104,6 +108,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { mWindowDecorViewModel, Optional.of(mTaskChangeListener), mFocusTransitionObserver, mDesksOrganizer, Optional.of(mDesksTransitionObserver), mDesktopState, Optional.of(mDesktopImeHandler), Loading Loading @@ -143,6 +148,42 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { .onTaskOpening(change.getTaskInfo(), change.getLeash(), startT, finishT); } @Test @EnableFlags(Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS) public void desksChange_windowDecorNotCreatedForDesksTask() { final TransitionInfo.Change change = createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0).addChange(change).build(); doReturn(true).when(mDesksOrganizer).isDeskChange(change); 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(mWindowDecorViewModel, never()) .onTaskOpening(change.getTaskInfo(), change.getLeash(), startT, finishT); } @Test @EnableFlags(Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS) public void desksChange_listenerNotNotifiedOfTaskChange() { final TransitionInfo.Change change = createChange(TRANSIT_CHANGE, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CHANGE, /* flags= */ 0).addChange(change).build(); doReturn(true).when(mDesksOrganizer).isDeskChange(change); 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()).onTaskChanging(change.getTaskInfo()); } @Test public void openTransition_notifiesOnTaskOpening() { final TransitionInfo.Change change = createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM); Loading Loading
core/java/android/window/DesktopExperienceFlags.java +2 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,8 @@ public enum DesktopExperienceFlags { Flags.FLAG_NESTED_TASKS_WITH_INDEPENDENT_BOUNDS_BUGFIX), ENABLE_NON_DEFAULT_DISPLAY_SPLIT(Flags::enableNonDefaultDisplaySplit, true, Flags.FLAG_ENABLE_NON_DEFAULT_DISPLAY_SPLIT), ENABLE_NO_WINDOW_DECORATION_FOR_DESKS(Flags::enableNoWindowDecorationForDesks, false, Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS), ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS( Flags::enablePersistingDisplaySizeForConnectedDisplays, true, Flags.FLAG_ENABLE_PERSISTING_DISPLAY_SIZE_FOR_CONNECTED_DISPLAYS), Loading
core/java/android/window/flags/lse_desktop_experience.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -1280,6 +1280,16 @@ flag { } } flag { name: "enable_no_window_decoration_for_desks" namespace: "lse_desktop_experience" description: "Stops the creation of a window decoration for desk tasks." bug: "414449402" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "enable_window_repositioning_api" namespace: "lse_desktop_experience" Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -515,6 +515,7 @@ public abstract class WMShellModule { WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener, FocusTransitionObserver focusTransitionObserver, DesksOrganizer desksOrganizer, Optional<DesksTransitionObserver> desksTransitionObserver, DesktopState desktopState, Optional<DesktopImeHandler> desktopImeHandler, Loading @@ -526,6 +527,7 @@ public abstract class WMShellModule { windowDecorViewModel, taskChangeListener, focusTransitionObserver, desksOrganizer, desksTransitionObserver, desktopState, desktopImeHandler, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +12 −5 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting; import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver; import com.android.wm.shell.desktopmode.DesktopImeHandler; import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer; import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver; import com.android.wm.shell.shared.desktopmode.DesktopState; import com.android.wm.shell.sysui.ShellInit; Loading @@ -58,6 +59,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs private final WindowDecorViewModel mWindowDecorViewModel; private final Optional<TaskChangeListener> mTaskChangeListener; private final FocusTransitionObserver mFocusTransitionObserver; private final DesksOrganizer mDesksOrganizer; private final Optional<DesksTransitionObserver> mDesksTransitionObserver; private final Optional<DesktopImeHandler> mDesktopImeHandler; private final Optional<DesktopBackNavTransitionObserver> mDesktopBackNavTransitionObserver; Loading @@ -75,6 +77,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs WindowDecorViewModel windowDecorViewModel, Optional<TaskChangeListener> taskChangeListener, FocusTransitionObserver focusTransitionObserver, DesksOrganizer desksOrganizer, Optional<DesksTransitionObserver> desksTransitionObserver, DesktopState desktopState, Optional<DesktopImeHandler> desktopImeHandler, Loading @@ -84,6 +87,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs mWindowDecorViewModel = windowDecorViewModel; mTaskChangeListener = taskChangeListener; mFocusTransitionObserver = focusTransitionObserver; mDesksOrganizer = desksOrganizer; mDesksTransitionObserver = desksTransitionObserver; mDesktopImeHandler = desktopImeHandler; mDesktopBackNavTransitionObserver = desktopBackNavTransitionObserver; Loading Loading @@ -178,7 +182,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs } } private static boolean shouldSkipChange( private boolean shouldSkipChange( @NonNull TransitionInfo info, TransitionInfo.Change change, ArrayList<WindowContainerToken> taskParents) { Loading @@ -186,6 +190,12 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs return true; } // Skip desk changes so that window decorations are not added to desk root tasks if (DesktopExperienceFlags.ENABLE_NO_WINDOW_DECORATION_FOR_DESKS.isTrue() && mDesksOrganizer.isDeskChange(change)) { return true; } final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); if (taskInfo == null || taskInfo.taskId == -1) { return true; Loading @@ -199,10 +209,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs // between tasks (hierarchically). taskParents.add(change.getParent()); } if (taskParents.contains(change.getContainer())) { return true; } return false; return taskParents.contains(change.getContainer()); } private void onOpenTransitionReady( Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +41 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.transition.Transitions.TRANSIT_START_RECENTS_TRANSITION; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading @@ -49,6 +50,7 @@ import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.desktopmode.DesktopBackNavTransitionObserver; import com.android.wm.shell.desktopmode.DesktopImeHandler; import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer; import com.android.wm.shell.desktopmode.multidesks.DesksTransitionObserver; import com.android.wm.shell.shared.desktopmode.FakeDesktopState; import com.android.wm.shell.sysui.ShellInit; Loading Loading @@ -77,6 +79,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { @Mock private WindowDecorViewModel mWindowDecorViewModel; @Mock private TaskChangeListener mTaskChangeListener; @Mock private FocusTransitionObserver mFocusTransitionObserver; @Mock private DesksOrganizer mDesksOrganizer; @Mock private DesksTransitionObserver mDesksTransitionObserver; @Mock private DesktopImeHandler mDesktopImeHandler; @Mock private DesktopBackNavTransitionObserver mDesktopBackNavTransitionObserver; Loading @@ -93,6 +96,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { PackageManager pm = mock(PackageManager.class); doReturn(true).when(pm).hasSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT); doReturn(false).when(mDesksOrganizer).isDeskChange(any()); final Context context = mock(Context.class); doReturn(pm).when(context).getPackageManager(); Loading @@ -104,6 +108,7 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { mWindowDecorViewModel, Optional.of(mTaskChangeListener), mFocusTransitionObserver, mDesksOrganizer, Optional.of(mDesksTransitionObserver), mDesktopState, Optional.of(mDesktopImeHandler), Loading Loading @@ -143,6 +148,42 @@ public class FreeformTaskTransitionObserverTest extends ShellTestCase { .onTaskOpening(change.getTaskInfo(), change.getLeash(), startT, finishT); } @Test @EnableFlags(Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS) public void desksChange_windowDecorNotCreatedForDesksTask() { final TransitionInfo.Change change = createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0).addChange(change).build(); doReturn(true).when(mDesksOrganizer).isDeskChange(change); 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(mWindowDecorViewModel, never()) .onTaskOpening(change.getTaskInfo(), change.getLeash(), startT, finishT); } @Test @EnableFlags(Flags.FLAG_ENABLE_NO_WINDOW_DECORATION_FOR_DESKS) public void desksChange_listenerNotNotifiedOfTaskChange() { final TransitionInfo.Change change = createChange(TRANSIT_CHANGE, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CHANGE, /* flags= */ 0).addChange(change).build(); doReturn(true).when(mDesksOrganizer).isDeskChange(change); 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()).onTaskChanging(change.getTaskInfo()); } @Test public void openTransition_notifiesOnTaskOpening() { final TransitionInfo.Change change = createChange(TRANSIT_OPEN, 1, WINDOWING_MODE_FREEFORM); Loading