Merge changes I550fc918,I16b3ae92 into main

* changes:
  Disable mirror toggle if feature turned off
  Use PrefRefresh for Preference caching
This commit is contained in:
Matthew DeVore
2025-02-21 08:59:44 -08:00
committed by Android (Google) Code Review
3 changed files with 137 additions and 137 deletions

View File

@@ -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;
@@ -35,6 +35,7 @@ import android.os.Bundle;
import android.view.Display; import android.view.Display;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.window.DesktopExperienceFlags;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -59,7 +60,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.
@@ -67,7 +67,7 @@ import java.util.function.Consumer;
public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase { public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmentBase {
@VisibleForTesting enum PrefBasics { @VisibleForTesting enum PrefBasics {
DISPLAY_TOPOLOGY(10, "display_topology_preference", null), DISPLAY_TOPOLOGY(10, "display_topology_preference", null),
MIRROR(20, "mirror_preference", null), MIRROR(20, "mirror_preference", R.string.external_display_mirroring_title),
// If shown, use toggle should be before other per-display settings. // If shown, use toggle should be before other per-display settings.
EXTERNAL_DISPLAY_USE(30, "external_display_use_preference", EXTERNAL_DISPLAY_USE(30, "external_display_use_preference",
@@ -130,28 +130,15 @@ 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;
@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 +257,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
@@ -357,27 +356,31 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
return mDisplayTopologyPreference; return mDisplayTopologyPreference;
} }
@NonNull Preference getMirrorPreference(@NonNull Context context) { private void addMirrorPreference(Context context, PrefRefresh refresh) {
if (mMirrorPreference == null) { Preference pref = refresh.findUnusedPreference(PrefBasics.MIRROR.key);
mMirrorPreference = new MirrorPreference(context); if (pref == null) {
PrefBasics.MIRROR.apply(mMirrorPreference); pref = new MirrorPreference(context,
DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue());
PrefBasics.MIRROR.apply(pref);
} }
return mMirrorPreference; refresh.addPreference(pref);
} }
@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 +442,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 +471,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 +482,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,19 +509,19 @@ 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);
} }
} }
private void maybeAddV2Components(Context context, PrefRefresh screen) { private void maybeAddV2Components(Context context, PrefRefresh screen) {
if (isTopologyPaneEnabled(mInjector)) { if (isTopologyPaneEnabled(mInjector)) {
screen.addPreference(getDisplayTopologyPreference(context)); screen.addPreference(getDisplayTopologyPreference(context));
screen.addPreference(getMirrorPreference(context)); addMirrorPreference(context, screen);
// If topology is shown, we also show a preference for the built-in display for // If topology is shown, we also show a preference for the built-in display for
// consistency with the topology. // consistency with the topology.
@@ -597,17 +603,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 +631,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 +644,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 +670,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 +683,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 +772,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) {

View File

@@ -23,26 +23,32 @@ import androidx.preference.SwitchPreferenceCompat
import com.android.settings.R import com.android.settings.R
const val MIRROR_SETTING = Settings.Secure.MIRROR_BUILT_IN_DISPLAY
/** /**
* A switch preference which is backed by the MIRROR_BUILT_IN_DISPLAY global setting. * A switch preference which is backed by the MIRROR_BUILT_IN_DISPLAY global setting.
*/ */
class MirrorPreference(context: Context): SwitchPreferenceCompat(context) { class MirrorPreference(context: Context, val contentModeEnabled: Boolean):
init { SwitchPreferenceCompat(context) {
setTitle(R.string.external_display_mirroring_title)
isPersistent = false
}
override fun onAttached() { override fun onAttached() {
super.onAttached() super.onAttached()
setChecked(0 != Settings.Secure.getInt(
context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, 0)) isEnabled = contentModeEnabled
if (contentModeEnabled) {
setChecked(0 != Settings.Secure.getInt(context.contentResolver, MIRROR_SETTING, 0))
} else {
setChecked(0 == Settings.Global.getInt(
context.contentResolver,
Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0))
}
} }
override fun onClick() { override fun onClick() {
super.onClick() super.onClick()
if (contentModeEnabled) {
Settings.Secure.putInt( Settings.Secure.putInt(
context.contentResolver, Settings.Secure.MIRROR_BUILT_IN_DISPLAY, context.contentResolver, MIRROR_SETTING, if (isChecked()) 1 else 0)
if (isChecked()) 1 else 0) }
} }
} }

View File

@@ -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;