diff options
| author | 2017-01-13 21:59:13 +0000 | |
|---|---|---|
| committer | 2017-01-13 21:59:15 +0000 | |
| commit | e446c98bd1b79bcf1fb21cf59a8ec594c5fd5c23 (patch) | |
| tree | d481a553128d705cd97069ce732ab20ae8538314 | |
| parent | ed2aca84e7c3c81f470477c8a8e7d8695bdf9e0f (diff) | |
| parent | 5404355e0a23a8806efd74050513429c701e64b9 (diff) | |
Merge "move PreferenceController into settingLib/core"
3 files changed, 200 insertions, 0 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java new file mode 100644 index 000000000000..2b482fd5b553 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java @@ -0,0 +1,81 @@ +package com.android.settingslib.core; + +import android.content.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import java.util.List; + +/** + * A controller that manages event for preference. + */ +public abstract class AbstractPreferenceController { + + protected final Context mContext; + + public AbstractPreferenceController(Context context) { + mContext = context; + } + + /** + * Displays preference in this controller. + */ + public void displayPreference(PreferenceScreen screen) { + if (isAvailable()) { + if (this instanceof Preference.OnPreferenceChangeListener) { + final Preference preference = screen.findPreference(getPreferenceKey()); + preference.setOnPreferenceChangeListener( + (Preference.OnPreferenceChangeListener) this); + } + } else { + removePreference(screen, getPreferenceKey()); + } + } + + /** + * Updates the current status of preference (summary, switch state, etc) + */ + public void updateState(Preference preference) { + + } + + /** + * Updates non-indexable keys for search provider. + * + * Called by SearchIndexProvider#getNonIndexableKeys + */ + public void updateNonIndexableKeys(List<String> keys) { + if (!isAvailable()) { + keys.add(getPreferenceKey()); + } + } + + /** + * Returns true if preference is available (should be displayed) + */ + public abstract boolean isAvailable(); + + /** + * Handles preference tree click + * + * @param preference the preference being clicked + * @return true if click is handled + */ + public boolean handlePreferenceTreeClick(Preference preference) { + return false; + } + + /** + * Returns the key for this preference. + */ + public abstract String getPreferenceKey(); + + /** + * Removes preference from screen. + */ + protected final void removePreference(PreferenceScreen screen, String key) { + Preference pref = screen.findPreference(key); + if (pref != null) { + screen.removePreference(pref); + } + } +} diff --git a/packages/SettingsLib/tests/robotests/Android.mk b/packages/SettingsLib/tests/robotests/Android.mk index 208fa6df05ee..7a89884ae747 100644 --- a/packages/SettingsLib/tests/robotests/Android.mk +++ b/packages/SettingsLib/tests/robotests/Android.mk @@ -30,6 +30,11 @@ LOCAL_JAVA_LIBRARIES := \ platform-robolectric-prebuilt LOCAL_STATIC_JAVA_LIBRARIES := \ + android-support-v4 \ + android-support-v7-recyclerview \ + android-support-v7-preference \ + android-support-v7-appcompat \ + android-support-v14-preference \ platform-system-robolectric \ truth-prebuilt diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java new file mode 100644 index 000000000000..126bc16e8733 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.settingslib.core; + +import android.content.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import com.android.settingslib.TestConfig; +import com.android.settingslib.core.AbstractPreferenceController; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; +import org.robolectric.RobolectricTestRunner; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class PreferenceControllerTest { + + @Mock + private Context mContext; + @Mock + private PreferenceScreen mScreen; + @Mock + private Preference mPreference; + + private TestPrefController mTestPrefController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mTestPrefController = new TestPrefController(mContext); + } + + @Test + public void removeExistingPref_shouldBeRemoved() { + when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference); + + mTestPrefController.removePreference(mScreen, TestPrefController.KEY_PREF); + + verify(mScreen).removePreference(mPreference); + } + + @Test + public void removeNonExistingPref_shouldNotRemoveAnything() { + mTestPrefController.removePreference(mScreen, TestPrefController.KEY_PREF); + + verify(mScreen, never()).removePreference(any(Preference.class)); + } + + @Test + public void displayPref_ifAvailable() { + mTestPrefController.isAvailable = true; + + mTestPrefController.displayPreference(mScreen); + + verify(mScreen, never()).removePreference(any(Preference.class)); + } + + @Test + public void doNotDisplayPref_ifNotAvailable() { + when(mScreen.findPreference(TestPrefController.KEY_PREF)).thenReturn(mPreference); + mTestPrefController.isAvailable = false; + + mTestPrefController.displayPreference(mScreen); + + verify(mScreen).removePreference(any(Preference.class)); + } + + private class TestPrefController extends AbstractPreferenceController { + private static final String KEY_PREF = "test_pref"; + public boolean isAvailable; + + public TestPrefController(Context context) { + super(context); + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + return false; + } + + @Override + public boolean isAvailable() { + return isAvailable; + } + + @Override + public String getPreferenceKey() { + return KEY_PREF; + } + } + +} |