From 6edab7d35f62aea7e1be2758f6860be94488b157 Mon Sep 17 00:00:00 2001 From: Matthew DeVore Date: Thu, 20 Feb 2025 01:05:08 +0000 Subject: [PATCH] Disable mirror toggle if feature turned off If the content mode management feature is disabled, the mirror display toggle should be disabled, and instead reflect the inverse of the "force desktop on external displays" system property. Flag: com.android.settings.flags.display_topology_pane_in_display_list Test: manual with and without toggle user-changeable Bug: b/396116157 Change-Id: I550fc918aaebab7129a559c0e49b88c8da7bc00d --- .../ExternalDisplayPreferenceFragment.java | 19 ++++++------ .../connecteddevice/display/Mirroring.kt | 30 +++++++++++-------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java index eead240e4e0..ef85d93c447 100644 --- a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java +++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java @@ -35,6 +35,7 @@ import android.os.Bundle; import android.view.Display; import android.view.View; import android.widget.TextView; +import android.window.DesktopExperienceFlags; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -66,7 +67,7 @@ import java.util.List; public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase { @VisibleForTesting enum PrefBasics { DISPLAY_TOPOLOGY(10, "display_topology_preference", null), - MIRROR(20, "mirror_preference", null), + MIRROR(20, "mirror_preference", R.string.external_display_mirroring_title), // If shown, use toggle should be before other per-display settings. EXTERNAL_DISPLAY_USE(30, "external_display_use_preference", @@ -133,8 +134,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen @Nullable private Preference mDisplayTopologyPreference; @Nullable - private Preference mMirrorPreference; - @Nullable private PreferenceCategory mBuiltinDisplayPreference; @Nullable private Preference mBuiltinDisplaySizeAndTextPreference; @@ -357,12 +356,14 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen return mDisplayTopologyPreference; } - @NonNull Preference getMirrorPreference(@NonNull Context context) { - if (mMirrorPreference == null) { - mMirrorPreference = new MirrorPreference(context); - PrefBasics.MIRROR.apply(mMirrorPreference); + private void addMirrorPreference(Context context, PrefRefresh refresh) { + Preference pref = refresh.findUnusedPreference(PrefBasics.MIRROR.key); + if (pref == null) { + pref = new MirrorPreference(context, + DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue()); + PrefBasics.MIRROR.apply(pref); } - return mMirrorPreference; + refresh.addPreference(pref); } @NonNull @@ -520,7 +521,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen private void maybeAddV2Components(Context context, PrefRefresh screen) { if (isTopologyPaneEnabled(mInjector)) { screen.addPreference(getDisplayTopologyPreference(context)); - screen.addPreference(getMirrorPreference(context)); + addMirrorPreference(context, screen); // If topology is shown, we also show a preference for the built-in display for // consistency with the topology. diff --git a/src/com/android/settings/connecteddevice/display/Mirroring.kt b/src/com/android/settings/connecteddevice/display/Mirroring.kt index 453f270ba4e..fed5b65a87d 100644 --- a/src/com/android/settings/connecteddevice/display/Mirroring.kt +++ b/src/com/android/settings/connecteddevice/display/Mirroring.kt @@ -23,26 +23,32 @@ import androidx.preference.SwitchPreferenceCompat import com.android.settings.R +const val MIRROR_SETTING = Settings.Secure.MIRROR_BUILT_IN_DISPLAY + /** * A switch preference which is backed by the MIRROR_BUILT_IN_DISPLAY global setting. */ -class MirrorPreference(context: Context): SwitchPreferenceCompat(context) { - init { - setTitle(R.string.external_display_mirroring_title) - - isPersistent = false - } - +class MirrorPreference(context: Context, val contentModeEnabled: Boolean): + SwitchPreferenceCompat(context) { override fun onAttached() { super.onAttached() - setChecked(0 != Settings.Secure.getInt( - context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, 0)) + + isEnabled = contentModeEnabled + if (contentModeEnabled) { + setChecked(0 != Settings.Secure.getInt(context.contentResolver, MIRROR_SETTING, 0)) + } else { + setChecked(0 == Settings.Global.getInt( + context.contentResolver, + Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0)) + } } override fun onClick() { super.onClick() - Settings.Secure.putInt( - context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, - if (isChecked()) 1 else 0) + + if (contentModeEnabled) { + Settings.Secure.putInt( + context.contentResolver, MIRROR_SETTING, if (isChecked()) 1 else 0) + } } }