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.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.

View File

@@ -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()
if (contentModeEnabled) {
Settings.Secure.putInt(
context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY,
if (isChecked()) 1 else 0)
context.contentResolver, MIRROR_SETTING, if (isChecked()) 1 else 0)
}
}
}