OSDN Git Service

Gateway whitelist AdvancedConnectedDeviceDashboardFragment
authorFan Zhang <zhfan@google.com>
Thu, 1 Mar 2018 17:49:34 +0000 (09:49 -0800)
committerFan Zhang <zhfan@google.com>
Thu, 1 Mar 2018 21:17:21 +0000 (13:17 -0800)
- 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
res/values/strings.xml
res/xml/zen_mode_external_rule_settings.xml [deleted file]
src/com/android/settings/Settings.java
src/com/android/settings/core/gateway/SettingsGateway.java
tests/unit/src/com/android/settings/core/SettingsGatewayTest.java

index 2795ba1..dbe231b 100644 (file)
                 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>
index e7c7bba..5d551aa 100644 (file)
     <!-- [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>
 
diff --git a/res/xml/zen_mode_external_rule_settings.xml b/res/xml/zen_mode_external_rule_settings.xml
deleted file mode 100644 (file)
index 0869cb0..0000000
+++ /dev/null
@@ -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>
index b543581..96e0e4a 100644 (file)
@@ -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 {}
index 51e151e..f9c7847 100644 (file)
@@ -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(),
index abce2c8..ed49b2e 100644 (file)
 
 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);
+        }
+    }
 }