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:
@@ -716,15 +716,6 @@
|
||||
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"
|
||||
@@ -867,25 +858,6 @@
|
||||
android:value="true" />
|
||||
</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"
|
||||
@@ -1251,7 +1223,7 @@
|
||||
<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
|
||||
@@ -2248,7 +2220,7 @@
|
||||
<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>
|
||||
|
@@ -7410,15 +7410,9 @@
|
||||
<!-- [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>
|
||||
|
||||
|
@@ -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>
|
@@ -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 {}
|
||||
|
@@ -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(),
|
||||
|
@@ -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<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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user