Loading core/java/android/window/DesktopExperienceFlags.java +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.window; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DEFAULT_DISPLAY_IN_TOPOLOGY_SWITCH; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import android.annotation.NonNull; Loading Loading @@ -159,6 +160,9 @@ public enum DesktopExperienceFlags { Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION), ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS(Flags::enableDisplayFocusInShellTransitions, true, Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS), ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE( com.android.server.display.feature.flags.Flags::enableDisplayMirrorInLockTaskMode, false, FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE), ENABLE_DISPLAY_RECONNECT_INTERACTION(Flags::enableDisplayReconnectInteraction, true, Flags.FLAG_ENABLE_DISPLAY_RECONNECT_INTERACTION), ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING(Flags::enableDisplayWindowingModeSwitching, true, Loading services/core/java/com/android/server/display/DisplayManagerService.java +38 −3 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.TaskStackListener; import android.app.backup.BackupManager; import android.app.compat.CompatChanges; import android.companion.virtual.IVirtualDevice; Loading Loading @@ -202,6 +203,7 @@ import com.android.server.display.utils.DebugUtils; import com.android.server.display.utils.SensorUtils; import com.android.server.input.InputManagerInternal; import com.android.server.utils.FoldSettingProvider; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.DesktopModeHelper; import com.android.server.wm.SurfaceAnimationThread; import com.android.server.wm.WindowManagerInternal; Loading Loading @@ -305,6 +307,7 @@ public final class DisplayManagerService extends SystemService { @Nullable private InputManagerInternal mInputManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private final UidImportanceListener mUidImportanceListener = new UidImportanceListener(); private final DisplayFrameworkStatsLogger mStatsLogger = new DisplayFrameworkStatsLogger(); Loading Loading @@ -853,6 +856,8 @@ public final class DisplayManagerService extends SystemService { mInputManagerInternal.setDisplayTopology(graph); } mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mActivityTaskManagerInternal = LocalServices.getService( ActivityTaskManagerInternal.class); ActivityManager activityManager = mContext.getSystemService(ActivityManager.class); activityManager.addOnUidImportanceListener(mUidImportanceListener, IMPORTANCE_CACHED); Loading @@ -861,6 +866,10 @@ public final class DisplayManagerService extends SystemService { mContext.getSystemService(DeviceStateManager.class).registerCallback( mHandlerExecutor, new DeviceStateListener()); if (mFlags.isDisplayMirrorInLockTaskModeEnabled()) { setupTaskStackListener(); } mLogicalDisplayMapper.onWindowManagerReady(); scheduleTraversalLocked(false); } Loading Loading @@ -1275,9 +1284,20 @@ public final class DisplayManagerService extends SystemService { } private boolean updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { final boolean mirrorBuiltInDisplay; if (mFlags.isDisplayMirrorInLockTaskModeEnabled() && mActivityTaskManagerInternal.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) { // If the device is in lock task mode, enable external displays mirroring regardless of // the system setting. mirrorBuiltInDisplay = true; } else { // If the device isn't in lock task mode, update the external mirroring to match the // system setting. ContentResolver resolver = mContext.getContentResolver(); final boolean mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, MIRROR_BUILT_IN_DISPLAY, 0, UserHandle.USER_CURRENT) != 0; } if (mMirrorBuiltInDisplay == mirrorBuiltInDisplay) { // No change in setting. return false; Loading Loading @@ -3794,6 +3814,21 @@ public final class DisplayManagerService extends SystemService { } } private void setupTaskStackListener() { final TaskStackListener taskStackListener = new TaskStackListener() { @Override public void onLockTaskModeChanged(int mode) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); } }; try { mActivityTaskManagerInternal.registerTaskStackListener(taskStackListener); } catch (Exception e) { Slog.w(TAG, "Failed to call registerTaskStackListener", e); } } private IMediaProjectionManager getProjectionService() { if (mProjectionService == null) { mProjectionService = mInjector.getProjectionService(); Loading services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -264,6 +264,11 @@ public class DisplayManagerFlags { Flags::enableSingleAppEventForModeAndFrameRateOverride ); private final FlagState mIsDisplayMirrorInLockTaskModeEnabled = new FlagState( Flags.FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE, DesktopExperienceFlags.ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE::isTrue ); /** Returns whether power throttling clamper is enabled on not. */ public boolean isPowerThrottlingClamperEnabled() { return mPowerThrottlingClamperFlagState.isEnabled(); Loading Loading @@ -515,6 +520,10 @@ public class DisplayManagerFlags { return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled(); } public boolean isDisplayMirrorInLockTaskModeEnabled() { return mIsDisplayMirrorInLockTaskModeEnabled.isEnabled(); } /** * dumps all flagstates * @param pw printWriter Loading Loading @@ -569,6 +578,7 @@ public class DisplayManagerFlags { pw.println(" " + mIsLoggingForDisplayEventsEnabled); pw.println(" " + mIsMinmodeCapBrightnessEnabled); pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled); pw.println(" " + mIsDisplayMirrorInLockTaskModeEnabled); } private static class FlagState { Loading services/core/java/com/android/server/display/feature/display_flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -435,3 +435,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "enable_display_mirror_in_lock_task_mode" namespace: "lse_desktop_experience" description: "Starts mirroring on the connected display if the device is in lock task mode." bug: "408988940" metadata { purpose: PURPOSE_BUGFIX } } services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +3 −0 Original line number Diff line number Diff line Loading @@ -826,4 +826,7 @@ public abstract class ActivityTaskManagerInternal implements ActiveUids.Observer /** Requests to remove a Task by the given Task ID, along with the corresponding reason. */ public abstract boolean removeTask(int taskId, @NonNull String reason); /** Returns the current lock task mode state. */ public abstract int getLockTaskModeState(); } Loading
core/java/android/window/DesktopExperienceFlags.java +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.window; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DEFAULT_DISPLAY_IN_TOPOLOGY_SWITCH; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import android.annotation.NonNull; Loading Loading @@ -159,6 +160,9 @@ public enum DesktopExperienceFlags { Flags.FLAG_ENABLE_DISPLAY_DISCONNECT_INTERACTION), ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS(Flags::enableDisplayFocusInShellTransitions, true, Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS), ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE( com.android.server.display.feature.flags.Flags::enableDisplayMirrorInLockTaskMode, false, FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE), ENABLE_DISPLAY_RECONNECT_INTERACTION(Flags::enableDisplayReconnectInteraction, true, Flags.FLAG_ENABLE_DISPLAY_RECONNECT_INTERACTION), ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING(Flags::enableDisplayWindowingModeSwitching, true, Loading
services/core/java/com/android/server/display/DisplayManagerService.java +38 −3 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.TaskStackListener; import android.app.backup.BackupManager; import android.app.compat.CompatChanges; import android.companion.virtual.IVirtualDevice; Loading Loading @@ -202,6 +203,7 @@ import com.android.server.display.utils.DebugUtils; import com.android.server.display.utils.SensorUtils; import com.android.server.input.InputManagerInternal; import com.android.server.utils.FoldSettingProvider; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.DesktopModeHelper; import com.android.server.wm.SurfaceAnimationThread; import com.android.server.wm.WindowManagerInternal; Loading Loading @@ -305,6 +307,7 @@ public final class DisplayManagerService extends SystemService { @Nullable private InputManagerInternal mInputManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private final UidImportanceListener mUidImportanceListener = new UidImportanceListener(); private final DisplayFrameworkStatsLogger mStatsLogger = new DisplayFrameworkStatsLogger(); Loading Loading @@ -853,6 +856,8 @@ public final class DisplayManagerService extends SystemService { mInputManagerInternal.setDisplayTopology(graph); } mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mActivityTaskManagerInternal = LocalServices.getService( ActivityTaskManagerInternal.class); ActivityManager activityManager = mContext.getSystemService(ActivityManager.class); activityManager.addOnUidImportanceListener(mUidImportanceListener, IMPORTANCE_CACHED); Loading @@ -861,6 +866,10 @@ public final class DisplayManagerService extends SystemService { mContext.getSystemService(DeviceStateManager.class).registerCallback( mHandlerExecutor, new DeviceStateListener()); if (mFlags.isDisplayMirrorInLockTaskModeEnabled()) { setupTaskStackListener(); } mLogicalDisplayMapper.onWindowManagerReady(); scheduleTraversalLocked(false); } Loading Loading @@ -1275,9 +1284,20 @@ public final class DisplayManagerService extends SystemService { } private boolean updateMirrorBuiltInDisplaySettingLocked(boolean shouldSendDisplayChangeEvent) { final boolean mirrorBuiltInDisplay; if (mFlags.isDisplayMirrorInLockTaskModeEnabled() && mActivityTaskManagerInternal.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) { // If the device is in lock task mode, enable external displays mirroring regardless of // the system setting. mirrorBuiltInDisplay = true; } else { // If the device isn't in lock task mode, update the external mirroring to match the // system setting. ContentResolver resolver = mContext.getContentResolver(); final boolean mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, mirrorBuiltInDisplay = Settings.Secure.getIntForUser(resolver, MIRROR_BUILT_IN_DISPLAY, 0, UserHandle.USER_CURRENT) != 0; } if (mMirrorBuiltInDisplay == mirrorBuiltInDisplay) { // No change in setting. return false; Loading Loading @@ -3794,6 +3814,21 @@ public final class DisplayManagerService extends SystemService { } } private void setupTaskStackListener() { final TaskStackListener taskStackListener = new TaskStackListener() { @Override public void onLockTaskModeChanged(int mode) { updateMirrorBuiltInDisplaySettingLocked(/*shouldSendDisplayChangeEvent=*/ true); } }; try { mActivityTaskManagerInternal.registerTaskStackListener(taskStackListener); } catch (Exception e) { Slog.w(TAG, "Failed to call registerTaskStackListener", e); } } private IMediaProjectionManager getProjectionService() { if (mProjectionService == null) { mProjectionService = mInjector.getProjectionService(); Loading
services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -264,6 +264,11 @@ public class DisplayManagerFlags { Flags::enableSingleAppEventForModeAndFrameRateOverride ); private final FlagState mIsDisplayMirrorInLockTaskModeEnabled = new FlagState( Flags.FLAG_ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE, DesktopExperienceFlags.ENABLE_DISPLAY_MIRROR_IN_LOCK_TASK_MODE::isTrue ); /** Returns whether power throttling clamper is enabled on not. */ public boolean isPowerThrottlingClamperEnabled() { return mPowerThrottlingClamperFlagState.isEnabled(); Loading Loading @@ -515,6 +520,10 @@ public class DisplayManagerFlags { return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled(); } public boolean isDisplayMirrorInLockTaskModeEnabled() { return mIsDisplayMirrorInLockTaskModeEnabled.isEnabled(); } /** * dumps all flagstates * @param pw printWriter Loading Loading @@ -569,6 +578,7 @@ public class DisplayManagerFlags { pw.println(" " + mIsLoggingForDisplayEventsEnabled); pw.println(" " + mIsMinmodeCapBrightnessEnabled); pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled); pw.println(" " + mIsDisplayMirrorInLockTaskModeEnabled); } private static class FlagState { Loading
services/core/java/com/android/server/display/feature/display_flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -435,3 +435,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "enable_display_mirror_in_lock_task_mode" namespace: "lse_desktop_experience" description: "Starts mirroring on the connected display if the device is in lock task mode." bug: "408988940" metadata { purpose: PURPOSE_BUGFIX } }
services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +3 −0 Original line number Diff line number Diff line Loading @@ -826,4 +826,7 @@ public abstract class ActivityTaskManagerInternal implements ActiveUids.Observer /** Requests to remove a Task by the given Task ID, along with the corresponding reason. */ public abstract boolean removeTask(int taskId, @NonNull String reason); /** Returns the current lock task mode state. */ public abstract int getLockTaskModeState(); }