diff options
author | Fan Zhang <zhfan@google.com> | 2018-03-07 14:15:28 -0800 |
---|---|---|
committer | Fan Zhang <zhfan@google.com> | 2018-03-07 14:48:26 -0800 |
commit | 36680b0934d65871ddfbc98448da17ad04d525e6 (patch) | |
tree | 05ffb7e5cb1099ad01ad2c4608cb556c1ab6b739 | |
parent | 9c18ac05545b9cba674a732d6e5effabba971a88 (diff) | |
download | packages_apps_Settings-36680b0934d65871ddfbc98448da17ad04d525e6.tar.gz packages_apps_Settings-36680b0934d65871ddfbc98448da17ad04d525e6.tar.bz2 packages_apps_Settings-36680b0934d65871ddfbc98448da17ad04d525e6.zip |
For vibration settings page, create controllers from xml
This change leverages a new support in settings framework to
automatically share preference controllers between full setting page,
search, and slice provider.
Bug: 73668763
Test: existing robotest and atest
Change-Id: Ie96a28f1b503377b3fdf86e28d297c8560d8bf71
3 files changed, 30 insertions, 71 deletions
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml index d24834a57c..2228f29183 100644 --- a/res/xml/accessibility_vibration_settings.xml +++ b/res/xml/accessibility_vibration_settings.xml @@ -14,17 +14,21 @@ limitations under the License. --> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - android:key="accessibility_settings_vibration_screen" - android:title="@string/accessibility_vibration_settings_title"> +<PreferenceScreen + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:key="accessibility_settings_vibration_screen" + android:title="@string/accessibility_vibration_settings_title"> <Preference android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment" android:key="notification_vibration_preference_screen" - android:title="@string/accessibility_notification_vibration_title" /> + android:title="@string/accessibility_notification_vibration_title" + app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" /> <Preference android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment" android:key="touch_vibration_preference_screen" - android:title="@string/accessibility_touch_vibration_title" /> + android:title="@string/accessibility_touch_vibration_title" + app:controller="com.android.settings.accessibility.HapticFeedbackIntensityPreferenceController" /> </PreferenceScreen> diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java index 4b19d93359..83a5af6ac8 100644 --- a/src/com/android/settings/accessibility/VibrationSettings.java +++ b/src/com/android/settings/accessibility/VibrationSettings.java @@ -23,8 +23,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; import java.util.List; @@ -51,28 +49,6 @@ public class VibrationSettings extends DashboardFragment { return TAG; } - @Override - protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { - return buildControllers(context, getLifecycle()); - } - - public static List<AbstractPreferenceController> buildControllers(Context context, - Lifecycle lifecycle) { - - final List<AbstractPreferenceController> controllers = new ArrayList<>(); - final NotificationVibrationIntensityPreferenceController notifVibPrefController = - new NotificationVibrationIntensityPreferenceController(context); - final HapticFeedbackIntensityPreferenceController hapticPreferenceController = - new HapticFeedbackIntensityPreferenceController(context); - controllers.add(hapticPreferenceController); - controllers.add(notifVibPrefController); - if (lifecycle != null) { - lifecycle.addObserver(hapticPreferenceController); - lifecycle.addObserver(notifVibPrefController); - } - return controllers; - } - public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override @@ -84,11 +60,5 @@ public class VibrationSettings extends DashboardFragment { indexables.add(indexable); return indexables; } - - @Override - public List<AbstractPreferenceController> createPreferenceControllers( - Context context) { - return buildControllers(context, null /* lifecycle */); - } }; } diff --git a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java index bf979c6d9f..7de9c2b229 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java @@ -16,16 +16,17 @@ package com.android.settings.slices; +import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER; +import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.Mockito.spy; import android.content.Context; -import android.content.res.XmlResourceParser; +import android.os.Bundle; import android.provider.SearchIndexableResource; import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Xml; +import com.android.settings.core.PreferenceXmlParserUtils; import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.codeinspection.ClassScanner; import com.android.settings.core.codeinspection.CodeInspector; @@ -34,7 +35,6 @@ import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.Indexable; import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProviderImpl; -import com.android.settings.core.PreferenceXmlParserUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -42,8 +42,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; -import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -53,7 +54,7 @@ import java.util.List; public class SliceControllerInXmlTest { private static final List<Class> mSliceControllerClasses = Collections.singletonList( - TogglePreferenceController.class + TogglePreferenceController.class ); private final List<String> mXmlDeclaredControllers = new ArrayList<>(); @@ -71,7 +72,7 @@ public class SliceControllerInXmlTest { private FakeFeatureFactory mFakeFeatureFactory; @Before - public void setUp() { + public void setUp() throws IOException, XmlPullParserException { mContext = spy(RuntimeEnvironment.application); mSearchProvider = new SearchFeatureProviderImpl(); @@ -83,44 +84,28 @@ public class SliceControllerInXmlTest { initDeclaredControllers(); } - private void initDeclaredControllers() { + private void initDeclaredControllers() throws IOException, XmlPullParserException { final List<Integer> xmlResources = getIndexableXml(); - XmlResourceParser parser; - for (int xmlResId : xmlResources) { - try { - parser = mContext.getResources().getXml(xmlResId); - - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && type != XmlPullParser.START_TAG) { - // Parse next until start tag is found - } - - final int outerDepth = parser.getDepth(); - final AttributeSet attrs = Xml.asAttributeSet(parser); - String controllerClassName; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { - if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { - continue; - } - controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs); - - if (!TextUtils.isEmpty(controllerClassName)) { - mXmlDeclaredControllers.add(controllerClassName); - } + final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext, + xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER); + for (Bundle bundle : metadata) { + final String controllerClassName = bundle.getString(METADATA_CONTROLLER); + if (TextUtils.isEmpty(controllerClassName)) { + continue; } - } catch (Exception e) { - // Assume an issue with robolectric resources + mXmlDeclaredControllers.add(controllerClassName); } } + // We definitely have some controllers in xml, so assert not-empty here as a proxy to + // make sure the parser didn't fail + assertThat(mXmlDeclaredControllers).isNotEmpty(); } @Test public void testAllControllersDeclaredInXml() throws Exception { final List<Class<?>> classes = - new ClassScanner().getClassesForPackage(mContext.getPackageName()); + new ClassScanner().getClassesForPackage(mContext.getPackageName()); final List<String> missingControllersInXml = new ArrayList<>(); for (Class<?> clazz : classes) { @@ -139,7 +124,7 @@ public class SliceControllerInXmlTest { missingControllersInXml.removeAll(mGrandfatheredClasses); final String missingControllerError = - buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml); + buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml); assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty(); } |