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

Commit 08d0feb9 authored by Lingyu Feng's avatar Lingyu Feng Committed by Android (Google) Code Review
Browse files

Merge "Start mirroring on the external display when lock task mode begins" into main

parents aa7929f6 0ab5d527
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