Show expanded display settings in list fragment

Stop distinguishing between the display list and per-display fragments.
Instead, always show all displays that are available. This is closer to
how the UI will eventually look, which is each display in a tab.

Setting an OnChangeListener for multiple preferences with the same key
did not work, even though the conflicting preferences had different
parent preferences. Only the listener of the top-most preference was
notified even when changing a different one. So this CL changes
PrefBasics so that it can set unique keys for otherwise identical
preferences.

Flag: com.android.settings.flags.display_topology_pane_in_display_list
Bug: b/352648432
Test: ExternalDisplayPreferenceFragmentTest
Test: set rotation of two overlay displays to different non-default values
Change-Id: Idabef1e03afd496bfc955927a2894f14f999a105
This commit is contained in:
Matthew DeVore
2025-02-14 14:34:45 +00:00
parent 577f341e0e
commit f87293fc5d
2 changed files with 178 additions and 344 deletions

View File

@@ -16,8 +16,6 @@
package com.android.settings.connecteddevice.display;
import static android.view.Display.INVALID_DISPLAY;
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DISPLAY_ID_ARG;
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_HELP_URL;
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_NOT_FOUND_RESOURCE;
@@ -60,7 +58,6 @@ import com.android.settingslib.display.DisplayDensityUtils;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.MainSwitchPreference;
import com.android.settingslib.widget.TwoTargetPreference;
import java.util.ArrayList;
import java.util.HashMap;
@@ -87,10 +84,12 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
EXTERNAL_DISPLAY_RESOLUTION(60, "external_display_resolution",
R.string.external_display_resolution_settings_title),
// Built-in display link is after per-display settings.
// Built-in display link is before per-display settings.
BUILTIN_DISPLAY_LIST(70, "builtin_display_list_preference",
R.string.builtin_display_settings_category),
EXTERNAL_DISPLAY_LIST(-1, "external_display_list", null),
// If shown, footer should appear below everything.
FOOTER(90, "footer_preference", null);
@@ -106,16 +105,27 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
public final String key;
@Nullable public final Integer titleResource;
void apply(Preference preference) {
/**
* Applies this basic data to the given preference.
*
* @param preference object whose properties to set
* @param nth if non-null, disambiguates the key so that other preferences can have the same
* basic properties. Does not affect the order.
*/
void apply(Preference preference, @Nullable Integer nth) {
if (order != -1) {
preference.setOrder(order);
}
if (titleResource != null) {
preference.setTitle(titleResource);
}
preference.setKey(key);
preference.setKey(nth == null ? key : keyForNth(nth));
preference.setPersistent(false);
}
String keyForNth(int nth) {
return key + "_" + nth;
}
}
static final int EXTERNAL_DISPLAY_SETTINGS_RESOURCE = R.xml.external_display_settings;
@@ -131,12 +141,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
R.drawable.external_display_mirror_portrait;
static final int EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE = R.string.screen_zoom_short_summary;
@VisibleForTesting
static final String PREVIOUSLY_SHOWN_LIST_KEY = "mPreviouslyShownListOfDisplays";
private boolean mStarted;
@Nullable
private IllustrationPreference mImagePreference;
@Nullable
private Preference mDisplayTopologyPreference;
@Nullable
private PreferenceCategory mBuiltinDisplayPreference;
@@ -156,7 +162,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
scheduleUpdate();
}
};
private boolean mPreviouslyShownListOfDisplays;
public ExternalDisplayPreferenceFragment() {}
@@ -175,12 +180,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
return EXTERNAL_DISPLAY_HELP_URL;
}
@Override
public void onSaveInstanceStateCallback(@NonNull Bundle outState) {
outState.putSerializable(PREVIOUSLY_SHOWN_LIST_KEY,
mPreviouslyShownListOfDisplays);
}
@Override
public void onCreateCallback(@Nullable Bundle icicle) {
if (mInjector == null) {
@@ -191,7 +190,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
@Override
public void onActivityCreatedCallback(@Nullable Bundle savedInstanceState) {
restoreState(savedInstanceState);
View view = getView();
TextView emptyView = null;
if (view != null) {
@@ -241,17 +239,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
.setSourceMetricsCategory(getMetricsCategory()).launch();
}
@VisibleForTesting
protected void launchExternalDisplaySettings(final int displayId) {
final Bundle args = new Bundle();
var context = getPrefContext();
args.putInt(DISPLAY_ID_ARG, displayId);
new SubSettingLauncher(context)
.setDestination(this.getClass().getName())
.setArguments(args)
.setSourceMetricsCategory(getMetricsCategory()).launch();
}
@VisibleForTesting
protected void launchBuiltinDisplaySettings() {
final Bundle args = new Bundle();
@@ -275,30 +262,33 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
var pref = refresh.findUnusedPreference(PrefBasics.FOOTER.key);
if (pref == null) {
pref = newFooterPreference(context);
PrefBasics.FOOTER.apply(pref);
PrefBasics.FOOTER.apply(pref, /* nth= */ null);
}
pref.setTitle(title);
refresh.addPreference(pref);
}
@NonNull
private ListPreference reuseRotationPreference(@NonNull Context context, PrefRefresh refresh) {
private ListPreference reuseRotationPreference(@NonNull Context context, PrefRefresh refresh,
int position) {
ListPreference pref = refresh.findUnusedPreference(
PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
PrefBasics.EXTERNAL_DISPLAY_ROTATION.keyForNth(position));
if (pref == null) {
pref = new ListPreference(context);
PrefBasics.EXTERNAL_DISPLAY_ROTATION.apply(pref);
PrefBasics.EXTERNAL_DISPLAY_ROTATION.apply(pref, position);
}
refresh.addPreference(pref);
return pref;
}
@NonNull
private Preference reuseResolutionPreference(@NonNull Context context, PrefRefresh refresh) {
var pref = refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.key);
private Preference reuseResolutionPreference(@NonNull Context context, PrefRefresh refresh,
int position) {
var pref = refresh.findUnusedPreference(
PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.keyForNth(position));
if (pref == null) {
pref = new Preference(context);
PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.apply(pref);
PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.apply(pref, position);
}
refresh.addPreference(pref);
return pref;
@@ -306,41 +296,34 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
@NonNull
private MainSwitchPreference reuseUseDisplayPreference(
@NonNull Context context, @NonNull PrefRefresh refresh) {
Context context, PrefRefresh refresh, int position) {
MainSwitchPreference pref = refresh.findUnusedPreference(
PrefBasics.EXTERNAL_DISPLAY_USE.key);
PrefBasics.EXTERNAL_DISPLAY_USE.keyForNth(position));
if (pref == null) {
pref = new MainSwitchPreference(context);
PrefBasics.EXTERNAL_DISPLAY_USE.apply(pref);
PrefBasics.EXTERNAL_DISPLAY_USE.apply(pref, position);
}
refresh.addPreference(pref);
return pref;
}
@NonNull
@VisibleForTesting
IllustrationPreference getIllustrationPreference(@NonNull Context context) {
if (mImagePreference == null) {
mImagePreference = new IllustrationPreference(context);
PrefBasics.ILLUSTRATION.apply(mImagePreference);
private IllustrationPreference reuseIllustrationPreference(
Context context, PrefRefresh refresh) {
IllustrationPreference pref = refresh.findUnusedPreference(PrefBasics.ILLUSTRATION.key);
if (pref == null) {
pref = new IllustrationPreference(context);
PrefBasics.ILLUSTRATION.apply(pref, /* nth= */ null);
}
return mImagePreference;
}
/**
* @return return display id argument of this settings page.
*/
@VisibleForTesting
protected int getDisplayIdArg() {
var args = getArguments();
return args != null ? args.getInt(DISPLAY_ID_ARG, INVALID_DISPLAY) : INVALID_DISPLAY;
refresh.addPreference(pref);
return pref;
}
@NonNull
private PreferenceCategory getBuiltinDisplayListPreference(@NonNull Context context) {
if (mBuiltinDisplayPreference == null) {
mBuiltinDisplayPreference = new PreferenceCategory(context);
PrefBasics.BUILTIN_DISPLAY_LIST.apply(mBuiltinDisplayPreference);
PrefBasics.BUILTIN_DISPLAY_LIST.apply(mBuiltinDisplayPreference, /* nth= */ null);
}
return mBuiltinDisplayPreference;
}
@@ -356,7 +339,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
@NonNull Preference getDisplayTopologyPreference(@NonNull Context context) {
if (mDisplayTopologyPreference == null) {
mDisplayTopologyPreference = new DisplayTopologyPreference(context);
PrefBasics.DISPLAY_TOPOLOGY.apply(mDisplayTopologyPreference);
PrefBasics.DISPLAY_TOPOLOGY.apply(mDisplayTopologyPreference, /* nth= */ null);
}
return mDisplayTopologyPreference;
}
@@ -366,23 +349,23 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
if (pref == null) {
pref = new MirrorPreference(context,
DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue());
PrefBasics.MIRROR.apply(pref);
PrefBasics.MIRROR.apply(pref, /* nth= */ null);
}
refresh.addPreference(pref);
}
@NonNull
private AccessibilitySeekBarPreference reuseSizePreference(Context context,
PrefRefresh refresh, int displayId) {
PrefRefresh refresh, int displayId, int position) {
AccessibilitySeekBarPreference pref =
refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.keyForNth(position));
if (pref == null) {
pref = new AccessibilitySeekBarPreference(context, /* attrs= */ null);
pref.setIconStart(R.drawable.ic_remove_24dp);
pref.setIconStartContentDescription(R.string.screen_zoom_make_smaller_desc);
pref.setIconEnd(R.drawable.ic_add_24dp);
pref.setIconEndContentDescription(R.string.screen_zoom_make_larger_desc);
PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref);
PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref, position);
setStateForDisplaySizePreference(context, displayId, pref);
}
@@ -404,74 +387,43 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
preference.setOnSeekBarChangeListener(seekBarChangeHandler);
}
private void restoreState(@Nullable Bundle savedInstanceState) {
if (savedInstanceState == null) {
return;
}
mPreviouslyShownListOfDisplays = Boolean.TRUE.equals(savedInstanceState.getSerializable(
PREVIOUSLY_SHOWN_LIST_KEY, Boolean.class));
}
private void update() {
final var screen = getPreferenceScreen();
if (screen == null || mInjector == null || mInjector.getContext() == null) {
return;
}
try (var cleanableScreen = new PrefRefresh(screen)) {
updateScreenForDisplayId(getDisplayIdArg(), cleanableScreen, mInjector.getContext());
updateScreen(cleanableScreen, mInjector.getContext());
}
}
private void updateScreenForDisplayId(final int displayId,
@NonNull final PrefRefresh screen, @NonNull Context context) {
final var displaysToShow = externalDisplaysToShow(displayId);
private void updateScreen(final PrefRefresh screen, Context context) {
final var displaysToShow = externalDisplaysToShow();
if (displaysToShow.isEmpty() && displayId == INVALID_DISPLAY) {
showTextWhenNoDisplaysToShow(screen, context);
} else if (displaysToShow.size() == 1
&& ((displayId == INVALID_DISPLAY && !mPreviouslyShownListOfDisplays)
|| displaysToShow.get(0).getDisplayId() == displayId)) {
showDisplaySettings(displaysToShow.get(0), screen, context);
if (displayId == INVALID_DISPLAY && isTopologyPaneEnabled(mInjector)) {
// Only show the topology pane if the user did not arrive via the displays list.
maybeAddV2Components(context, screen);
}
} else if (displayId == INVALID_DISPLAY) {
// If ever shown a list of displays - keep showing it for consistency after
// disconnecting one of the displays, and only one display is left.
mPreviouslyShownListOfDisplays = true;
if (displaysToShow.isEmpty()) {
showTextWhenNoDisplaysToShow(screen, context, /* position= */ 0);
} else {
showDisplaysList(displaysToShow, screen, context);
}
updateSettingsTitle(displaysToShow, displayId);
}
private void updateSettingsTitle(@NonNull final List<Display> displaysToShow, int displayId) {
final Activity activity = getCurrentActivity();
if (activity == null) {
return;
if (activity != null) {
activity.setTitle(EXTERNAL_DISPLAY_TITLE_RESOURCE);
}
if (displaysToShow.size() == 1 && displaysToShow.get(0).getDisplayId() == displayId) {
var displayName = displaysToShow.get(0).getName();
if (!displayName.isEmpty()) {
activity.setTitle(displayName.substring(0, Math.min(displayName.length(), 40)));
return;
}
}
activity.setTitle(EXTERNAL_DISPLAY_TITLE_RESOURCE);
}
private void showTextWhenNoDisplaysToShow(@NonNull final PrefRefresh screen,
@NonNull Context context) {
@NonNull Context context, int position) {
if (isUseDisplaySettingEnabled(mInjector)) {
addUseDisplayPreferenceNoDisplaysFound(context, screen);
addUseDisplayPreferenceNoDisplaysFound(context, screen, position);
}
addFooterPreference(context, screen, EXTERNAL_DISPLAY_NOT_FOUND_FOOTER_RESOURCE);
}
private static PreferenceCategory getCategoryForDisplay(@NonNull Display display,
@NonNull PrefRefresh screen, @NonNull Context context) {
private static PreferenceCategory reuseDisplayCategory(
PrefRefresh screen, Context context, int position) {
// The rest of the settings are in a category with the display name as the title.
String categoryKey = "expanded_display_items_" + display.getDisplayId();
String categoryKey = PrefBasics.EXTERNAL_DISPLAY_LIST.keyForNth(position);
var category = (PreferenceCategory) screen.findUnusedPreference(categoryKey);
if (category != null) {
@@ -479,45 +431,30 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
} else {
category = new PreferenceCategory(context);
screen.addPreference(category);
category.setPersistent(false);
category.setKey(categoryKey);
category.setTitle(display.getName());
category.setOrder(PrefBasics.BUILTIN_DISPLAY_LIST.order + 1);
PrefBasics.EXTERNAL_DISPLAY_LIST.apply(category, position);
category.setOrder(PrefBasics.BUILTIN_DISPLAY_LIST.order + 1 + position);
}
return category;
}
private void showDisplaySettings(@NonNull Display display, @NonNull PrefRefresh screen,
@NonNull Context context) {
private void showDisplaySettings(Display display, PrefRefresh refresh,
Context context, boolean includeV1Helpers, int position) {
final var isEnabled = mInjector != null && mInjector.isDisplayEnabled(display);
if (isUseDisplaySettingEnabled(mInjector)) {
addUseDisplayPreferenceForDisplay(context, screen, display, isEnabled);
addUseDisplayPreferenceForDisplay(context, refresh, display, isEnabled, position);
}
if (!isEnabled) {
// Skip all other settings
return;
}
final var displayRotation = getDisplayRotation(display.getDisplayId());
if (!isTopologyPaneEnabled(mInjector)) {
screen.addPreference(updateIllustrationImage(context, displayRotation));
if (includeV1Helpers) {
addIllustrationImage(context, refresh, displayRotation);
}
if (isTopologyPaneEnabled(mInjector)) {
var displayCategory = getCategoryForDisplay(display, screen, context);
try (var categoryRefresh = new PrefRefresh(displayCategory)) {
addDisplaySettings(context, categoryRefresh, display, displayRotation);
}
} else {
addDisplaySettings(context, screen, display, displayRotation);
}
}
private void addDisplaySettings(Context context, PrefRefresh refresh, Display display,
int displayRotation) {
addResolutionPreference(context, refresh, display);
addRotationPreference(context, refresh, display, displayRotation);
addResolutionPreference(context, refresh, display, position);
addRotationPreference(context, refresh, display, displayRotation, position);
if (isResolutionSettingEnabled(mInjector)) {
// Do not show the footer about changing resolution affecting apps. This is not in the
// UX design for v2, and there is no good place to put it, since (a) if it is on the
@@ -529,13 +466,13 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
// inconsistent with the topology pane, which shows that display.
// TODO(b/352648432): probably remove footer once the pane and rest of v2 UI is in
// place.
if (!isTopologyPaneEnabled(mInjector)) {
if (includeV1Helpers) {
addFooterPreference(
context, refresh, EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE);
}
}
if (isDisplaySizeSettingEnabled(mInjector)) {
addSizePreference(context, refresh, display.getDisplayId());
addSizePreference(context, refresh, display.getDisplayId(), position);
}
}
@@ -555,66 +492,26 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
private void showDisplaysList(@NonNull List<Display> displaysToShow,
@NonNull PrefRefresh screen, @NonNull Context context) {
maybeAddV2Components(context, screen);
int order = PrefBasics.BUILTIN_DISPLAY_LIST.order;
int position = 0;
boolean includeV1Helpers = !isTopologyPaneEnabled(mInjector) && displaysToShow.size() <= 1;
for (var display : displaysToShow) {
var pref = getDisplayPreference(context, display, screen, ++order);
pref.setSummary(display.getMode().getPhysicalWidth() + " x "
+ display.getMode().getPhysicalHeight());
}
}
@VisibleForTesting
static String displayListDisplayCategoryKey(int displayId) {
return "display_list_display_category_" + displayId;
}
@VisibleForTesting
static String resolutionRotationPreferenceKey(int displayId) {
return "display_id_" + displayId;
}
private Preference getDisplayPreference(@NonNull Context context,
@NonNull Display display, @NonNull PrefRefresh groupCleanable, int categoryOrder) {
var itemKey = resolutionRotationPreferenceKey(display.getDisplayId());
var categoryKey = displayListDisplayCategoryKey(display.getDisplayId());
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);
category.setOrder(categoryOrder);
// 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(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.titleResource) + " | "
+ context.getString(PrefBasics.EXTERNAL_DISPLAY_ROTATION.titleResource));
prefItem.setKey(itemKey);
category.addPreference(prefItem);
var category = reuseDisplayCategory(screen, context, position);
category.setTitle(display.getName());
return prefItem;
try (var refresh = new PrefRefresh(category)) {
// The category may have already been populated if it was retrieved from `screen`,
// but we still need to update resolution and rotation items.
showDisplaySettings(display, refresh, context, includeV1Helpers, position);
}
position++;
}
}
private List<Display> externalDisplaysToShow(int displayIdToShow) {
private List<Display> externalDisplaysToShow() {
if (mInjector == null) {
return List.of();
}
if (displayIdToShow != INVALID_DISPLAY) {
var display = mInjector.getDisplay(displayIdToShow);
if (display != null && isDisplayAllowed(display, mInjector)) {
return List.of(display);
}
}
var displaysToShow = new ArrayList<Display>();
for (var display : mInjector.getAllDisplays()) {
if (display != null && isDisplayAllowed(display, mInjector)) {
@@ -624,16 +521,17 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
return displaysToShow;
}
private void addUseDisplayPreferenceNoDisplaysFound(Context context, PrefRefresh refresh) {
final var pref = reuseUseDisplayPreference(context, refresh);
private void addUseDisplayPreferenceNoDisplaysFound(Context context, PrefRefresh refresh,
int position) {
final var pref = reuseUseDisplayPreference(context, refresh, position);
pref.setChecked(false);
pref.setEnabled(false);
pref.setOnPreferenceChangeListener(null);
}
private void addUseDisplayPreferenceForDisplay(final Context context,
PrefRefresh refresh, final Display display, boolean isEnabled) {
final var pref = reuseUseDisplayPreference(context, refresh);
PrefRefresh refresh, final Display display, boolean isEnabled, int position) {
final var pref = reuseUseDisplayPreference(context, refresh, position);
pref.setChecked(isEnabled);
pref.setEnabled(true);
pref.setOnPreferenceChangeListener((p, newValue) -> {
@@ -654,20 +552,19 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
});
}
private Preference updateIllustrationImage(@NonNull final Context context,
private void addIllustrationImage(final Context context, PrefRefresh refresh,
final int displayRotation) {
var pref = getIllustrationPreference(context);
var pref = reuseIllustrationPreference(context, refresh);
if (displayRotation % 2 == 0) {
pref.setLottieAnimationResId(EXTERNAL_DISPLAY_PORTRAIT_DRAWABLE);
} else {
pref.setLottieAnimationResId(EXTERNAL_DISPLAY_LANDSCAPE_DRAWABLE);
}
return pref;
}
private void addRotationPreference(final Context context,
PrefRefresh refresh, final Display display, final int displayRotation) {
var pref = reuseRotationPreference(context, refresh);
PrefRefresh refresh, final Display display, final int displayRotation, int position) {
var pref = reuseRotationPreference(context, refresh, position);
if (mRotationEntries == null || mRotationEntriesValues == null) {
mRotationEntries = new String[] {
context.getString(R.string.external_display_standard_rotation),
@@ -694,8 +591,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
}
private void addResolutionPreference(final Context context, PrefRefresh refresh,
final Display display) {
var pref = reuseResolutionPreference(context, refresh);
final Display display, int position) {
var pref = reuseResolutionPreference(context, refresh, position);
pref.setSummary(display.getMode().getPhysicalWidth() + " x "
+ display.getMode().getPhysicalHeight());
pref.setOnPreferenceClickListener((Preference p) -> {
@@ -706,8 +603,9 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
pref.setEnabled(isResolutionSettingEnabled(mInjector));
}
private void addSizePreference(final Context context, PrefRefresh refresh, int displayId) {
var pref = reuseSizePreference(context, refresh, displayId);
private void addSizePreference(final Context context, PrefRefresh refresh, int displayId,
int position) {
var pref = reuseSizePreference(context, refresh, displayId, position);
pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE);
pref.setOnPreferenceClickListener(
(Preference p) -> {
@@ -804,27 +702,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
public void onStopTrackingTouch(@NonNull SeekBar seekBar) {}
}
@VisibleForTesting
class DisplayPreference extends TwoTargetPreference
implements Preference.OnPreferenceClickListener {
private final int mDisplayId;
DisplayPreference(@NonNull final Context context, @NonNull final Display display) {
super(context);
mDisplayId = display.getDisplayId();
setPersistent(false);
setOnPreferenceClickListener(this);
}
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
launchExternalDisplaySettings(mDisplayId);
writePreferenceClickMetric(preference);
return true;
}
}
private static class PrefRefresh implements AutoCloseable {
private final PreferenceGroup mScreen;
private final HashMap<String, Preference> mUnusedPreferences = new HashMap<>();