Use PrefRefresh for Preference caching
Refactor a couple of fields to use PrefRefresh for caching instead instead of fields. This makes us construct PrefRefresh for display categories, which we hadn't been doing before, and was causing b/397466966. This also limits the tests' dependency on implementation. We had been using fields for caching Preference objects, which doesn't account for the same preference being needed for each display. PrefRefresh is a more flexible mechanism for recycling View objects and it largely makes the fields obsolete. The reuse* methods (previously get*Preference) can actually be inlined now that tests aren't calling into them, but to keep the diff easy to review I left them as separate methods. Because @NonNull doesn't actually do anything, and is considered the default, I neglected to add them to new arguments, and deleted them from lines I modified. Flag: com.android.settings.flags.display_topology_pane_in_display_list Test: ExternalDisplayPreferenceFragmentTest.java Test: with fragment visible, plug-in and activate a new physical display with the Mirror prompt Test: with topology disabled, verify footer is shown with and without a display attached Bug: b/397466966 Bug: b/397591022 Change-Id: I16b3ae925ca3d9d79471fd5df00b571ae3fc696f
This commit is contained in:
@@ -22,11 +22,11 @@ import static com.android.settings.connecteddevice.display.ExternalDisplaySettin
|
|||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_HELP_URL;
|
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;
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.EXTERNAL_DISPLAY_NOT_FOUND_RESOURCE;
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplayAllowed;
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplayAllowed;
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isTopologyPaneEnabled;
|
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isUseDisplaySettingEnabled;
|
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplaySizeSettingEnabled;
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isDisplaySizeSettingEnabled;
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isResolutionSettingEnabled;
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isResolutionSettingEnabled;
|
||||||
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isRotationSettingEnabled;
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isRotationSettingEnabled;
|
||||||
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isTopologyPaneEnabled;
|
||||||
|
import static com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.isUseDisplaySettingEnabled;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
@@ -59,7 +59,6 @@ import com.android.settingslib.widget.TwoTargetPreference;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Settings screen for External Displays configuration and connection management.
|
* The Settings screen for External Displays configuration and connection management.
|
||||||
@@ -130,28 +129,17 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
static final String PREVIOUSLY_SHOWN_LIST_KEY = "mPreviouslyShownListOfDisplays";
|
static final String PREVIOUSLY_SHOWN_LIST_KEY = "mPreviouslyShownListOfDisplays";
|
||||||
private boolean mStarted;
|
private boolean mStarted;
|
||||||
@Nullable
|
@Nullable
|
||||||
private MainSwitchPreference mUseDisplayPref;
|
|
||||||
@Nullable
|
|
||||||
private IllustrationPreference mImagePreference;
|
private IllustrationPreference mImagePreference;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Preference mResolutionPreference;
|
|
||||||
@Nullable
|
|
||||||
private ListPreference mRotationPref;
|
|
||||||
@Nullable
|
|
||||||
private FooterPreference mFooterPreference;
|
|
||||||
@Nullable
|
|
||||||
private Preference mDisplayTopologyPreference;
|
private Preference mDisplayTopologyPreference;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Preference mMirrorPreference;
|
private Preference mMirrorPreference;
|
||||||
@Nullable
|
@Nullable
|
||||||
private PreferenceCategory mDisplaysPreference;
|
|
||||||
@Nullable
|
|
||||||
private PreferenceCategory mBuiltinDisplayPreference;
|
private PreferenceCategory mBuiltinDisplayPreference;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Preference mBuiltinDisplaySizeAndTextPreference;
|
private Preference mBuiltinDisplaySizeAndTextPreference;
|
||||||
@Nullable
|
@Nullable
|
||||||
private Injector mInjector;
|
private Injector mInjector;
|
||||||
@Nullable private AccessibilitySeekBarPreference mDisplaySizePreference;
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private String[] mRotationEntries;
|
private String[] mRotationEntries;
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -270,47 +258,59 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
.setSourceMetricsCategory(getMetricsCategory()).launch();
|
.setSourceMetricsCategory(getMetricsCategory()).launch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The real FooterPreference requires a resource which is not available in unit tests.
|
||||||
|
@VisibleForTesting
|
||||||
|
Preference newFooterPreference(Context context) {
|
||||||
|
return new FooterPreference(context);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the preference for the footer.
|
* Returns the preference for the footer.
|
||||||
*/
|
*/
|
||||||
@NonNull
|
private void addFooterPreference(Context context, PrefRefresh refresh, int title) {
|
||||||
@VisibleForTesting
|
var pref = refresh.findUnusedPreference(PrefBasics.FOOTER.key);
|
||||||
FooterPreference getFooterPreference(@NonNull Context context) {
|
if (pref == null) {
|
||||||
if (mFooterPreference == null) {
|
pref = newFooterPreference(context);
|
||||||
mFooterPreference = new FooterPreference(context);
|
PrefBasics.FOOTER.apply(pref);
|
||||||
mFooterPreference.setPersistent(false);
|
|
||||||
}
|
}
|
||||||
return mFooterPreference;
|
pref.setTitle(title);
|
||||||
|
refresh.addPreference(pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@VisibleForTesting
|
private ListPreference reuseRotationPreference(@NonNull Context context, PrefRefresh refresh) {
|
||||||
ListPreference getRotationPreference(@NonNull Context context) {
|
ListPreference pref = refresh.findUnusedPreference(
|
||||||
if (mRotationPref == null) {
|
PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
mRotationPref = new ListPreference(context);
|
if (pref == null) {
|
||||||
PrefBasics.EXTERNAL_DISPLAY_ROTATION.apply(mRotationPref);
|
pref = new ListPreference(context);
|
||||||
|
PrefBasics.EXTERNAL_DISPLAY_ROTATION.apply(pref);
|
||||||
}
|
}
|
||||||
return mRotationPref;
|
refresh.addPreference(pref);
|
||||||
|
return pref;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@VisibleForTesting
|
private Preference reuseResolutionPreference(@NonNull Context context, PrefRefresh refresh) {
|
||||||
Preference getResolutionPreference(@NonNull Context context) {
|
var pref = refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.key);
|
||||||
if (mResolutionPreference == null) {
|
if (pref == null) {
|
||||||
mResolutionPreference = new Preference(context);
|
pref = new Preference(context);
|
||||||
PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.apply(mResolutionPreference);
|
PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.apply(pref);
|
||||||
}
|
}
|
||||||
return mResolutionPreference;
|
refresh.addPreference(pref);
|
||||||
|
return pref;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@VisibleForTesting
|
private MainSwitchPreference reuseUseDisplayPreference(
|
||||||
MainSwitchPreference getUseDisplayPreference(@NonNull Context context) {
|
@NonNull Context context, @NonNull PrefRefresh refresh) {
|
||||||
if (mUseDisplayPref == null) {
|
MainSwitchPreference pref = refresh.findUnusedPreference(
|
||||||
mUseDisplayPref = new MainSwitchPreference(context);
|
PrefBasics.EXTERNAL_DISPLAY_USE.key);
|
||||||
PrefBasics.EXTERNAL_DISPLAY_USE.apply(mUseDisplayPref);
|
if (pref == null) {
|
||||||
|
pref = new MainSwitchPreference(context);
|
||||||
|
PrefBasics.EXTERNAL_DISPLAY_USE.apply(pref);
|
||||||
}
|
}
|
||||||
return mUseDisplayPref;
|
refresh.addPreference(pref);
|
||||||
|
return pref;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -366,18 +366,20 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@VisibleForTesting
|
private AccessibilitySeekBarPreference reuseSizePreference(Context context,
|
||||||
AccessibilitySeekBarPreference getSizePreference(@NonNull Context context) {
|
PrefRefresh refresh) {
|
||||||
if (mDisplaySizePreference == null) {
|
AccessibilitySeekBarPreference pref =
|
||||||
mDisplaySizePreference = new AccessibilitySeekBarPreference(context, /* attrs= */ null);
|
refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
mDisplaySizePreference.setIconStart(R.drawable.ic_remove_24dp);
|
if (pref == null) {
|
||||||
mDisplaySizePreference.setIconStartContentDescription(
|
pref = new AccessibilitySeekBarPreference(context, /* attrs= */ null);
|
||||||
R.string.screen_zoom_make_smaller_desc);
|
pref.setIconStart(R.drawable.ic_remove_24dp);
|
||||||
mDisplaySizePreference.setIconEnd(R.drawable.ic_add_24dp);
|
pref.setIconStartContentDescription(R.string.screen_zoom_make_smaller_desc);
|
||||||
mDisplaySizePreference.setIconEndContentDescription(
|
pref.setIconEnd(R.drawable.ic_add_24dp);
|
||||||
R.string.screen_zoom_make_larger_desc);
|
pref.setIconEndContentDescription(R.string.screen_zoom_make_larger_desc);
|
||||||
|
PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref);
|
||||||
}
|
}
|
||||||
return mDisplaySizePreference;
|
refresh.addPreference(pref);
|
||||||
|
return pref;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void restoreState(@Nullable Bundle savedInstanceState) {
|
private void restoreState(@Nullable Bundle savedInstanceState) {
|
||||||
@@ -439,10 +441,9 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
private void showTextWhenNoDisplaysToShow(@NonNull final PrefRefresh screen,
|
private void showTextWhenNoDisplaysToShow(@NonNull final PrefRefresh screen,
|
||||||
@NonNull Context context) {
|
@NonNull Context context) {
|
||||||
if (isUseDisplaySettingEnabled(mInjector)) {
|
if (isUseDisplaySettingEnabled(mInjector)) {
|
||||||
screen.addPreference(updateUseDisplayPreferenceNoDisplaysFound(context));
|
addUseDisplayPreferenceNoDisplaysFound(context, screen);
|
||||||
}
|
}
|
||||||
screen.addPreference(updateFooterPreference(context,
|
addFooterPreference(context, screen, EXTERNAL_DISPLAY_NOT_FOUND_FOOTER_RESOURCE);
|
||||||
EXTERNAL_DISPLAY_NOT_FOUND_FOOTER_RESOURCE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PreferenceCategory getCategoryForDisplay(@NonNull Display display,
|
private static PreferenceCategory getCategoryForDisplay(@NonNull Display display,
|
||||||
@@ -469,7 +470,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
@NonNull Context context) {
|
@NonNull Context context) {
|
||||||
final var isEnabled = mInjector != null && mInjector.isDisplayEnabled(display);
|
final var isEnabled = mInjector != null && mInjector.isDisplayEnabled(display);
|
||||||
if (isUseDisplaySettingEnabled(mInjector)) {
|
if (isUseDisplaySettingEnabled(mInjector)) {
|
||||||
screen.addPreference(updateUseDisplayPreference(context, display, isEnabled));
|
addUseDisplayPreferenceForDisplay(context, screen, display, isEnabled);
|
||||||
}
|
}
|
||||||
if (!isEnabled) {
|
if (!isEnabled) {
|
||||||
// Skip all other settings
|
// Skip all other settings
|
||||||
@@ -480,17 +481,21 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
screen.addPreference(updateIllustrationImage(context, displayRotation));
|
screen.addPreference(updateIllustrationImage(context, displayRotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
Consumer<Preference> adder;
|
|
||||||
if (isTopologyPaneEnabled(mInjector)) {
|
if (isTopologyPaneEnabled(mInjector)) {
|
||||||
adder = getCategoryForDisplay(display, screen, context)::addPreference;
|
var displayCategory = getCategoryForDisplay(display, screen, context);
|
||||||
// The category may have already been populated if it was retrieved from the PrefRefresh
|
try (var categoryRefresh = new PrefRefresh(displayCategory)) {
|
||||||
// backup, but we still need to update resolution and rotation items.
|
addDisplaySettings(context, categoryRefresh, display, displayRotation);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
adder = screen::addPreference;
|
addDisplaySettings(context, screen, display, displayRotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
adder.accept(updateResolutionPreference(context, display));
|
}
|
||||||
adder.accept(updateRotationPreference(context, display, displayRotation));
|
|
||||||
|
private void addDisplaySettings(Context context, PrefRefresh refresh, Display display,
|
||||||
|
int displayRotation) {
|
||||||
|
addResolutionPreference(context, refresh, display);
|
||||||
|
addRotationPreference(context, refresh, display, displayRotation);
|
||||||
if (isResolutionSettingEnabled(mInjector)) {
|
if (isResolutionSettingEnabled(mInjector)) {
|
||||||
// Do not show the footer about changing resolution affecting apps. This is not in the
|
// 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
|
// UX design for v2, and there is no good place to put it, since (a) if it is on the
|
||||||
@@ -503,12 +508,12 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
// TODO(b/352648432): probably remove footer once the pane and rest of v2 UI is in
|
// TODO(b/352648432): probably remove footer once the pane and rest of v2 UI is in
|
||||||
// place.
|
// place.
|
||||||
if (!isTopologyPaneEnabled(mInjector)) {
|
if (!isTopologyPaneEnabled(mInjector)) {
|
||||||
adder.accept(updateFooterPreference(context,
|
addFooterPreference(
|
||||||
EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE));
|
context, refresh, EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isDisplaySizeSettingEnabled(mInjector)) {
|
if (isDisplaySizeSettingEnabled(mInjector)) {
|
||||||
adder.accept(updateSizePreference(context));
|
addSizePreference(context, refresh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,17 +602,16 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
return displaysToShow;
|
return displaysToShow;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateUseDisplayPreferenceNoDisplaysFound(@NonNull Context context) {
|
private void addUseDisplayPreferenceNoDisplaysFound(Context context, PrefRefresh refresh) {
|
||||||
final var pref = getUseDisplayPreference(context);
|
final var pref = reuseUseDisplayPreference(context, refresh);
|
||||||
pref.setChecked(false);
|
pref.setChecked(false);
|
||||||
pref.setEnabled(false);
|
pref.setEnabled(false);
|
||||||
pref.setOnPreferenceChangeListener(null);
|
pref.setOnPreferenceChangeListener(null);
|
||||||
return pref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateUseDisplayPreference(@NonNull final Context context,
|
private void addUseDisplayPreferenceForDisplay(final Context context,
|
||||||
@NonNull final Display display, boolean isEnabled) {
|
PrefRefresh refresh, final Display display, boolean isEnabled) {
|
||||||
final var pref = getUseDisplayPreference(context);
|
final var pref = reuseUseDisplayPreference(context, refresh);
|
||||||
pref.setChecked(isEnabled);
|
pref.setChecked(isEnabled);
|
||||||
pref.setEnabled(true);
|
pref.setEnabled(true);
|
||||||
pref.setOnPreferenceChangeListener((p, newValue) -> {
|
pref.setOnPreferenceChangeListener((p, newValue) -> {
|
||||||
@@ -626,7 +630,6 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
return pref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateIllustrationImage(@NonNull final Context context,
|
private Preference updateIllustrationImage(@NonNull final Context context,
|
||||||
@@ -640,16 +643,9 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
return pref;
|
return pref;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateFooterPreference(@NonNull final Context context, final int title) {
|
private void addRotationPreference(final Context context,
|
||||||
var pref = getFooterPreference(context);
|
PrefRefresh refresh, final Display display, final int displayRotation) {
|
||||||
pref.setTitle(title);
|
var pref = reuseRotationPreference(context, refresh);
|
||||||
PrefBasics.FOOTER.apply(pref);
|
|
||||||
return pref;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Preference updateRotationPreference(@NonNull final Context context,
|
|
||||||
@NonNull final Display display, final int displayRotation) {
|
|
||||||
var pref = getRotationPreference(context);
|
|
||||||
if (mRotationEntries == null || mRotationEntriesValues == null) {
|
if (mRotationEntries == null || mRotationEntriesValues == null) {
|
||||||
mRotationEntries = new String[] {
|
mRotationEntries = new String[] {
|
||||||
context.getString(R.string.external_display_standard_rotation),
|
context.getString(R.string.external_display_standard_rotation),
|
||||||
@@ -673,12 +669,11 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
pref.setEnabled(isRotationSettingEnabled(mInjector));
|
pref.setEnabled(isRotationSettingEnabled(mInjector));
|
||||||
return pref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateResolutionPreference(@NonNull final Context context,
|
private void addResolutionPreference(final Context context, PrefRefresh refresh,
|
||||||
@NonNull final Display display) {
|
final Display display) {
|
||||||
var pref = getResolutionPreference(context);
|
var pref = reuseResolutionPreference(context, refresh);
|
||||||
pref.setSummary(display.getMode().getPhysicalWidth() + " x "
|
pref.setSummary(display.getMode().getPhysicalWidth() + " x "
|
||||||
+ display.getMode().getPhysicalHeight());
|
+ display.getMode().getPhysicalHeight());
|
||||||
pref.setOnPreferenceClickListener((Preference p) -> {
|
pref.setOnPreferenceClickListener((Preference p) -> {
|
||||||
@@ -687,19 +682,16 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
pref.setEnabled(isResolutionSettingEnabled(mInjector));
|
pref.setEnabled(isResolutionSettingEnabled(mInjector));
|
||||||
return pref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Preference updateSizePreference(@NonNull final Context context) {
|
private void addSizePreference(final Context context, PrefRefresh refresh) {
|
||||||
var pref = (Preference) getSizePreference(context);
|
var pref = reuseSizePreference(context, refresh);
|
||||||
PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref);
|
|
||||||
pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE);
|
pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE);
|
||||||
pref.setOnPreferenceClickListener(
|
pref.setOnPreferenceClickListener(
|
||||||
(Preference p) -> {
|
(Preference p) -> {
|
||||||
writePreferenceClickMetric(p);
|
writePreferenceClickMetric(p);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
return pref;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getDisplayRotation(int displayId) {
|
private int getDisplayRotation(int displayId) {
|
||||||
@@ -779,8 +771,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
Preference findUnusedPreference(@NonNull String key) {
|
<P extends Preference> P findUnusedPreference(@NonNull String key) {
|
||||||
return mUnusedPreferences.get(key);
|
return (P) mUnusedPreferences.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean addPreference(@NonNull final Preference pref) {
|
boolean addPreference(@NonNull final Preference pref) {
|
||||||
|
@@ -26,7 +26,6 @@ import static com.android.settings.connecteddevice.display.ExternalDisplayPrefer
|
|||||||
import static com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.resolutionRotationPreferenceKey;
|
import static com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.resolutionRotationPreferenceKey;
|
||||||
import static com.android.settings.flags.Flags.FLAG_DISPLAY_SIZE_CONNECTED_DISPLAY_SETTING;
|
import static com.android.settings.flags.Flags.FLAG_DISPLAY_SIZE_CONNECTED_DISPLAY_SETTING;
|
||||||
import static com.android.settings.flags.Flags.FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST;
|
import static com.android.settings.flags.Flags.FLAG_DISPLAY_TOPOLOGY_PANE_IN_DISPLAY_LIST;
|
||||||
import static com.android.settingslib.widget.FooterPreference.KEY_FOOTER;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@@ -47,6 +46,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.preference.ListPreference;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceCategory;
|
import androidx.preference.PreferenceCategory;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
@@ -55,7 +55,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
|
|||||||
|
|
||||||
import com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.DisplayPreference;
|
import com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.DisplayPreference;
|
||||||
import com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.PrefBasics;
|
import com.android.settings.connecteddevice.display.ExternalDisplayPreferenceFragment.PrefBasics;
|
||||||
import com.android.settingslib.widget.FooterPreference;
|
|
||||||
import com.android.settingslib.widget.MainSwitchPreference;
|
import com.android.settingslib.widget.MainSwitchPreference;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -237,11 +236,12 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
var footerPref = (FooterPreference) mPreferenceScreen.findPreference(KEY_FOOTER);
|
var footerPref = mPreferenceScreen.findPreference(PrefBasics.FOOTER.key);
|
||||||
assertThat(footerPref).isNotNull();
|
assertThat(footerPref).isNotNull();
|
||||||
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat(sizePref).isNull();
|
assertThat(sizePref).isNull();
|
||||||
verify(footerPref).setTitle(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE);
|
assertThat("" + footerPref.getTitle())
|
||||||
|
.isEqualTo(getText(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -259,11 +259,12 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
var footerPref = (FooterPreference) mPreferenceScreen.findPreference(KEY_FOOTER);
|
var footerPref = mPreferenceScreen.findPreference(PrefBasics.FOOTER.key);
|
||||||
assertThat(footerPref).isNotNull();
|
assertThat(footerPref).isNotNull();
|
||||||
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat(sizePref).isNotNull();
|
assertThat(sizePref).isNotNull();
|
||||||
verify(footerPref).setTitle(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE);
|
assertThat("" + footerPref.getTitle())
|
||||||
|
.isEqualTo(getText(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -279,11 +280,12 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat(pref).isNotNull();
|
assertThat(pref).isNotNull();
|
||||||
var footerPref = (FooterPreference) mPreferenceScreen.findPreference(KEY_FOOTER);
|
var footerPref = mPreferenceScreen.findPreference(PrefBasics.FOOTER.key);
|
||||||
assertThat(footerPref).isNotNull();
|
assertThat(footerPref).isNotNull();
|
||||||
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat(sizePref).isNotNull();
|
assertThat(sizePref).isNotNull();
|
||||||
verify(footerPref).setTitle(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE);
|
assertThat("" + footerPref.getTitle())
|
||||||
|
.isEqualTo(getText(EXTERNAL_DISPLAY_CHANGE_RESOLUTION_FOOTER_RESOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -306,7 +308,7 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
assertThat(pref).isNull();
|
assertThat(pref).isNull();
|
||||||
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat(pref).isNull();
|
assertThat(pref).isNull();
|
||||||
var footerPref = (FooterPreference) mPreferenceScreen.findPreference(KEY_FOOTER);
|
var footerPref = mPreferenceScreen.findPreference(PrefBasics.FOOTER.key);
|
||||||
assertThat(footerPref).isNull();
|
assertThat(footerPref).isNull();
|
||||||
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
var sizePref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat(sizePref).isNull();
|
assertThat(sizePref).isNull();
|
||||||
@@ -326,9 +328,10 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
assertThat(mainPref.isChecked()).isFalse();
|
assertThat(mainPref.isChecked()).isFalse();
|
||||||
assertThat(mainPref.isEnabled()).isFalse();
|
assertThat(mainPref.isEnabled()).isFalse();
|
||||||
assertThat(mainPref.getOnPreferenceChangeListener()).isNull();
|
assertThat(mainPref.getOnPreferenceChangeListener()).isNull();
|
||||||
var footerPref = (FooterPreference) mPreferenceScreen.findPreference(KEY_FOOTER);
|
var footerPref = mPreferenceScreen.findPreference(PrefBasics.FOOTER.key);
|
||||||
assertThat(footerPref).isNotNull();
|
assertThat(footerPref).isNotNull();
|
||||||
verify(footerPref).setTitle(EXTERNAL_DISPLAY_NOT_FOUND_FOOTER_RESOURCE);
|
assertThat("" + footerPref.getTitle())
|
||||||
|
.isEqualTo(getText(EXTERNAL_DISPLAY_NOT_FOUND_FOOTER_RESOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -338,7 +341,8 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
||||||
var fragment = initFragment();
|
var fragment = initFragment();
|
||||||
mHandler.flush();
|
mHandler.flush();
|
||||||
var pref = fragment.getRotationPreference(mContext);
|
ListPreference pref =
|
||||||
|
mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_ROTATION.key);
|
||||||
assertThat("" + pref.getTitle()).isEqualTo(
|
assertThat("" + pref.getTitle()).isEqualTo(
|
||||||
getText(PrefBasics.EXTERNAL_DISPLAY_ROTATION.titleResource));
|
getText(PrefBasics.EXTERNAL_DISPLAY_ROTATION.titleResource));
|
||||||
@@ -370,7 +374,7 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
||||||
var fragment = initFragment();
|
var fragment = initFragment();
|
||||||
mHandler.flush();
|
mHandler.flush();
|
||||||
var pref = fragment.getResolutionPreference(mContext);
|
var pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.key);
|
||||||
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.key);
|
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.key);
|
||||||
assertThat("" + pref.getTitle()).isEqualTo(
|
assertThat("" + pref.getTitle()).isEqualTo(
|
||||||
getText(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.titleResource));
|
getText(PrefBasics.EXTERNAL_DISPLAY_RESOLUTION.titleResource));
|
||||||
@@ -389,7 +393,7 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
doReturn(true).when(mMockedInjector).isDisplayEnabled(any());
|
||||||
var fragment = initFragment();
|
var fragment = initFragment();
|
||||||
mHandler.flush();
|
mHandler.flush();
|
||||||
var pref = fragment.getSizePreference(mContext);
|
var pref = mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
|
||||||
assertThat("" + pref.getTitle())
|
assertThat("" + pref.getTitle())
|
||||||
.isEqualTo(getText(PrefBasics.EXTERNAL_DISPLAY_SIZE.titleResource));
|
.isEqualTo(getText(PrefBasics.EXTERNAL_DISPLAY_SIZE.titleResource));
|
||||||
@@ -410,7 +414,8 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
doReturn(true).when(mMockedInjector).disableConnectedDisplay(mDisplayIdArg);
|
doReturn(true).when(mMockedInjector).disableConnectedDisplay(mDisplayIdArg);
|
||||||
var fragment = initFragment();
|
var fragment = initFragment();
|
||||||
mHandler.flush();
|
mHandler.flush();
|
||||||
var pref = fragment.getUseDisplayPreference(mContext);
|
MainSwitchPreference pref =
|
||||||
|
mPreferenceScreen.findPreference(PrefBasics.EXTERNAL_DISPLAY_USE.key);
|
||||||
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_USE.key);
|
assertThat(pref.getKey()).isEqualTo(PrefBasics.EXTERNAL_DISPLAY_USE.key);
|
||||||
assertThat("" + pref.getTitle())
|
assertThat("" + pref.getTitle())
|
||||||
.isEqualTo(getText(PrefBasics.EXTERNAL_DISPLAY_USE.titleResource));
|
.isEqualTo(getText(PrefBasics.EXTERNAL_DISPLAY_USE.titleResource));
|
||||||
@@ -455,15 +460,12 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
private final View mMockedRootView;
|
private final View mMockedRootView;
|
||||||
private final TextView mEmptyView;
|
private final TextView mEmptyView;
|
||||||
private final Activity mMockedActivity;
|
private final Activity mMockedActivity;
|
||||||
private final FooterPreference mMockedFooterPreference;
|
|
||||||
private final MetricsLogger mLogger;
|
private final MetricsLogger mLogger;
|
||||||
|
|
||||||
TestableExternalDisplayPreferenceFragment() {
|
TestableExternalDisplayPreferenceFragment() {
|
||||||
super(mMockedInjector);
|
super(mMockedInjector);
|
||||||
mMockedActivity = mock(Activity.class);
|
mMockedActivity = mock(Activity.class);
|
||||||
mMockedRootView = mock(View.class);
|
mMockedRootView = mock(View.class);
|
||||||
mMockedFooterPreference = mock(FooterPreference.class);
|
|
||||||
doReturn(KEY_FOOTER).when(mMockedFooterPreference).getKey();
|
|
||||||
mEmptyView = new TextView(mContext);
|
mEmptyView = new TextView(mContext);
|
||||||
doReturn(mEmptyView).when(mMockedRootView).findViewById(android.R.id.empty);
|
doReturn(mEmptyView).when(mMockedRootView).findViewById(android.R.id.empty);
|
||||||
mLogger = mMockedMetricsLogger;
|
mLogger = mMockedMetricsLogger;
|
||||||
@@ -499,12 +501,6 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
mPreferenceIdFromResource = resource;
|
mPreferenceIdFromResource = resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@NonNull
|
|
||||||
FooterPreference getFooterPreference(@NonNull Context context) {
|
|
||||||
return mMockedFooterPreference;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getDisplayIdArg() {
|
protected int getDisplayIdArg() {
|
||||||
return mDisplayIdArg;
|
return mDisplayIdArg;
|
||||||
@@ -520,6 +516,11 @@ public class ExternalDisplayPreferenceFragmentTest extends ExternalDisplayTestBa
|
|||||||
mDisplayIdArg = displayId;
|
mDisplayIdArg = displayId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Preference newFooterPreference(Context context) {
|
||||||
|
return new Preference(context);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void launchBuiltinDisplaySettings() {
|
protected void launchBuiltinDisplaySettings() {
|
||||||
mLaunchedBuiltinSettings = true;
|
mLaunchedBuiltinSettings = true;
|
||||||
|
Reference in New Issue
Block a user