android:value="true" />
</activity>
- <!-- Keep compatibility with old shortcuts. -->
- <activity-alias android:name="UserDictionarySettings"
- android:label="@string/user_dict_settings_title"
- android:exported="true"
- android:targetActivity="Settings$UserDictionarySettingsActivity">
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.UserDictionarySettings" />
- </activity-alias>
-
<activity
android:name="Settings$ZenModeSettingsActivity"
android:label="@string/zen_mode_settings_title"
</activity>
<activity
- android:name="Settings$ZenModeExternalRuleSettingsActivity"
- android:exported="true"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
- <intent-filter android:priority="1">
- <action android:name="android.settings.ZEN_MODE_EXTERNAL_RULE_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.notification.ZenModeExternalRuleSettings" />
- <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
- android:value="true" />
- </activity>
-
- <activity
android:name="Settings$DisplaySettingsActivity"
android:label="@string/display_settings"
android:icon="@drawable/ic_homepage_display"
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.applications.BackgroundCheckSummary" />
+ android:value="com.android.settings.applications.appops.BackgroundCheckSummary" />
</activity>
<activity
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.fuelgauge.BatterySaverSettings" />
+ android:value="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
<!-- [CHAR LIMIT=40] Zen mode settings: Delete rule dialog button caption -->
<string name="zen_mode_delete_rule_button">Delete</string>
- <!-- [CHAR LIMIT=40] Zen mode settings: External rule type -->
- <string name="zen_mode_rule_type">Rule type</string>
-
<!-- [CHAR LIMIT=40] Zen mode settings: External rule type name if unknown -->
<string name="zen_mode_rule_type_unknown">Unknown</string>
- <!-- [CHAR LIMIT=40] Zen mode settings: Configure external rule -->
- <string name="zen_mode_configure_rule">Configure rule</string>
-
<!-- [CHAR LIMIT=NONE] Zen mode behavior settings footer: footer describing why the user cannot change the current do not disturb behavior settings -->
<string name="zen_mode_app_set_behavior">These settings can\'t be changed right now. An app (<xliff:g id="app_name" example="Android Services">%1$s</xliff:g>) has automatically turned on Do Not Disturb with custom behavior."</string>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="zen_mode_external_rule_settings" >
-
- <!-- Rule name -->
- <Preference
- android:key="rule_name"
- android:title="@string/zen_mode_rule_name"
- android:persistent="false" />
-
- <!-- Rule type -->
- <Preference
- android:key="type"
- android:title="@string/zen_mode_rule_type"
- android:persistent="false" />
-
- <!-- Configure -->
- <Preference
- android:key="configure"
- android:title="@string/zen_mode_configure_rule"
- android:persistent="false" />
-
- <!-- Zen mode -->
- <DropDownPreference
- android:key="zen_mode"
- android:summary="%s"
- android:title="@string/zen_mode_settings_title" />
-
-</PreferenceScreen>
public static class ZenModeAutomationSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModeScheduleRuleSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModeEventRuleSettingsActivity extends SettingsActivity { /* empty */ }
- public static class ZenModeExternalRuleSettingsActivity extends SettingsActivity { /* empty */ }
public static class SoundSettingsActivity extends SettingsActivity { /* empty */ }
public static class ConfigureNotificationSettingsActivity extends SettingsActivity { /* empty */ }
public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
// Top level categories for new IA
public static class NetworkDashboardActivity extends SettingsActivity {}
public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
- public static class ConnectedDeviceDashboardActivityOld extends SettingsActivity {}
public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
public static class PowerUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ }
public static class AppAndNotificationDashboardActivity extends SettingsActivity {}
import com.android.settings.TestingSettings;
import com.android.settings.TetherSettings;
import com.android.settings.TrustedCredentialsSettings;
-import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
-import com.android.settings.wifi.calling.WifiCallingSettings;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
import com.android.settings.accessibility.CaptionPropertiesFragment;
import com.android.settings.applications.appinfo.PictureInPictureDetails;
import com.android.settings.applications.appinfo.PictureInPictureSettings;
import com.android.settings.applications.appinfo.WriteSettingsDetails;
+import com.android.settings.applications.appops.BackgroundCheckSummary;
import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
+import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
import com.android.settings.datausage.DataUsageList;
import com.android.settings.deviceinfo.PublicVolumeSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings;
+import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.display.NightDisplaySettings;
import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
-import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.PowerUsageSummaryLegacy;
+import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.gestures.AssistGestureSettings;
import com.android.settings.gestures.DoubleTapPowerSettings;
import com.android.settings.gestures.DoubleTapScreenSettings;
import com.android.settings.wifi.WifiAPITest;
import com.android.settings.wifi.WifiInfo;
import com.android.settings.wifi.WifiSettings;
+import com.android.settings.wifi.calling.WifiCallingSettings;
import com.android.settings.wifi.p2p.WifiP2pSettings;
public class SettingsGateway {
* security exception if the fragment it needs to display is not in this list.
*/
public static final String[] ENTRY_FRAGMENTS = {
+ AdvancedConnectedDeviceDashboardFragment.class.getName(),
WifiSettings.class.getName(),
ConfigureWifiSettings.class.getName(),
SavedAccessPointsWifiSettings.class.getName(),
SimSettings.class.getName(),
TetherSettings.class.getName(),
WifiP2pSettings.class.getName(),
+ BackgroundCheckSummary.class.getName(),
VpnSettings.class.getName(),
DateTimeSettings.class.getName(),
LocaleListEditor.class.getName(),
// Home page
Settings.NetworkDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivity.class.getName(),
- Settings.ConnectedDeviceDashboardActivityOld.class.getName(),
Settings.AppAndNotificationDashboardActivity.class.getName(),
Settings.DisplaySettingsActivity.class.getName(),
Settings.SoundSettingsActivity.class.getName(),
package com.android.settings.core;
+import static android.content.pm.PackageManager.GET_ACTIVITIES;
+import static android.content.pm.PackageManager.GET_META_DATA;
+import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
+import static com.android.settings.SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS;
+import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertFalse;
+
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.platform.test.annotations.Presubmit;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.text.TextUtils;
import android.util.Log;
import com.android.settings.core.gateway.SettingsGateway;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
-import static org.junit.Assert.assertFalse;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class SettingsGatewayTest {
private static final String TAG = "SettingsGatewayTest";
+ private Context mContext;
+ private PackageManager mPackageManager;
+ private String mPackageName;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mPackageManager = mContext.getPackageManager();
+ mPackageName = mContext.getPackageName();
+ }
+
@Test
+ @Presubmit
public void allRestrictedActivityMustBeDefinedInManifest() {
- final Context context = InstrumentationRegistry.getTargetContext();
- final PackageManager packageManager = context.getPackageManager();
- final String packageName = context.getPackageName();
for (String className : SettingsGateway.SETTINGS_FOR_RESTRICTED) {
final Intent intent = new Intent();
- intent.setComponent(new ComponentName(packageName, className));
- List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent,
- PackageManager.MATCH_DISABLED_COMPONENTS);
- Log.d(TAG, packageName + "/" + className + "; resolveInfo size: "
+ intent.setComponent(new ComponentName(mPackageName, className));
+ List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(intent,
+ MATCH_DISABLED_COMPONENTS);
+ Log.d(TAG, mPackageName + "/" + className + "; resolveInfo size: "
+ resolveInfos.size());
assertFalse(className + " is not-defined in manifest", resolveInfos.isEmpty());
}
}
+
+ @Test
+ @Presubmit
+ public void publicFragmentMustAppearInSettingsGateway()
+ throws PackageManager.NameNotFoundException {
+ final List<String> whitelistedFragment = new ArrayList<>();
+ final StringBuilder error = new StringBuilder();
+
+ for (String fragment : SettingsGateway.ENTRY_FRAGMENTS) {
+ whitelistedFragment.add(fragment);
+ }
+ final PackageInfo pi = mPackageManager.getPackageInfo(mPackageName,
+ GET_META_DATA | MATCH_DISABLED_COMPONENTS | GET_ACTIVITIES);
+ final List<ActivityInfo> activities = Arrays.asList(pi.activities);
+
+ for (ActivityInfo activity : activities) {
+ final Bundle metaData = activity.metaData;
+ if (metaData == null || !metaData.containsKey(META_DATA_KEY_FRAGMENT_CLASS)) {
+ continue;
+ }
+ final String fragmentName = metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
+
+ assertThat(fragmentName).isNotNull();
+ if (!whitelistedFragment.contains(fragmentName)) {
+ error.append("SettingsGateway.ENTRY_FRAGMENTS must contain " + fragmentName
+ + " because this fragment is used in manifest for " + activity.name)
+ .append("\n");
+ }
+ }
+ final String message = error.toString();
+ if (!TextUtils.isEmpty(message)) {
+ fail(message);
+ }
+ }
}