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
This commit is contained in:
Fan Zhang
2018-03-07 14:15:28 -08:00
parent 9c18ac0554
commit 36680b0934
3 changed files with 30 additions and 71 deletions

View File

@@ -14,17 +14,21 @@
limitations under the License. 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:key="accessibility_settings_vibration_screen"
android:title="@string/accessibility_vibration_settings_title"> android:title="@string/accessibility_vibration_settings_title">
<Preference <Preference
android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment" android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
android:key="notification_vibration_preference_screen" 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 <Preference
android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment" android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment"
android:key="touch_vibration_preference_screen" 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> </PreferenceScreen>

View File

@@ -23,8 +23,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider; 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.ArrayList;
import java.util.List; import java.util.List;
@@ -51,28 +49,6 @@ public class VibrationSettings extends DashboardFragment {
return TAG; 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 = public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override
@@ -84,11 +60,5 @@ public class VibrationSettings extends DashboardFragment {
indexables.add(indexable); indexables.add(indexable);
return indexables; return indexables;
} }
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildControllers(context, null /* lifecycle */);
}
}; };
} }

View File

@@ -16,16 +16,17 @@
package com.android.settings.slices; 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 com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import android.content.Context; import android.content.Context;
import android.content.res.XmlResourceParser; import android.os.Bundle;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.text.TextUtils; 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.TogglePreferenceController;
import com.android.settings.core.codeinspection.ClassScanner; import com.android.settings.core.codeinspection.ClassScanner;
import com.android.settings.core.codeinspection.CodeInspector; 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.Indexable;
import com.android.settings.search.SearchFeatureProvider; import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl; import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -42,8 +42,9 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment; 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.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -71,7 +72,7 @@ public class SliceControllerInXmlTest {
private FakeFeatureFactory mFakeFeatureFactory; private FakeFeatureFactory mFakeFeatureFactory;
@Before @Before
public void setUp() { public void setUp() throws IOException, XmlPullParserException {
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mSearchProvider = new SearchFeatureProviderImpl(); mSearchProvider = new SearchFeatureProviderImpl();
@@ -83,38 +84,22 @@ public class SliceControllerInXmlTest {
initDeclaredControllers(); initDeclaredControllers();
} }
private void initDeclaredControllers() { private void initDeclaredControllers() throws IOException, XmlPullParserException {
final List<Integer> xmlResources = getIndexableXml(); final List<Integer> xmlResources = getIndexableXml();
XmlResourceParser parser;
for (int xmlResId : xmlResources) { for (int xmlResId : xmlResources) {
try { final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
parser = mContext.getResources().getXml(xmlResId); xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
for (Bundle bundle : metadata) {
int type; final String controllerClassName = bundle.getString(METADATA_CONTROLLER);
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT if (TextUtils.isEmpty(controllerClassName)) {
&& 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; continue;
} }
controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
if (!TextUtils.isEmpty(controllerClassName)) {
mXmlDeclaredControllers.add(controllerClassName); mXmlDeclaredControllers.add(controllerClassName);
} }
} }
} catch (Exception e) { // We definitely have some controllers in xml, so assert not-empty here as a proxy to
// Assume an issue with robolectric resources // make sure the parser didn't fail
} assertThat(mXmlDeclaredControllers).isNotEmpty();
}
} }
@Test @Test