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

Commit 6edab7d3 authored by Matthew DeVore's avatar Matthew DeVore
Browse files

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
parent c37fc8b8
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -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.
+18 −12
Original line number Diff line number Diff line
@@ -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)
        }
    }
}