Gateway whitelist AdvancedConnectedDeviceDashboardFragment

- Discovered a few more fragments that weren't whitelisted, so I
  whistlisted those as well.
- Also found ZenModeExternalRuleSettings is misconfigured in manifest
  and no longer needed, so deleted all artifacts about this activity.

Fixes: 74060141
Test:  atest
Change-Id: I159e403bfa6707e2939d075ecc2b8d2f13514153
This commit is contained in:
Fan Zhang
2018-03-01 09:49:34 -08:00
parent 14fa2df9f4
commit 747f0e14ef
6 changed files with 75 additions and 96 deletions

View File

@@ -716,15 +716,6 @@
android:value="true" /> android:value="true" />
</activity> </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 <activity
android:name="Settings$ZenModeSettingsActivity" android:name="Settings$ZenModeSettingsActivity"
android:label="@string/zen_mode_settings_title" android:label="@string/zen_mode_settings_title"
@@ -867,25 +858,6 @@
android:value="true" /> android:value="true" />
</activity> </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 <activity
android:name="Settings$DisplaySettingsActivity" android:name="Settings$DisplaySettingsActivity"
android:label="@string/display_settings" android:label="@string/display_settings"
@@ -1251,7 +1223,7 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <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>
<activity <activity
@@ -2248,7 +2220,7 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <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" <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" /> android:value="true" />
</activity> </activity>

View File

@@ -7410,15 +7410,9 @@
<!-- [CHAR LIMIT=40] Zen mode settings: Delete rule dialog button caption --> <!-- [CHAR LIMIT=40] Zen mode settings: Delete rule dialog button caption -->
<string name="zen_mode_delete_rule_button">Delete</string> <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 --> <!-- [CHAR LIMIT=40] Zen mode settings: External rule type name if unknown -->
<string name="zen_mode_rule_type_unknown">Unknown</string> <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 --> <!-- [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> <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>

View File

@@ -1,45 +0,0 @@
<?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>

View File

@@ -103,7 +103,6 @@ public class Settings extends SettingsActivity {
public static class ZenModeAutomationSettingsActivity extends SettingsActivity { /* empty */ } public static class ZenModeAutomationSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModeScheduleRuleSettingsActivity extends SettingsActivity { /* empty */ } public static class ZenModeScheduleRuleSettingsActivity extends SettingsActivity { /* empty */ }
public static class ZenModeEventRuleSettingsActivity 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 SoundSettingsActivity extends SettingsActivity { /* empty */ }
public static class ConfigureNotificationSettingsActivity extends SettingsActivity { /* empty */ } public static class ConfigureNotificationSettingsActivity extends SettingsActivity { /* empty */ }
public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ } public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
@@ -155,7 +154,6 @@ public class Settings extends SettingsActivity {
// Top level categories for new IA // Top level categories for new IA
public static class NetworkDashboardActivity extends SettingsActivity {} public static class NetworkDashboardActivity extends SettingsActivity {}
public static class ConnectedDeviceDashboardActivity extends SettingsActivity {} public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
public static class ConnectedDeviceDashboardActivityOld extends SettingsActivity {}
public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ } public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
public static class PowerUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ } public static class PowerUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ }
public static class AppAndNotificationDashboardActivity extends SettingsActivity {} public static class AppAndNotificationDashboardActivity extends SettingsActivity {}

View File

@@ -28,8 +28,6 @@ import com.android.settings.Settings;
import com.android.settings.TestingSettings; import com.android.settings.TestingSettings;
import com.android.settings.TetherSettings; import com.android.settings.TetherSettings;
import com.android.settings.TrustedCredentialsSettings; 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.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard; import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
import com.android.settings.accessibility.CaptionPropertiesFragment; import com.android.settings.accessibility.CaptionPropertiesFragment;
@@ -52,10 +50,12 @@ import com.android.settings.applications.appinfo.ExternalSourcesDetails;
import com.android.settings.applications.appinfo.PictureInPictureDetails; import com.android.settings.applications.appinfo.PictureInPictureDetails;
import com.android.settings.applications.appinfo.PictureInPictureSettings; import com.android.settings.applications.appinfo.PictureInPictureSettings;
import com.android.settings.applications.appinfo.WriteSettingsDetails; 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.assist.ManageAssist;
import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment; import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment; import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.usb.UsbDetailsFragment; import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
import com.android.settings.datausage.DataUsageList; import com.android.settings.datausage.DataUsageList;
@@ -69,13 +69,14 @@ import com.android.settings.deviceinfo.PrivateVolumeSettings;
import com.android.settings.deviceinfo.PublicVolumeSettings; import com.android.settings.deviceinfo.PublicVolumeSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment; import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings; import com.android.settings.deviceinfo.StorageSettings;
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.display.NightDisplaySettings; import com.android.settings.display.NightDisplaySettings;
import com.android.settings.dream.DreamSettings; import com.android.settings.dream.DreamSettings;
import com.android.settings.enterprise.EnterprisePrivacySettings; import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail; import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.fuelgauge.PowerUsageSummaryLegacy; import com.android.settings.fuelgauge.PowerUsageSummaryLegacy;
import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
import com.android.settings.gestures.AssistGestureSettings; import com.android.settings.gestures.AssistGestureSettings;
import com.android.settings.gestures.DoubleTapPowerSettings; import com.android.settings.gestures.DoubleTapPowerSettings;
import com.android.settings.gestures.DoubleTapScreenSettings; import com.android.settings.gestures.DoubleTapScreenSettings;
@@ -129,6 +130,7 @@ import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiAPITest; import com.android.settings.wifi.WifiAPITest;
import com.android.settings.wifi.WifiInfo; import com.android.settings.wifi.WifiInfo;
import com.android.settings.wifi.WifiSettings; import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.calling.WifiCallingSettings;
import com.android.settings.wifi.p2p.WifiP2pSettings; import com.android.settings.wifi.p2p.WifiP2pSettings;
public class SettingsGateway { public class SettingsGateway {
@@ -138,6 +140,7 @@ public class SettingsGateway {
* security exception if the fragment it needs to display is not in this list. * security exception if the fragment it needs to display is not in this list.
*/ */
public static final String[] ENTRY_FRAGMENTS = { public static final String[] ENTRY_FRAGMENTS = {
AdvancedConnectedDeviceDashboardFragment.class.getName(),
WifiSettings.class.getName(), WifiSettings.class.getName(),
ConfigureWifiSettings.class.getName(), ConfigureWifiSettings.class.getName(),
SavedAccessPointsWifiSettings.class.getName(), SavedAccessPointsWifiSettings.class.getName(),
@@ -145,6 +148,7 @@ public class SettingsGateway {
SimSettings.class.getName(), SimSettings.class.getName(),
TetherSettings.class.getName(), TetherSettings.class.getName(),
WifiP2pSettings.class.getName(), WifiP2pSettings.class.getName(),
BackgroundCheckSummary.class.getName(),
VpnSettings.class.getName(), VpnSettings.class.getName(),
DateTimeSettings.class.getName(), DateTimeSettings.class.getName(),
LocaleListEditor.class.getName(), LocaleListEditor.class.getName(),
@@ -257,7 +261,6 @@ public class SettingsGateway {
// Home page // Home page
Settings.NetworkDashboardActivity.class.getName(), Settings.NetworkDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivity.class.getName(), Settings.ConnectedDeviceDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivityOld.class.getName(),
Settings.AppAndNotificationDashboardActivity.class.getName(), Settings.AppAndNotificationDashboardActivity.class.getName(),
Settings.DisplaySettingsActivity.class.getName(), Settings.DisplaySettingsActivity.class.getName(),
Settings.SoundSettingsActivity.class.getName(), Settings.SoundSettingsActivity.class.getName(),

View File

@@ -16,44 +16,101 @@
package com.android.settings.core; 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.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.platform.test.annotations.Presubmit;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4; import android.support.test.runner.AndroidJUnit4;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.android.settings.core.gateway.SettingsGateway; import com.android.settings.core.gateway.SettingsGateway;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.junit.Assert.assertFalse;
@SmallTest @SmallTest
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class SettingsGatewayTest { public class SettingsGatewayTest {
private static final String TAG = "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 @Test
@Presubmit
public void allRestrictedActivityMustBeDefinedInManifest() { 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) { for (String className : SettingsGateway.SETTINGS_FOR_RESTRICTED) {
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, className)); intent.setComponent(new ComponentName(mPackageName, className));
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(intent,
PackageManager.MATCH_DISABLED_COMPONENTS); MATCH_DISABLED_COMPONENTS);
Log.d(TAG, packageName + "/" + className + "; resolveInfo size: " Log.d(TAG, mPackageName + "/" + className + "; resolveInfo size: "
+ resolveInfos.size()); + resolveInfos.size());
assertFalse(className + " is not-defined in manifest", resolveInfos.isEmpty()); 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);
}
}
} }