diff --git a/res/xml/app_and_notification_new_advance_button.xml b/res/xml/app_and_notification_new_advance_button.xml new file mode 100644 index 00000000000..c7b91e867eb --- /dev/null +++ b/res/xml/app_and_notification_new_advance_button.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/display_settings_new_advance_button.xml b/res/xml/display_settings_new_advance_button.xml new file mode 100644 index 00000000000..c7cf50590e9 --- /dev/null +++ b/res/xml/display_settings_new_advance_button.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/language_and_input_new_advance_button.xml b/res/xml/language_and_input_new_advance_button.xml new file mode 100644 index 00000000000..e5ae674f552 --- /dev/null +++ b/res/xml/language_and_input_new_advance_button.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/sound_settings_new_advance_button.xml b/res/xml/sound_settings_new_advance_button.xml new file mode 100644 index 00000000000..6b0ba0e81a7 --- /dev/null +++ b/res/xml/sound_settings_new_advance_button.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index 86c3da16ba6..b5f848c630d 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -73,7 +73,8 @@ public class DisplaySettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.display_settings; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.display_settings : R.xml.display_settings_new_advance_button; } @Override diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java index d3063536c47..204e120eb86 100644 --- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java @@ -60,7 +60,8 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.app_and_notification; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.app_and_notification : R.xml.app_and_notification_new_advance_button; } @Override diff --git a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java index 92055be3764..3dfffccb801 100644 --- a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java +++ b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java @@ -24,6 +24,7 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; +import android.util.FeatureFlagUtils; import android.util.Log; import com.android.internal.logging.nano.MetricsProto; @@ -42,6 +43,8 @@ import java.util.List; public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickListener, LifecycleObserver, OnCreate, OnSaveInstanceState { + @VisibleForTesting + static final String FEATURE_FLAG_NEW_ADVANCE_BUTTON = "new_settings_advance_button"; private static final String TAG = "ProgressiveDisclosure"; private static final String STATE_USER_EXPANDED = "state_user_expanded"; private static final int DEFAULT_TILE_LIMIT = 300; @@ -102,11 +105,17 @@ public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickL return false; } + public boolean isEnabled() { + return !FeatureFlagUtils.isEnabled(FEATURE_FLAG_NEW_ADVANCE_BUTTON); + } + /** * Sets the threshold to start collapsing preferences when there are too many. */ public void setTileLimit(int limit) { - mTileLimit = limit; + if (isEnabled()) { + mTileLimit = limit; + } } /** diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index 4affc6edbc6..19b1a9f0b67 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -86,7 +86,8 @@ public class LanguageAndInputSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.language_and_input; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.language_and_input : R.xml.language_and_input_new_advance_button; } @Override diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java index e759c390bd5..6812d4d557b 100644 --- a/src/com/android/settings/notification/SoundSettings.java +++ b/src/com/android/settings/notification/SoundSettings.java @@ -109,7 +109,8 @@ public class SoundSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.sound_settings; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.sound_settings : R.xml.sound_settings_new_advance_button; } @Override diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java index 4b345c0c308..3ee8feb1268 100644 --- a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java +++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java @@ -2,8 +2,11 @@ package com.android.settings; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; + import android.content.Context; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowPowerManagerWrapper; @@ -13,6 +16,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -25,9 +29,9 @@ public class DisplaySettingsTest { @Config(shadows = ShadowPowerManagerWrapper.class) public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() { final Context context = RuntimeEnvironment.application; -// PowerManager wrapper = mock(PowerManager.class); -// doReturn(wrapper).when(context).getSystemService(Context.POWER_SERVICE); final DisplaySettings fragment = new DisplaySettings(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); final List preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId()); final List preferenceKeys = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java index 697d04ffa8d..269d840cac4 100644 --- a/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java @@ -19,6 +19,8 @@ package com.android.settings.applications; import android.content.Context; import android.os.UserManager; + +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.XmlTestUtils; @@ -27,6 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.List; @@ -47,7 +50,10 @@ public class AppAndNotificationDashboardFragmentTest { when(context.getSystemService(Context.USER_SERVICE)).thenReturn(manager); final List niks = AppAndNotificationDashboardFragment.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new AppAndNotificationDashboardFragment()).getPreferenceScreenResId(); + AppAndNotificationDashboardFragment fragment = new AppAndNotificationDashboardFragment(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = fragment.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); diff --git a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java index 6fe60cf5124..3155ea90a33 100644 --- a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java @@ -26,7 +26,9 @@ import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,6 +41,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.List; +import static android.util.FeatureFlagUtils.FFLAG_PREFIX; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; @@ -53,7 +56,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = {SettingsShadowSystemProperties.class}) public class ProgressiveDisclosureTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) @@ -80,6 +84,25 @@ public class ProgressiveDisclosureTest { mPreference.setKey("test"); } + @After + public void tearDown() { + SettingsShadowSystemProperties.clear(); + } + + @Test + public void systemPropertySetForNewAdvancedButtonFeature_verifyIsDisabled() { + SettingsShadowSystemProperties.set( + FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "true"); + assertThat(mMixin.isEnabled()).isFalse(); + } + + @Test + public void systemPropertyNotSet_verifyIsDisabled() { + SettingsShadowSystemProperties.set( + FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "false"); + assertThat(mMixin.isEnabled()).isTrue(); + } + @Test public void shouldNotCollapse_lessPreferenceThanLimit() { when(mScreen.getPreferenceCount()).thenReturn(5); diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java index 809fb3ae521..5c6e777395d 100644 --- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java +++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java @@ -43,6 +43,7 @@ import android.view.textservice.TextServicesManager; import com.android.settings.R; import com.android.settings.TestConfig; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; @@ -59,6 +60,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -101,6 +103,9 @@ public class LanguageAndInputSettingsTest { @Test public void testGetPreferenceScreenResId() { + ProgressiveDisclosureMixin progessiveMixin = mock(ProgressiveDisclosureMixin.class); + when(progessiveMixin.isEnabled()).thenReturn(true); + ReflectionHelpers.setField(mFragment, "mProgressiveDisclosureMixin", progessiveMixin); assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input); } @@ -167,7 +172,10 @@ public class LanguageAndInputSettingsTest { .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys); final List niks = LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new LanguageAndInputSettings()).getPreferenceScreenResId(); + LanguageAndInputSettings settings = new LanguageAndInputSettings(); + ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = settings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); @@ -178,6 +186,8 @@ public class LanguageAndInputSettingsTest { public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() { final Context context = RuntimeEnvironment.application; final LanguageAndInputSettings fragment = new LanguageAndInputSettings(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); final List preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId()); final List preferenceKeys = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java index 59b70785e26..bd386468bc9 100644 --- a/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java +++ b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java @@ -21,6 +21,7 @@ import android.content.Context; import android.media.AudioManager; import android.os.UserManager; import com.android.settings.R; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.XmlTestUtils; @@ -30,6 +31,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.List; @@ -59,7 +61,10 @@ public class SoundSettingsTest { final List niks = SoundSettings.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new SoundSettings()).getPreferenceScreenResId(); + SoundSettings settings = new SoundSettings(); + ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = settings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.zen_mode_settings));