From 24c3324268129a3d64580057238fd1e936725e02 Mon Sep 17 00:00:00 2001 From: tmfang Date: Fri, 31 May 2019 18:24:29 +0800 Subject: [PATCH] Use FooterPreference in xml explicitly We don't rely on FooterPreferenceMixinCompat to create footer preference in dashboard fragment. Instead, declare a FooterPreference explicitly in xml of screen. It makes more sense for our referenceController design. Test: visual, robotest Bug: 124129485 Change-Id: I0b0c0f9e38d85aa89b815ce2b84ddff30a1d206b --- res/xml/game_driver_settings.xml | 2 +- res/xml/night_display_settings.xml | 26 +++++---- res/xml/time_zone_prefs.xml | 2 +- .../TimeZoneInfoPreferenceController.java | 22 +++----- .../GameDriverFooterPreferenceController.java | 16 ++---- ...ightDisplayFooterPreferenceController.java | 17 ++---- .../display/NightDisplaySettings.java | 18 ------ .../TimeZoneInfoPreferenceControllerTest.java | 55 +++++++++++++------ ...eDriverFooterPreferenceControllerTest.java | 19 +------ ...DisplayFooterPreferenceControllerTest.java | 16 ++++-- 10 files changed, 84 insertions(+), 109 deletions(-) diff --git a/res/xml/game_driver_settings.xml b/res/xml/game_driver_settings.xml index a04724a786f..46efd3cc81a 100644 --- a/res/xml/game_driver_settings.xml +++ b/res/xml/game_driver_settings.xml @@ -34,7 +34,7 @@ diff --git a/res/xml/night_display_settings.xml b/res/xml/night_display_settings.xml index 07687eae5ba..4bccacf8d6b 100644 --- a/res/xml/night_display_settings.xml +++ b/res/xml/night_display_settings.xml @@ -15,34 +15,34 @@ --> + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:settings="http://schemas.android.com/apk/res-auto" + android:title="@string/night_display_title" + android:key="night_display_title" + settings:keywords="@string/keywords_display_night_display"> + settings:controller="com.android.settings.display.NightDisplayAutoModePreferenceController"/> + settings:controller="com.android.settings.display.NightDisplayCustomStartTimePreferenceController"/> + settings:controller="com.android.settings.display.NightDisplayCustomEndTimePreferenceController"/> + settings:unavailableSliceSubtitle="@string/night_display_not_currently_on"/> + settings:controller="com.android.settings.display.NightDisplayActivationPreferenceController"/> - + \ No newline at end of file diff --git a/res/xml/time_zone_prefs.xml b/res/xml/time_zone_prefs.xml index 2199fae1cbf..6fa43fa1304 100644 --- a/res/xml/time_zone_prefs.xml +++ b/res/xml/time_zone_prefs.xml @@ -31,7 +31,7 @@ android:title="@string/date_time_set_timezone_title" android:summary="@string/summary_placeholder" /> diff --git a/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceController.java b/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceController.java index a819f101a87..80cefb68ff9 100644 --- a/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceController.java +++ b/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceController.java @@ -29,20 +29,19 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.R; -import com.android.settingslib.widget.FooterPreference; +import com.android.settings.core.BasePreferenceController; import java.util.Date; -public class TimeZoneInfoPreferenceController extends BaseTimeZonePreferenceController { +public class TimeZoneInfoPreferenceController extends BasePreferenceController { - private static final String PREFERENCE_KEY = FooterPreference.KEY_FOOTER; @VisibleForTesting Date mDate; private TimeZoneInfo mTimeZoneInfo; private final DateFormat mDateFormat; - public TimeZoneInfoPreferenceController(Context context) { - super(context, PREFERENCE_KEY); + public TimeZoneInfoPreferenceController(Context context, String key) { + super(context, key); mDateFormat = DateFormat.getDateInstance(SimpleDateFormat.LONG); mDateFormat.setContext(DisplayContext.CAPITALIZATION_NONE); mDate = new Date(); @@ -50,24 +49,18 @@ public class TimeZoneInfoPreferenceController extends BaseTimeZonePreferenceCont @Override public int getAvailabilityStatus() { - return AVAILABLE; + return mTimeZoneInfo != null ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } @Override - public void updateState(Preference preference) { - CharSequence formattedTimeZone = mTimeZoneInfo == null ? "" : formatInfo(mTimeZoneInfo); - preference.setTitle(formattedTimeZone); - preference.setVisible(mTimeZoneInfo != null); + public CharSequence getSummary() { + return mTimeZoneInfo == null ? "" : formatInfo(mTimeZoneInfo); } public void setTimeZoneInfo(TimeZoneInfo timeZoneInfo) { mTimeZoneInfo = timeZoneInfo; } - public TimeZoneInfo getTimeZoneInfo() { - return mTimeZoneInfo; - } - private CharSequence formatOffsetAndName(TimeZoneInfo item) { String name = item.getGenericName(); if (name == null) { @@ -130,5 +123,4 @@ public class TimeZoneInfoPreferenceController extends BaseTimeZonePreferenceCont } while (transition != null); return transition; } - } diff --git a/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java b/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java index 12156df026a..1ad476ba00f 100644 --- a/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java +++ b/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java @@ -26,7 +26,6 @@ import android.os.Looper; import android.provider.Settings; import androidx.annotation.VisibleForTesting; -import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; @@ -40,7 +39,7 @@ import com.android.settingslib.widget.FooterPreference; */ public class GameDriverFooterPreferenceController extends BasePreferenceController implements GameDriverContentObserver.OnGameDriverContentChangedListener, LifecycleObserver, - OnStart, OnStop { + OnStart, OnStop { private final ContentResolver mContentResolver; @VisibleForTesting @@ -48,8 +47,8 @@ public class GameDriverFooterPreferenceController extends BasePreferenceControll private FooterPreference mPreference; - public GameDriverFooterPreferenceController(Context context) { - super(context, FooterPreference.KEY_FOOTER); + public GameDriverFooterPreferenceController(Context context, String key) { + super(context, key); mContentResolver = context.getContentResolver(); mGameDriverContentObserver = new GameDriverContentObserver(new Handler(Looper.getMainLooper()), this); @@ -58,8 +57,8 @@ public class GameDriverFooterPreferenceController extends BasePreferenceControll @Override public int getAvailabilityStatus() { return Settings.Global.getInt( - mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT) - == GAME_DRIVER_OFF + mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT) + == GAME_DRIVER_OFF ? AVAILABLE_UNSEARCHABLE : CONDITIONALLY_UNAVAILABLE; } @@ -80,11 +79,6 @@ public class GameDriverFooterPreferenceController extends BasePreferenceControll mGameDriverContentObserver.unregister(mContentResolver); } - @Override - public void updateState(Preference preference) { - preference.setVisible(isAvailable()); - } - @Override public void onGameDriverContentChanged() { updateState(mPreference); diff --git a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java index 194f0068593..14fe25e7ae0 100644 --- a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java @@ -19,26 +19,17 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; -import androidx.preference.Preference; - -import com.android.settings.R; import com.android.settings.core.BasePreferenceController; -import com.android.settingslib.widget.FooterPreference; public class NightDisplayFooterPreferenceController extends BasePreferenceController { - public NightDisplayFooterPreferenceController(Context context) { - super(context, FooterPreference.KEY_FOOTER); + public NightDisplayFooterPreferenceController(Context context, String key) { + super(context, key); } @Override public int getAvailabilityStatus() { - return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE - : UNSUPPORTED_ON_DEVICE; - } - - @Override - public void updateState(Preference preference) { - preference.setTitle(R.string.night_display_text); + return ColorDisplayManager.isNightDisplayAvailable(mContext) + ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } } diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java index 6441d716501..9f32de21dac 100644 --- a/src/com/android/settings/display/NightDisplaySettings.java +++ b/src/com/android/settings/display/NightDisplaySettings.java @@ -31,7 +31,6 @@ import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; -import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; import java.time.LocalTime; @@ -176,17 +175,6 @@ public class NightDisplaySettings extends DashboardFragment return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - - private static List buildPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(1); - controllers.add(new NightDisplayFooterPreferenceController(context)); - return controllers; - } - public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override @@ -203,11 +191,5 @@ public class NightDisplaySettings extends DashboardFragment protected boolean isPageSearchEnabled(Context context) { return ColorDisplayManager.isNightDisplayAvailable(context); } - - @Override - public List createPreferenceControllers( - Context context) { - return buildPreferenceControllers(context); - } }; } diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java index 5bbd01e2fad..563bf8dd7fa 100644 --- a/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datetime/timezone/TimeZoneInfoPreferenceControllerTest.java @@ -16,13 +16,16 @@ package com.android.settings.datetime.timezone; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.spy; +import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; -import androidx.preference.Preference; +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; import com.android.settings.datetime.timezone.TimeZoneInfo.Formatter; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -34,20 +37,38 @@ import java.util.Locale; @RunWith(RobolectricTestRunner.class) public class TimeZoneInfoPreferenceControllerTest { - @Test - public void updateState_matchExpectedFormattedText() { - Date now = new Date(0L); // 00:00 1/1/1970 - Formatter formatter = new Formatter(Locale.US, now); + private TimeZoneInfo mTimeZoneInfo; + private TimeZoneInfoPreferenceController mController; - TimeZoneInfo timeZoneInfo = formatter.format("America/Los_Angeles"); - TimeZoneInfoPreferenceController controller = - new TimeZoneInfoPreferenceController(RuntimeEnvironment.application); - controller.mDate = now; - controller.setTimeZoneInfo(timeZoneInfo); - Preference preference = spy(new Preference(RuntimeEnvironment.application)); - controller.updateState(preference); - assertEquals("Uses Pacific Time (GMT-08:00). " - + "Pacific Daylight Time starts on April 26, 1970.", - preference.getTitle().toString()); + @Before + public void setUp() { + final Context context = RuntimeEnvironment.application; + final Date now = new Date(0L); // 00:00 1/1/1970 + final Formatter formatter = new Formatter(Locale.US, now); + mTimeZoneInfo = formatter.format("America/Los_Angeles"); + mController = new TimeZoneInfoPreferenceController(context, "key"); + mController.mDate = now; + mController.setTimeZoneInfo(mTimeZoneInfo); + } + + @Test + public void getSummary_matchExpectedFormattedText() { + assertThat(mController.getSummary().toString()).isEqualTo( + "Uses Pacific Time (GMT-08:00). " + + "Pacific Daylight Time starts on April 26, 1970."); + } + + @Test + public void getAvailabilityStatus_timeZoneInfoSet_shouldReturnAVAILABLE_UNSEARCHABLE() { + mController.setTimeZoneInfo(mTimeZoneInfo); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); + } + + @Test + public void getAvailabilityStatus_noTimeZoneInfoSet_shouldReturnUNSUPPORTED_ON_DEVICE() { + mController.setTimeZoneInfo(null); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); } } diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java index 133791ea7e1..17b7b367fba 100644 --- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java @@ -21,6 +21,7 @@ import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_U import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS; import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT; import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; @@ -62,7 +63,7 @@ public class GameDriverFooterPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mResolver = mContext.getContentResolver(); - mController = spy(new GameDriverFooterPreferenceController(mContext)); + mController = spy(new GameDriverFooterPreferenceController(mContext, "key")); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); } @@ -104,20 +105,4 @@ public class GameDriverFooterPreferenceControllerTest { verify(mGameDriverContentObserver).unregister(mResolver); } - - @Test - public void updateState_available_visible() { - when(mController.getAvailabilityStatus()).thenReturn(AVAILABLE_UNSEARCHABLE); - mController.updateState(mPreference); - - verify(mPreference).setVisible(true); - } - - @Test - public void updateState_unavailable_invisible() { - when(mController.getAvailabilityStatus()).thenReturn(CONDITIONALLY_UNAVAILABLE); - mController.updateState(mPreference); - - verify(mPreference).setVisible(false); - } } diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java index 18aff9d77c8..efb26fab8b0 100644 --- a/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/NightDisplayFooterPreferenceControllerTest.java @@ -14,6 +14,9 @@ package com.android.settings.display; +import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + import static com.google.common.truth.Truth.assertThat; import com.android.settings.testutils.shadow.SettingsShadowResources; @@ -34,7 +37,8 @@ public class NightDisplayFooterPreferenceControllerTest { @Before public void setUp() { - mController = new NightDisplayFooterPreferenceController(RuntimeEnvironment.application); + mController = + new NightDisplayFooterPreferenceController(RuntimeEnvironment.application, "key"); } @After @@ -43,16 +47,18 @@ public class NightDisplayFooterPreferenceControllerTest { } @Test - public void isAvailable_configuredAvailable() { + public void getAvailabilityStatus_configuredAvailable_shouldReturnAVAILABLE_UNSEARCHABLE() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_nightDisplayAvailable, true); - assertThat(mController.isAvailable()).isTrue(); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); } @Test - public void isAvailable_configuredUnavailable() { + public void getAvailabilityStatus_configuredUnavailable_shouldReturnUNSUPPORTED_ON_DEVICE() { SettingsShadowResources.overrideResource( com.android.internal.R.bool.config_nightDisplayAvailable, false); - assertThat(mController.isAvailable()).isFalse(); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); } }