summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Roger Xue <rogerxue@google.com> 2017-01-13 21:59:13 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-01-13 21:59:15 +0000
commite446c98bd1b79bcf1fb21cf59a8ec594c5fd5c23 (patch)
treed481a553128d705cd97069ce732ab20ae8538314
parented2aca84e7c3c81f470477c8a8e7d8695bdf9e0f (diff)
parent5404355e0a23a8806efd74050513429c701e64b9 (diff)
Merge "move PreferenceController into settingLib/core"
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java81
-rw-r--r--packages/SettingsLib/tests/robotests/Android.mk5
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/PreferenceControllerTest.java114
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;
+ }
+ }
+
+}