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
This commit is contained in:
Matthew DeVore
2025-02-20 01:05:08 +00:00
parent c37fc8b827
commit 6edab7d35f
2 changed files with 28 additions and 21 deletions

View File

@@ -35,6 +35,7 @@ import android.os.Bundle;
import android.view.Display; import android.view.Display;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.window.DesktopExperienceFlags;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -66,7 +67,7 @@ import java.util.List;
public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase { public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase {
@VisibleForTesting enum PrefBasics { @VisibleForTesting enum PrefBasics {
DISPLAY_TOPOLOGY(10, "display_topology_preference", null), 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. // If shown, use toggle should be before other per-display settings.
EXTERNAL_DISPLAY_USE(30, "external_display_use_preference", EXTERNAL_DISPLAY_USE(30, "external_display_use_preference",
@@ -133,8 +134,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
@Nullable @Nullable
private Preference mDisplayTopologyPreference; private Preference mDisplayTopologyPreference;
@Nullable @Nullable
private Preference mMirrorPreference;
@Nullable
private PreferenceCategory mBuiltinDisplayPreference; private PreferenceCategory mBuiltinDisplayPreference;
@Nullable @Nullable
private Preference mBuiltinDisplaySizeAndTextPreference; private Preference mBuiltinDisplaySizeAndTextPreference;
@@ -357,12 +356,14 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
return mDisplayTopologyPreference; return mDisplayTopologyPreference;
} }
@NonNull Preference getMirrorPreference(@NonNull Context context) { private void addMirrorPreference(Context context, PrefRefresh refresh) {
if (mMirrorPreference == null) { Preference pref = refresh.findUnusedPreference(PrefBasics.MIRROR.key);
mMirrorPreference = new MirrorPreference(context); if (pref == null) {
PrefBasics.MIRROR.apply(mMirrorPreference); pref = new MirrorPreference(context,
DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue());
PrefBasics.MIRROR.apply(pref);
} }
return mMirrorPreference; refresh.addPreference(pref);
} }
@NonNull @NonNull
@@ -520,7 +521,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
private void maybeAddV2Components(Context context, PrefRefresh screen) { private void maybeAddV2Components(Context context, PrefRefresh screen) {
if (isTopologyPaneEnabled(mInjector)) { if (isTopologyPaneEnabled(mInjector)) {
screen.addPreference(getDisplayTopologyPreference(context)); 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 // If topology is shown, we also show a preference for the built-in display for
// consistency with the topology. // consistency with the topology.

View File

@@ -23,26 +23,32 @@ import androidx.preference.SwitchPreferenceCompat
import com.android.settings.R 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. * A switch preference which is backed by the MIRROR_BUILT_IN_DISPLAY global setting.
*/ */
class MirrorPreference(context: Context): SwitchPreferenceCompat(context) { class MirrorPreference(context: Context, val contentModeEnabled: Boolean):
init { SwitchPreferenceCompat(context) {
setTitle(R.string.external_display_mirroring_title)
isPersistent = false
}
override fun onAttached() { override fun onAttached() {
super.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() { override fun onClick() {
super.onClick() super.onClick()
Settings.Secure.putInt(
context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, if (contentModeEnabled) {
if (isChecked()) 1 else 0) Settings.Secure.putInt(
context.contentResolver, MIRROR_SETTING, if (isChecked()) 1 else 0)
}
} }
} }