Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ab5d527 authored by Lingyu Feng's avatar Lingyu Feng
Browse files

Start mirroring on the external display when lock task mode begins

and update the external display mirroring to ensure it match the system
settings when lock task mode ends.
This CL also ensures the external display shows mirroring if it's
connected to a device in lock task mode.

Bug: 408988940
Test: manaually test using TestDPC
Test: DisplayManagerServiceTest
Flag: com.android.server.display.feature.flags.enable_display_mirror_in_lock_task_mode
Change-Id: Iaafa2bdaf7d300d1e36e7c1e292d5262fce235d5
parent 8ef9373b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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,
+38 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -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);
@@ -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);
        }
@@ -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;
@@ -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();
+10 −0
Original line number Diff line number Diff line
@@ -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();
@@ -515,6 +520,10 @@ public class DisplayManagerFlags {
        return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled();
    }

    public boolean isDisplayMirrorInLockTaskModeEnabled() {
        return mIsDisplayMirrorInLockTaskModeEnabled.isEnabled();
    }

    /**
     * dumps all flagstates
     * @param pw printWriter
@@ -569,6 +578,7 @@ public class DisplayManagerFlags {
        pw.println(" " + mIsLoggingForDisplayEventsEnabled);
        pw.println(" " + mIsMinmodeCapBrightnessEnabled);
        pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled);
        pw.println(" " + mIsDisplayMirrorInLockTaskModeEnabled);
    }

    private static class FlagState {
+10 −0
Original line number Diff line number Diff line
@@ -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
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -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