OSDN Git Service

For vibration settings page, create controllers from xml
authorFan Zhang <zhfan@google.com>
Wed, 7 Mar 2018 22:15:28 +0000 (14:15 -0800)
committerFan Zhang <zhfan@google.com>
Wed, 7 Mar 2018 22:48:26 +0000 (14:48 -0800)
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

res/xml/accessibility_vibration_settings.xml
src/com/android/settings/accessibility/VibrationSettings.java
tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java

index d24834a..2228f29 100644 (file)
      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>
index 4b19d93..83a5af6 100644 (file)
@@ -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 */);
-                }
             };
 }
index bf979c6..7de9c2b 100644 (file)
 
 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();
     }