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) + } } }