diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java index 225ff8d2424..9f8e87732e3 100644 --- a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java +++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java @@ -452,17 +452,38 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen var pref = getDisplayPreference(context, display, groupCleanable); pref.setSummary(display.getMode().getPhysicalWidth() + " x " + display.getMode().getPhysicalHeight()); - pref.setTitle(display.getName()); } } } private Preference getDisplayPreference(@NonNull Context context, @NonNull Display display, @NonNull PrefRefresh groupCleanable) { - var pref = groupCleanable.findUnusedPreference(DisplayPreference.generateKey(display)); - pref = pref != null ? pref : new DisplayPreference(context, display); - groupCleanable.addPreference(pref); - return pref; + var itemKey = "display_id_" + display.getDisplayId(); + var categoryKey = itemKey + "_category"; + var category = (PreferenceCategory) groupCleanable.findUnusedPreference(categoryKey); + + if (category != null) { + groupCleanable.addPreference(category); + return category.findPreference(itemKey); + } else { + category = new PreferenceCategory(context); + category.setPersistent(false); + category.setKey(categoryKey); + // Must add the category to the hierarchy before adding its descendants. Otherwise + // the category will not have a preference manager, which causes an exception when a + // child is added to it. + groupCleanable.addPreference(category); + + var prefItem = new DisplayPreference(context, display); + prefItem.setTitle(context.getString(EXTERNAL_DISPLAY_RESOLUTION_TITLE_RESOURCE) + + " | " + context.getString(EXTERNAL_DISPLAY_ROTATION_TITLE_RESOURCE)); + prefItem.setKey(itemKey); + + category.addPreference(prefItem); + category.setTitle(display.getName()); + + return prefItem; + } } private List externalDisplaysToShow(int displayIdToShow) { @@ -621,16 +642,11 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen implements Preference.OnPreferenceClickListener { private final int mDisplayId; - static String generateKey(final Display display) { - return "display_id_" + display.getDisplayId(); - } - DisplayPreference(@NonNull final Context context, @NonNull final Display display) { super(context); mDisplayId = display.getDisplayId(); setPersistent(false); - setKey(generateKey(display)); setOnPreferenceClickListener(this); } 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 87af6b09708..10ddd87f304 100644 --- a/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java +++ b/tests/unit/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragmentTest.java @@ -173,16 +173,18 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa mHandler.flush(); PreferenceCategory pref = mPreferenceScreen.findPreference(DISPLAYS_LIST_PREFERENCE_KEY); assertThat(pref).isNotNull(); - DisplayPreference display1Pref = (DisplayPreference) pref.getPreference(0); - DisplayPreference display2Pref = (DisplayPreference) pref.getPreference(1); + var display1Category = (PreferenceCategory) pref.getPreference(0); + var display1Pref = (DisplayPreference) display1Category.getPreference(0); + var display2Category = (PreferenceCategory) pref.getPreference(1); + var display2Pref = (DisplayPreference) display2Category.getPreference(0); assertThat(display1Pref.getKey()).isEqualTo("display_id_" + 1); - assertThat("" + display1Pref.getTitle()).isEqualTo("HDMI"); + assertThat("" + display1Category.getTitle()).isEqualTo("HDMI"); assertThat("" + display1Pref.getSummary()).isEqualTo("1920 x 1080"); display1Pref.onPreferenceClick(display1Pref); assertThat(mDisplayIdArg).isEqualTo(1); verify(mMockedMetricsLogger).writePreferenceClickMetric(display1Pref); assertThat(display2Pref.getKey()).isEqualTo("display_id_" + 2); - assertThat("" + display2Pref.getTitle()).isEqualTo("Overlay #1"); + assertThat("" + display2Category.getTitle()).isEqualTo("Overlay #1"); assertThat("" + display2Pref.getSummary()).isEqualTo("1240 x 780"); display2Pref.onPreferenceClick(display2Pref); assertThat(mDisplayIdArg).isEqualTo(2);