diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml index 47199c2d66e..9e32440cba0 100644 --- a/res/xml/battery_saver_settings.xml +++ b/res/xml/battery_saver_settings.xml @@ -16,6 +16,7 @@ @@ -23,12 +24,15 @@ + android:summary="@string/battery_saver_auto_summary" + settings:controller="com.android.settings.fuelgauge.batterysaver.AutoBatterySaverPreferenceController"/> + + + android:order="-7" + settings:controller="com.android.settings.bluetooth.BluetoothSwitchPreferenceController"/> diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index dafd36c54b9..00eaa7e10f1 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -79,7 +79,8 @@ + android:title="@string/lockpattern_settings_enable_visible_pattern_title_profile" + settings:controller="com.android.settings.security.VisiblePatternProfilePreferenceController"/> + android:summary="@string/show_password_summary" + settings:controller="com.android.settings.security.ShowPasswordPreferenceController"/> diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml index 1da1de5eccf..3d3bfd064b8 100644 --- a/res/xml/security_lockscreen_settings.xml +++ b/res/xml/security_lockscreen_settings.xml @@ -16,6 +16,7 @@ @@ -36,7 +37,8 @@ + android:summary="@string/lockdown_settings_summary" + settings:controller="com.android.settings.security.LockdownButtonPreferenceController"/> mSliceControllerClasses = new ArrayList<>(Arrays.asList( + TogglePreferenceController.class + )); + + private final List mXmlDeclaredControllers = new ArrayList<>(); + private final List mGrandfatheredClasses = new ArrayList<>(); + + private final String ERROR_MISSING_CONTROLLER = + "The following controllers were expected to be declared by " + + "'settings:controller=Controller_Class_Name' in their corresponding Xml. " + + "If it should not appear in XML, add the controller's classname to " + + "grandfather_slice_controller_not_in_xml. Controllers:\n"; + + private Context mContext; + + SearchFeatureProvider mSearchProvider; + private FakeFeatureFactory mFakeFeatureFactory; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + + mSearchProvider = new SearchFeatureProviderImpl(); + mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); + mFakeFeatureFactory.searchFeatureProvider = mSearchProvider; + + CodeInspector.initializeGrandfatherList(mGrandfatheredClasses, + "grandfather_slice_controller_not_in_xml"); + initDeclaredControllers(); + } + + private void initDeclaredControllers() { + final List 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 = XmlParserUtils.getController(mContext, attrs); + + if (!TextUtils.isEmpty(controllerClassName)) { + mXmlDeclaredControllers.add(controllerClassName); + } + } + } catch (Exception e) { + // Assume an issue with robolectric resources + } + } + } + + @Test + public void testAllControllersDeclaredInXml() throws Exception { + final List> classes = new ClassScanner().getClassesForPackage( + mContext.getPackageName()); + final List missingControllersInXml = new ArrayList<>(); + + for (Class clazz : classes) { + if (!isInlineSliceClass(clazz)) { + // Only care about inline-slice controller classes. + continue; + } + + if (!mXmlDeclaredControllers.contains(clazz.getName())) { + // Class clazz should have been declared in XML (unless whitelisted). + missingControllersInXml.add(clazz.getName()); + } + } + + // Removed whitelisted classes + missingControllersInXml.removeAll(mGrandfatheredClasses); + + final String missingControllerError = buildErrorMessage(ERROR_MISSING_CONTROLLER, + missingControllersInXml); + + assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty(); + } + + private boolean isInlineSliceClass(Class clazz) { + while (clazz != null) { + clazz = clazz.getSuperclass(); + if (mSliceControllerClasses.contains(clazz)) { + return true; + } + } + return false; + } + + private String buildErrorMessage(String errorSummary, List errorClasses) { + final StringBuilder error = new StringBuilder(errorSummary); + for (String c : errorClasses) { + error.append(c).append("\n"); + } + return error.toString(); + } + + private List getIndexableXml() { + final List xmlResSet = new ArrayList<>(); + + final Collection indexableClasses = FeatureFactory.getFactory( + mContext).getSearchFeatureProvider().getSearchIndexableResources() + .getProviderValues(); + + for (Class clazz : indexableClasses) { + + Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider( + clazz); + + if (provider == null) { + continue; + } + + List resources = provider.getXmlResourcesToIndex(mContext, + true); + + if (resources == null) { + continue; + } + + for (SearchIndexableResource resource : resources) { + // Add '0's anyway. It won't break the test. + xmlResSet.add(resource.xmlResId); + } + } + return xmlResSet; + } +} diff --git a/tests/robotests/src/com/android/settings/slices/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java similarity index 97% rename from tests/robotests/src/com/android/settings/slices/FakeToggleController.java rename to tests/robotests/src/com/android/settings/testutils/FakeToggleController.java index 1b08e3566aa..c984c6ceca4 100644 --- a/tests/robotests/src/com/android/settings/slices/FakeToggleController.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java @@ -15,7 +15,7 @@ * */ -package com.android.settings.slices; +package com.android.settings.testutils; import android.content.Context; import android.provider.Settings;