Merge "Show built-in display if topology is visible" into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d387ceb..05b3b3f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2007,6 +2007,8 @@
     <string name="external_display_off">Off</string>
     <!-- External Display settings. The title of the screen. [CHAR LIMIT=40] -->
     <string name="external_display_settings_title">External Display</string>
+    <!-- Built-in display settings category. Appears in External displays and Connected Displays fragments. -->
+    <string name="builtin_display_settings_category">Built-in display</string>
     <!-- External Display use. The title of the use preference. [CHAR LIMIT=40] -->
     <string name="external_display_use_title">Use external display</string>
     <!-- External Display resolution settings. The title of the screen. [CHAR LIMIT=40] -->
diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
index 047ffd4..de1363d 100644
--- a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
+++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.connecteddevice.display;
 
-
 import static android.view.Display.INVALID_DISPLAY;
 
 import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_HELP_URL;
@@ -46,6 +45,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragmentBase;
+import com.android.settings.accessibility.TextReadingPreferenceFragment;
 import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DisplayListener;
 import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.Injector;
 import com.android.settings.core.SubSettingLauncher;
@@ -64,6 +64,7 @@
 public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase {
     static final int EXTERNAL_DISPLAY_SETTINGS_RESOURCE = R.xml.external_display_settings;
     static final String DISPLAYS_LIST_PREFERENCE_KEY = "displays_list_preference";
+    static final String BUILTIN_DISPLAY_LIST_PREFERENCE_KEY = "builtin_display_list_preference";
     static final String EXTERNAL_DISPLAY_USE_PREFERENCE_KEY = "external_display_use_preference";
     static final String EXTERNAL_DISPLAY_ROTATION_KEY = "external_display_rotation";
     static final String EXTERNAL_DISPLAY_RESOLUTION_PREFERENCE_KEY = "external_display_resolution";
@@ -83,6 +84,8 @@
             R.string.external_display_rotation;
     static final int EXTERNAL_DISPLAY_RESOLUTION_TITLE_RESOURCE =
             R.string.external_display_resolution_settings_title;
+    static final int BUILTIN_DISPLAY_SETTINGS_CATEGORY_RESOURCE =
+            R.string.builtin_display_settings_category;
     @VisibleForTesting
     static final String PREVIOUSLY_SHOWN_LIST_KEY = "mPreviouslyShownListOfDisplays";
     private boolean mStarted;
@@ -101,6 +104,8 @@
     @Nullable
     private PreferenceCategory mDisplaysPreference;
     @Nullable
+    private PreferenceCategory mBuiltinDisplayPreference;
+    @Nullable
     private Injector mInjector;
     @Nullable
     private String[] mRotationEntries;
@@ -200,7 +205,7 @@
     }
 
     @VisibleForTesting
-    protected void launchDisplaySettings(final int displayId) {
+    protected void launchExternalDisplaySettings(final int displayId) {
         final Bundle args = new Bundle();
         var context = getPrefContext();
         args.putInt(DISPLAY_ID_ARG, displayId);
@@ -210,6 +215,16 @@
                 .setSourceMetricsCategory(getMetricsCategory()).launch();
     }
 
+    @VisibleForTesting
+    protected void launchBuiltinDisplaySettings() {
+        final Bundle args = new Bundle();
+        var context = getPrefContext();
+        new SubSettingLauncher(context)
+                .setDestination(TextReadingPreferenceFragment.class.getName())
+                .setArguments(args)
+                .setSourceMetricsCategory(getMetricsCategory()).launch();
+    }
+
     /**
      * Returns the preference for the footer.
      */
@@ -281,6 +296,15 @@
         return mDisplaysPreference;
     }
 
+    @NonNull
+    private PreferenceCategory getBuiltinDisplayListPreference(@NonNull Context context) {
+        if (mBuiltinDisplayPreference == null) {
+            mBuiltinDisplayPreference = new PreferenceCategory(context);
+            mBuiltinDisplayPreference.setPersistent(false);
+        }
+        return mBuiltinDisplayPreference;
+    }
+
     @NonNull Preference getDisplayTopologyPreference(@NonNull Context context) {
         if (mDisplayTopologyPreference == null) {
             mDisplayTopologyPreference = new DisplayTopologyPreference(context);
@@ -310,7 +334,7 @@
             @NonNull final PreferenceScreen screen, @NonNull Context context) {
         final boolean forceShowList = displayId == INVALID_DISPLAY
                 && mInjector != null && forceShowDisplayList(mInjector.getFlags());
-        final var displaysToShow = getDisplaysToShow(displayId);
+        final var displaysToShow = externalDisplaysToShow(displayId);
 
         if (!forceShowList && displaysToShow.isEmpty() && displayId == INVALID_DISPLAY) {
             showTextWhenNoDisplaysToShow(screen, context);
@@ -373,9 +397,18 @@
 
     private void showDisplaysList(@NonNull List<Display> displaysToShow,
             @NonNull PreferenceScreen screen, @NonNull Context context) {
-        if (mInjector != null
-                && mInjector.getFlags().displayTopologyPaneInDisplayList()) {
+        if (mInjector != null && mInjector.getFlags().displayTopologyPaneInDisplayList()) {
             screen.addPreference(getDisplayTopologyPreference(context));
+
+            // If topology is shown, we also show a preference for the built-in display for
+            // consistency with the topology.
+            var builtinCategory = getBuiltinDisplayListPreference(context);
+            builtinCategory.setKey(BUILTIN_DISPLAY_LIST_PREFERENCE_KEY);
+            builtinCategory.setTitle(BUILTIN_DISPLAY_SETTINGS_CATEGORY_RESOURCE);
+            builtinCategory.removeAll();
+            screen.addPreference(builtinCategory);
+
+            builtinCategory.addPreference(new BuiltinDisplaySizeAndTextPreference(context));
         }
 
         var pref = getDisplaysListPreference(context);
@@ -389,7 +422,7 @@
         }
     }
 
-    private List<Display> getDisplaysToShow(int displayIdToShow) {
+    private List<Display> externalDisplaysToShow(int displayIdToShow) {
         if (mInjector == null) {
             return List.of();
         }
@@ -530,6 +563,24 @@
         mInjector.getHandler().removeCallbacks(mUpdateRunnable);
     }
 
+    private class BuiltinDisplaySizeAndTextPreference extends Preference
+            implements Preference.OnPreferenceClickListener {
+        BuiltinDisplaySizeAndTextPreference(@NonNull final Context context) {
+            super(context);
+
+            setPersistent(false);
+            setKey("builtin_display_size_and_text");
+            setTitle(R.string.accessibility_text_reading_options_title);
+            setOnPreferenceClickListener(this);
+        }
+
+        @Override
+        public boolean onPreferenceClick(@NonNull Preference preference) {
+            launchBuiltinDisplaySettings();
+            return true;
+        }
+    }
+
     @VisibleForTesting
     class DisplayPreference extends TwoTargetPreference
             implements Preference.OnPreferenceClickListener {
@@ -538,6 +589,7 @@
         DisplayPreference(@NonNull final Context context, @NonNull final Display display) {
             super(context);
             mDisplayId = display.getDisplayId();
+
             setPersistent(false);
             setKey("display_id_" + mDisplayId);
             setTitle(display.getName());
@@ -548,7 +600,7 @@
 
         @Override
         public boolean onPreferenceClick(@NonNull Preference preference) {
-            launchDisplaySettings(mDisplayId);
+            launchExternalDisplaySettings(mDisplayId);
             writePreferenceClickMetric(preference);
             return true;
         }
diff --git a/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java b/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java
index 6365226..93ba97b 100644
--- a/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java
+++ b/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java
@@ -71,6 +71,7 @@
     private ExternalDisplayPreferenceFragment mFragment;
     private int mPreferenceIdFromResource;
     private int mDisplayIdArg = INVALID_DISPLAY;
+    private boolean mLaunchedBuiltinSettings;
     private int mResolutionSelectorDisplayId = INVALID_DISPLAY;
     @Mock
     private MetricsLogger mMockedMetricsLogger;
@@ -106,6 +107,10 @@
 
         pref = mPreferenceScreen.findPreference(DisplayTopologyKt.PREFERENCE_KEY);
         assertThat(pref).isNull();
+
+        pref = mPreferenceScreen.findPreference(
+                ExternalDisplayPreferenceFragment.BUILTIN_DISPLAY_LIST_PREFERENCE_KEY);
+        assertThat(pref).isNull();
     }
 
     @Test
@@ -124,6 +129,11 @@
                 mPreferenceScreen.findPreference(DISPLAYS_LIST_PREFERENCE_KEY);
         assertThat(listPref).isNotNull();
         assertThat(listPref.getPreferenceCount()).isEqualTo(1);
+
+        listPref = mPreferenceScreen.findPreference(
+                ExternalDisplayPreferenceFragment.BUILTIN_DISPLAY_LIST_PREFERENCE_KEY);
+        assertThat(listPref).isNotNull();
+        assertThat(listPref.getPreferenceCount()).isEqualTo(1);
     }
 
     @Test
@@ -138,11 +148,18 @@
         var pref = mPreferenceScreen.findPreference(DisplayTopologyKt.PREFERENCE_KEY);
         assertThat(pref).isNotNull();
 
-        // TODO: add the built-in display to the list, which will cause this preference to not be
-        // null.
         PreferenceCategory listPref =
                 mPreferenceScreen.findPreference(DISPLAYS_LIST_PREFERENCE_KEY);
         assertThat(listPref).isNull();
+
+        listPref = mPreferenceScreen.findPreference(
+                ExternalDisplayPreferenceFragment.BUILTIN_DISPLAY_LIST_PREFERENCE_KEY);
+        assertThat(listPref).isNotNull();
+        assertThat(listPref.getPreferenceCount()).isEqualTo(1);
+        var builtinPref = listPref.getPreference(0);
+        assertThat(builtinPref.getOnPreferenceClickListener().onPreferenceClick(builtinPref))
+                .isTrue();
+        assertThat(mLaunchedBuiltinSettings).isTrue();
     }
 
     @Test
@@ -428,11 +445,16 @@
         }
 
         @Override
-        protected void launchDisplaySettings(final int displayId) {
+        protected void launchExternalDisplaySettings(final int displayId) {
             mDisplayIdArg = displayId;
         }
 
         @Override
+        protected void launchBuiltinDisplaySettings() {
+            mLaunchedBuiltinSettings = true;
+        }
+
+        @Override
         protected void writePreferenceClickMetric(Preference preference) {
             mLogger.writePreferenceClickMetric(preference);
         }