Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36680b09 authored by Fan Zhang's avatar Fan Zhang
Browse files

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
parent 9c18ac05
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -14,17 +14,21 @@
     limitations under the License.
-->

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
<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>
+0 −30
Original line number Diff line number Diff line
@@ -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 */);
                }
            };
}
+21 −36
Original line number Diff line number Diff line
@@ -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;
@@ -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,38 +84,22 @@ 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) {
            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;
                }
                    controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);

                    if (!TextUtils.isEmpty(controllerClassName)) {
                mXmlDeclaredControllers.add(controllerClassName);
            }
        }
            } catch (Exception e) {
                // Assume an issue with robolectric resources
            }
        }
        // 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