From fe5259493da6455583fe4b6d9775320e22920db4 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 27 Nov 2018 14:58:55 -0800 Subject: [PATCH] Hide the SelfAvailablePreference if it is not available. - instead of removing it from the preference screen, set its visibility to false, so that if it becomes available later, it will still be found on the screen. Bug: 119838520 Test: make RunSettingsRoboTests Change-Id: Idc7079bb5846aef247dd87c0b0dba2546f2d8f8f --- .../settings/SettingsPreferenceFragment.java | 5 +++-- .../SettingsPreferenceFragmentTest.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 6933cfd6653..6b29b2e1e48 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -155,13 +155,14 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF checkAvailablePrefs(getPreferenceScreen()); } - private void checkAvailablePrefs(PreferenceGroup preferenceGroup) { + @VisibleForTesting + void checkAvailablePrefs(PreferenceGroup preferenceGroup) { if (preferenceGroup == null) return; for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) { Preference pref = preferenceGroup.getPreference(i); if (pref instanceof SelfAvailablePreference && !((SelfAvailablePreference) pref).isAvailable(getContext())) { - preferenceGroup.removePreference(pref); + pref.setVisible(false); } else if (pref instanceof PreferenceGroup) { checkAvailablePrefs((PreferenceGroup) pref); } diff --git a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java index 2fc3dcb1297..76f70433b48 100644 --- a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java @@ -18,8 +18,10 @@ package com.android.settings; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,6 +39,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.widget.WorkOnlyCategory; import org.junit.Before; import org.junit.Test; @@ -174,6 +177,20 @@ public class SettingsPreferenceFragmentTest { // no crash } + @Test + public void checkAvailablePrefs_selfAvialbalePreferenceNotAvailable_shouldHidePreference() { + doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); + final WorkOnlyCategory workOnlyCategory = mock(WorkOnlyCategory.class); + when(mPreferenceScreen.getPreferenceCount()).thenReturn(1); + when(mPreferenceScreen.getPreference(0)).thenReturn(workOnlyCategory); + when(workOnlyCategory.isAvailable(any(Context.class))).thenReturn(false); + + mFragment.checkAvailablePrefs(mPreferenceScreen); + + verify(mPreferenceScreen, never()).removePreference(workOnlyCategory); + verify(workOnlyCategory).setVisible(false); + } + public static class TestFragment extends SettingsPreferenceFragment { @Override