Show a category for each external display
Rather than show all external displays as a single item each under one
category, each external display has its own category. For now, the
category only has one item: the single Resolution+Rotation option.
This is more consistent with the Built-in display, which also still
only has one preference item in the category.
Flag: com.android.settings.flags.display_topology_pane_in_display_list
Bug: b/352648432
Bug: b/392946322
Test: ExternalDisplayPreferenceFragmentTest
Test: Open display list with two displays connected, and remove them one at a time
Change-Id: I4d7f8410f506fe53201bc87f8b55ffc6d407a9c5
diff --git a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
index 225ff8d..9f8e877 100644
--- a/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
+++ b/src/com/android/settings/connecteddevice/display/ExternalDisplayPreferenceFragment.java
@@ -452,17 +452,38 @@
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<Display> externalDisplaysToShow(int displayIdToShow) {
@@ -621,16 +642,11 @@
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 87af6b0..10ddd87 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 @@
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);