From 747f0e14ef9dad0130d633462b241c8134c02ad1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 1 Mar 2018 09:49:34 -0800 Subject: [PATCH] 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 --- AndroidManifest.xml | 32 +------- res/values/strings.xml | 6 -- res/xml/zen_mode_external_rule_settings.xml | 45 ----------- src/com/android/settings/Settings.java | 2 - .../core/gateway/SettingsGateway.java | 11 ++- .../settings/core/SettingsGatewayTest.java | 75 ++++++++++++++++--- 6 files changed, 75 insertions(+), 96 deletions(-) delete mode 100644 res/xml/zen_mode_external_rule_settings.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2795ba1ab2d..dbe231b5255 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -716,15 +716,6 @@ android:value="true" /> - - - - - - - - - - - - - - - - - - + android:value="com.android.settings.applications.appops.BackgroundCheckSummary" /> + android:value="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index e7c7bba0c09..5d551aac1a5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7410,15 +7410,9 @@ Delete - - Rule type - Unknown - - Configure rule - These settings can\'t be changed right now. An app (%1$s) has automatically turned on Do Not Disturb with custom behavior." diff --git a/res/xml/zen_mode_external_rule_settings.xml b/res/xml/zen_mode_external_rule_settings.xml deleted file mode 100644 index 0869cb03b71..00000000000 --- a/res/xml/zen_mode_external_rule_settings.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index b5435812b93..96e0e4a5b5c 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -103,7 +103,6 @@ public class Settings extends SettingsActivity { 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 */ } @@ -155,7 +154,6 @@ public class Settings extends SettingsActivity { // 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 {} diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 51e151ebeff..f9c78479c16 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -28,8 +28,6 @@ import com.android.settings.Settings; 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; @@ -52,10 +50,12 @@ import com.android.settings.applications.appinfo.ExternalSourcesDetails; 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; @@ -69,13 +69,14 @@ import com.android.settings.deviceinfo.PrivateVolumeSettings; 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; @@ -129,6 +130,7 @@ import com.android.settings.wifi.SavedAccessPointsWifiSettings; 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 { @@ -138,6 +140,7 @@ 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(), @@ -145,6 +148,7 @@ public class SettingsGateway { SimSettings.class.getName(), TetherSettings.class.getName(), WifiP2pSettings.class.getName(), + BackgroundCheckSummary.class.getName(), VpnSettings.class.getName(), DateTimeSettings.class.getName(), LocaleListEditor.class.getName(), @@ -257,7 +261,6 @@ public class SettingsGateway { // 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(), diff --git a/tests/unit/src/com/android/settings/core/SettingsGatewayTest.java b/tests/unit/src/com/android/settings/core/SettingsGatewayTest.java index abce2c8e616..ed49b2e3335 100644 --- a/tests/unit/src/com/android/settings/core/SettingsGatewayTest.java +++ b/tests/unit/src/com/android/settings/core/SettingsGatewayTest.java @@ -16,44 +16,101 @@ 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 resolveInfos = packageManager.queryIntentActivities(intent, - PackageManager.MATCH_DISABLED_COMPONENTS); - Log.d(TAG, packageName + "/" + className + "; resolveInfo size: " + intent.setComponent(new ComponentName(mPackageName, className)); + List 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 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 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); + } + } }