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

Commit 7bada839 authored by Matthew DeVore's avatar Matthew DeVore Committed by Android (Google) Code Review
Browse files

Merge "external displays: mirror/extend switch" into main

parents 7957d4be 8f051ce5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2131,6 +2131,8 @@
    <string name="external_display_more_options_title">More options</string>
    <!-- External Display settings. -->
    <string name="external_display_topology_hint">Hold and drag to rearrange displays.</string>
    <!-- External Display settings. -->
    <string name="external_display_mirroring_title">Mirror built-in display</string>
    <!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
    <string name="wifi_display_settings_title">Cast</string>
+3 −2
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ class TopologyScale(
    }
}

const val PREFERENCE_KEY = "display_topology_preference"
const val TOPOLOGY_PREFERENCE_KEY = "display_topology_preference"

/** Padding in pane coordinate pixels on each side of a display block. */
const val BLOCK_PADDING = 2f
@@ -229,7 +229,8 @@ class DisplayTopologyPreference(context : Context)
        // Prevent highlight when hovering with mouse.
        isSelectable = false

        key = PREFERENCE_KEY
        key = TOPOLOGY_PREFERENCE_KEY
        isPersistent = false

        injector = Injector(context)
    }
+16 −1
Original line number Diff line number Diff line
@@ -102,6 +102,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
    @Nullable
    private Preference mDisplayTopologyPreference;
    @Nullable
    private Preference mMirrorPreference;
    @Nullable
    private PreferenceCategory mDisplaysPreference;
    @Nullable
    private PreferenceCategory mBuiltinDisplayPreference;
@@ -292,6 +294,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
        if (mDisplaysPreference == null) {
            mDisplaysPreference = new PreferenceCategory(context);
            mDisplaysPreference.setPersistent(false);
            mDisplaysPreference.setOrder(40);
        }
        return mDisplaysPreference;
    }
@@ -301,6 +304,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
        if (mBuiltinDisplayPreference == null) {
            mBuiltinDisplayPreference = new PreferenceCategory(context);
            mBuiltinDisplayPreference.setPersistent(false);
            mBuiltinDisplayPreference.setOrder(30);
        }
        return mBuiltinDisplayPreference;
    }
@@ -308,11 +312,19 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
    @NonNull Preference getDisplayTopologyPreference(@NonNull Context context) {
        if (mDisplayTopologyPreference == null) {
            mDisplayTopologyPreference = new DisplayTopologyPreference(context);
            mDisplayTopologyPreference.setPersistent(false);
            mDisplayTopologyPreference.setOrder(10);
        }
        return mDisplayTopologyPreference;
    }

    @NonNull Preference getMirrorPreference(@NonNull Context context) {
        if (mMirrorPreference == null) {
            mMirrorPreference = new MirrorPreference(context);
            mMirrorPreference.setOrder(20);
        }
        return mMirrorPreference;
    }

    private void restoreState(@Nullable Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            return;
@@ -399,6 +411,9 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
            @NonNull PreferenceScreen screen, @NonNull Context context) {
        if (mInjector != null && mInjector.getFlags().displayTopologyPaneInDisplayList()) {
            screen.addPreference(getDisplayTopologyPreference(context));
            if (!displaysToShow.isEmpty()) {
                screen.addPreference(getMirrorPreference(context));
            }

            // If topology is shown, we also show a preference for the built-in display for
            // consistency with the topology.
+51 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.connecteddevice.display

import android.content.Context
import android.provider.Settings

import androidx.preference.SwitchPreferenceCompat

import com.android.settings.R

const val MIRROR_PREFERENCE_KEY = "mirror_builtin_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)

        key = MIRROR_PREFERENCE_KEY
        isPersistent = false
    }

    override fun onAttached() {
        super.onAttached()
        setChecked(0 != Settings.Global.getInt(
                context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, 0))
    }

    override fun onClick() {
        super.onClick()
        Settings.Global.putInt(
                context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY,
                if (isChecked()) 1 else 0)
    }
}
+7 −3
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
        fragment.onSaveInstanceStateCallback(outState);
        assertThat(outState.getBoolean(PREVIOUSLY_SHOWN_LIST_KEY)).isTrue();

        pref = mPreferenceScreen.findPreference(DisplayTopologyKt.PREFERENCE_KEY);
        pref = mPreferenceScreen.findPreference(DisplayTopologyKt.TOPOLOGY_PREFERENCE_KEY);
        assertThat(pref).isNull();

        pref = mPreferenceScreen.findPreference(
@@ -122,7 +122,9 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
        doReturn(new Display[] {mDisplays[1]}).when(mMockedInjector).getAllDisplays();
        mHandler.flush();

        var pref = mPreferenceScreen.findPreference(DisplayTopologyKt.PREFERENCE_KEY);
        var pref = mPreferenceScreen.findPreference(DisplayTopologyKt.TOPOLOGY_PREFERENCE_KEY);
        assertThat(pref).isNotNull();
        pref = mPreferenceScreen.findPreference(MirroringKt.MIRROR_PREFERENCE_KEY);
        assertThat(pref).isNotNull();

        PreferenceCategory listPref =
@@ -145,8 +147,10 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
        doReturn(new Display[0]).when(mMockedInjector).getAllDisplays();
        mHandler.flush();

        var pref = mPreferenceScreen.findPreference(DisplayTopologyKt.PREFERENCE_KEY);
        var pref = mPreferenceScreen.findPreference(DisplayTopologyKt.TOPOLOGY_PREFERENCE_KEY);
        assertThat(pref).isNotNull();
        pref = mPreferenceScreen.findPreference(MirroringKt.MIRROR_PREFERENCE_KEY);
        assertThat(pref).isNull();

        PreferenceCategory listPref =
                mPreferenceScreen.findPreference(DISPLAYS_LIST_PREFERENCE_KEY);