Loading res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> src/com/android/settings/connecteddevice/display/DisplayTopology.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } Loading src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -292,6 +294,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen if (mDisplaysPreference == null) { mDisplaysPreference = new PreferenceCategory(context); mDisplaysPreference.setPersistent(false); mDisplaysPreference.setOrder(40); } return mDisplaysPreference; } Loading @@ -301,6 +304,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen if (mBuiltinDisplayPreference == null) { mBuiltinDisplayPreference = new PreferenceCategory(context); mBuiltinDisplayPreference.setPersistent(false); mBuiltinDisplayPreference.setOrder(30); } return mBuiltinDisplayPreference; } Loading @@ -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; Loading Loading @@ -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. Loading src/com/android/settings/connecteddevice/display/Mirroring.kt 0 → 100644 +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) } } tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java +7 −3 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 = Loading @@ -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); Loading Loading
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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>
src/com/android/settings/connecteddevice/display/DisplayTopology.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } Loading
src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -292,6 +294,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen if (mDisplaysPreference == null) { mDisplaysPreference = new PreferenceCategory(context); mDisplaysPreference.setPersistent(false); mDisplaysPreference.setOrder(40); } return mDisplaysPreference; } Loading @@ -301,6 +304,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen if (mBuiltinDisplayPreference == null) { mBuiltinDisplayPreference = new PreferenceCategory(context); mBuiltinDisplayPreference.setPersistent(false); mBuiltinDisplayPreference.setOrder(30); } return mBuiltinDisplayPreference; } Loading @@ -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; Loading Loading @@ -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. Loading
src/com/android/settings/connecteddevice/display/Mirroring.kt 0 → 100644 +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) } }
tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java +7 −3 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 = Loading @@ -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); Loading