Merge "Rename setMobileDataPolicyEnabledStatus" into sc-dev
diff --git a/res/xml/app_info_settings_v2.xml b/res/xml/app_info_settings_v2.xml
new file mode 100644
index 0000000..805df59
--- /dev/null
+++ b/res/xml/app_info_settings_v2.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2021 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"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="installed_app_detail_settings_screen">
+
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="header_view"
+        android:layout="@layout/settings_entity_header"
+        android:selectable="false"
+        android:order="-10000"
+        settings:allowDividerBelow="true"/>
+
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="instant_app_buttons"
+        android:layout="@layout/instant_app_buttons"
+        android:selectable="false"
+        android:order="-9999"
+        settings:allowDividerAbove="true"
+        settings:allowDividerBelow="true"/>
+
+    <com.android.settingslib.widget.ActionButtonsPreference
+        android:key="action_buttons"
+        android:order="-9998" />
+
+    <!-- Add SpacePreference to draw divider -->
+    <com.android.settings.applications.SpacePreference
+        android:layout_height="0dp"
+        android:order="-9997"
+        settings:allowDividerAbove="true" />
+
+    <Preference
+        android:key="app_settings_link"
+        android:title="@string/app_settings_link"
+        settings:controller="com.android.settings.applications.appinfo.AppSettingPreferenceController" />
+
+    <Preference
+        android:key="notification_settings"
+        android:title="@string/notifications_label"
+        settings:controller="com.android.settings.applications.appinfo.AppNotificationPreferenceController" />
+
+    <com.android.settings.widget.FixedLineSummaryPreference
+        android:key="permission_settings"
+        android:title="@string/permissions_label"
+        android:summary="@string/summary_placeholder"
+        settings:summaryLineCount="1"
+        settings:controller="com.android.settings.applications.appinfo.AppPermissionPreferenceController" />
+
+    <Preference
+        android:key="storage_settings"
+        android:title="@string/storage_settings_for_app"
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.applications.appinfo.AppStoragePreferenceController" />
+
+    <com.android.settings.applications.AppDomainsPreference
+        android:key="instant_app_launch_supported_domain_urls"
+        android:title="@string/app_launch_supported_domain_urls_title"
+        android:selectable="true"
+        settings:controller="com.android.settings.applications.appinfo.InstantAppDomainsPreferenceController" />
+
+    <Preference
+        android:key="data_settings"
+        android:title="@string/data_usage_app_summary_title"
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.applications.appinfo.AppDataUsagePreferenceController" />
+
+    <Preference
+        android:key="time_spent_in_app"
+        android:title="@string/time_spent_in_app_pref_title"
+        settings:controller="com.android.settings.applications.appinfo.TimeSpentInAppPreferenceController" />
+
+    <Preference
+        android:key="battery"
+        android:title="@string/power_usage_summary_title"
+        android:summary="@string/summary_placeholder" />
+
+    <Preference
+        android:key="preferred_settings"
+        android:title="@string/launch_by_default"
+        android:summary="@string/summary_placeholder"
+        android:selectable="true"
+        settings:controller="com.android.settings.applications.appinfo.AppOpenByDefaultPreferenceController" />
+
+    <Preference
+        android:key="memory"
+        android:title="@string/memory_settings_title"
+        android:summary="@string/summary_placeholder"
+        android:enabled="false" />
+
+    <!-- Default apps shortcuts -->
+    <Preference
+        android:key="default_home"
+        android:title="@string/home_app"
+        android:summary="@string/summary_placeholder" />
+
+    <Preference
+        android:key="default_browser"
+        android:title="@string/default_browser_title"
+        android:summary="@string/summary_placeholder" />
+
+    <Preference
+        android:key="default_phone_app"
+        android:title="@string/default_phone_title"
+        android:summary="@string/default_phone_title" />
+
+    <Preference
+        android:key="default_emergency_app"
+        android:title="@string/default_emergency_app"
+        android:summary="@string/summary_placeholder" />
+
+    <Preference
+        android:key="default_sms_app"
+        android:title="@string/sms_application_title"
+        android:summary="@string/summary_placeholder" />
+
+    <!-- Advanced apps settings -->
+    <PreferenceCategory
+        android:key="advanced_app_info"
+        android:title="@string/advanced_apps"
+        settings:controller="com.android.settings.applications.appinfo.AdvancedAppInfoPreferenceCategoryController">
+
+        <Preference
+            android:key="system_alert_window"
+            android:title="@string/draw_overlay"
+            android:summary="@string/summary_placeholder"
+            settings:controller="com.android.settings.applications.appinfo.DrawOverlayDetailPreferenceController" />
+
+        <Preference
+            android:key="write_settings_apps"
+            android:title="@string/write_settings"
+            android:summary="@string/summary_placeholder"
+            settings:controller="com.android.settings.applications.appinfo.WriteSystemSettingsPreferenceController" />
+
+        <Preference
+            android:key="picture_in_picture"
+            android:title="@string/picture_in_picture_app_detail_title"
+            android:summary="@string/summary_placeholder"
+            settings:controller="com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetailPreferenceController" />
+
+        <Preference
+            android:key="install_other_apps"
+            android:title="@string/install_other_apps"
+            android:summary="@string/summary_placeholder"
+            settings:controller="com.android.settings.applications.appinfo.ExternalSourceDetailPreferenceController" />
+
+        <Preference
+            android:key="interact_across_profiles"
+            android:title="@string/interact_across_profiles_title"
+            android:summary="@string/summary_placeholder"
+            settings:controller="com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetailsPreferenceController" />
+
+    </PreferenceCategory>
+
+    <!-- App installer info -->
+    <PreferenceCategory
+        android:key="app_installer"
+        android:title="@string/app_install_details_group_title"
+        settings:controller="com.android.settings.applications.appinfo.AppInstallerPreferenceCategoryController">
+
+        <Preference
+            android:key="app_info_store"
+            android:title="@string/app_install_details_title"
+            settings:controller="com.android.settings.applications.appinfo.AppInstallerInfoPreferenceController" />
+
+    </PreferenceCategory>
+
+    <Preference
+        android:key="app_version"
+        android:selectable="false"
+        android:order="9999"
+        settings:controller="com.android.settings.applications.appinfo.AppVersionPreferenceController"
+        settings:allowDividerAbove="true"
+        settings:enableCopying="true"/>
+
+</PreferenceScreen>
diff --git a/res/xml/app_storage_settings.xml b/res/xml/app_storage_settings.xml
index 376f09e..6092dbb 100644
--- a/res/xml/app_storage_settings.xml
+++ b/res/xml/app_storage_settings.xml
@@ -42,7 +42,7 @@
     <PreferenceCategory
         android:key="storage_category"
         android:title="@string/app_info_storage_title"
-        settings:allowDividerBelow="false">
+        settings:allowDividerAbove="true">
 
         <Preference
             android:key="app_size"
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 945ceed..95c1038 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -31,7 +31,8 @@
         android:order="-9999"/>
 
     <PreferenceCategory
-        android:title="@string/battery_detail_manage_title">
+        android:title="@string/battery_detail_manage_title"
+        settings:allowDividerAbove="true">
 
         <com.android.settingslib.RestrictedPreference
             android:key="background_activity"
diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java
index 625369e..0b6f16a 100644
--- a/src/com/android/settings/ProxySelector.java
+++ b/src/com/android/settings/ProxySelector.java
@@ -41,6 +41,7 @@
 
 import androidx.appcompat.app.AlertDialog;
 
+import com.android.net.module.util.ProxyUtils;
 import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
 import com.android.settings.core.InstrumentedFragment;
 
@@ -151,7 +152,7 @@
         if (proxy != null) {
             hostname = proxy.getHost();
             port = proxy.getPort();
-            exclList = proxy.getExclusionListAsString();
+            exclList = ProxyUtils.exclusionListAsString(proxy.getExclusionList());
         }
 
         if (hostname == null) {
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 6817bd6..f584408 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -35,6 +35,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -48,6 +49,7 @@
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetailsPreferenceController;
 import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetailPreferenceController;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -245,6 +247,9 @@
 
     @Override
     protected int getPreferenceScreenResId() {
+        if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
+            return R.xml.app_info_settings_v2;
+        }
         return R.xml.app_info_settings;
     }
 
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index a90c886..b518646 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -158,7 +158,7 @@
             screen.addPreference(pref);
         }
 
-        if (isScreenAttentionAvailable()) {
+        if (isScreenAttentionAvailable(getContext())) {
             mAdaptiveSleepPermissionController.addToScreen(screen);
             mAdaptiveSleepController.addToScreen(screen);
             screen.addPreference(mPrivacyPreference);
@@ -199,11 +199,6 @@
         return R.string.help_url_adaptive_sleep;
     }
 
-    private boolean isScreenAttentionAvailable() {
-        return getResources().getBoolean(
-                com.android.internal.R.bool.config_adaptive_sleep_available);
-    }
-
     private Long getMaxScreenTimeout(Context context) {
         if (context == null) {
             return Long.MAX_VALUE;
@@ -239,6 +234,11 @@
         }
     }
 
+    private static boolean isScreenAttentionAvailable(Context context) {
+        return context.getResources().getBoolean(
+                com.android.internal.R.bool.config_adaptive_sleep_available);
+    }
+
     private static class TimeoutCandidateInfo extends CandidateInfo {
         private final CharSequence mLabel;
         private final String mKey;
@@ -269,11 +269,13 @@
             new BaseSearchIndexProvider(R.xml.screen_timeout_settings) {
                 public List<SearchIndexableRaw> getRawDataToIndex(Context context,
                         boolean enabled) {
+                    if (!isScreenAttentionAvailable(context)) {
+                        return null;
+                    }
                     final Resources res = context.getResources();
                     final SearchIndexableRaw data = new SearchIndexableRaw(context);
                     data.title = res.getString(R.string.adaptive_sleep_title);
                     data.key = AdaptiveSleepPreferenceController.PREFERENCE_KEY;
-                    data.screenTitle = res.getString(R.string.screen_timeout_title);
                     data.keywords = res.getString(R.string.adaptive_sleep_title);
 
                     final List<SearchIndexableRaw> result = new ArrayList<>(1);
diff --git a/src/com/android/settings/security/CredentialStorage.java b/src/com/android/settings/security/CredentialStorage.java
index 2e3e2ed..53a1a59 100644
--- a/src/com/android/settings/security/CredentialStorage.java
+++ b/src/com/android/settings/security/CredentialStorage.java
@@ -44,6 +44,7 @@
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
+import com.android.settings.core.HideNonSystemOverlayMixin;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.vpn2.VpnUtils;
 
@@ -75,6 +76,7 @@
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
         mUtils = new LockPatternUtils(this);
+        getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
     }
 
     @Override
diff --git a/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java b/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
index 563b4ef..f2c7c65 100644
--- a/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
+++ b/src/com/android/settings/sim/receivers/SimSlotChangeReceiver.java
@@ -52,10 +52,9 @@
         ThreadUtils.postOnBackgroundThread(
                 () -> {
                     synchronized (mLock) {
-                        if (!shouldHandleSlotChange(context)) {
-                            return;
+                        if (shouldHandleSlotChange(context)) {
+                            mSlotChangeHandler.onSlotsStatusChange(context.getApplicationContext());
                         }
-                        mSlotChangeHandler.onSlotsStatusChange(context.getApplicationContext());
                     }
                     ThreadUtils.postOnMainThread(pendingResult::finish);
                 });
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index cfee53c..65e45b7 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -67,6 +67,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.net.module.util.ProxyUtils;
 import com.android.settings.ProxySelector;
 import com.android.settings.R;
 import com.android.settings.network.SubscriptionUtil;
@@ -1408,7 +1409,8 @@
                 if (proxyProperties != null) {
                     mProxyHostView.setText(proxyProperties.getHost());
                     mProxyPortView.setText(Integer.toString(proxyProperties.getPort()));
-                    mProxyExclusionListView.setText(proxyProperties.getExclusionListAsString());
+                    mProxyExclusionListView.setText(
+                            ProxyUtils.exclusionListAsString(proxyProperties.getExclusionList()));
                 }
             }
         } else if (mProxySettingsSpinner.getSelectedItemPosition() == PROXY_PAC) {
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 62f2352..49f1b21 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -65,6 +65,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.net.module.util.ProxyUtils;
 import com.android.settings.ProxySelector;
 import com.android.settings.R;
 import com.android.settings.network.SubscriptionUtil;
@@ -1372,7 +1373,8 @@
                 if (proxyProperties != null) {
                     mProxyHostView.setText(proxyProperties.getHost());
                     mProxyPortView.setText(Integer.toString(proxyProperties.getPort()));
-                    mProxyExclusionListView.setText(proxyProperties.getExclusionListAsString());
+                    mProxyExclusionListView.setText(
+                            ProxyUtils.exclusionListAsString(proxyProperties.getExclusionList()));
                 }
             }
         } else if (mProxySettingsSpinner.getSelectedItemPosition() == PROXY_PAC) {
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index ada4c0e..89f8449 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -37,6 +37,7 @@
 
 import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowUserManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -46,11 +47,13 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowUserManager.class)
 public class SettingsActivityTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java b/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
index 80f21fc..02b318f 100644
--- a/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AvatarViewMixinTest.java
@@ -43,6 +43,7 @@
 
 import com.android.settings.homepage.SettingsHomepageActivity;
 import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest;
+import com.android.settings.testutils.shadow.ShadowUserManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -61,6 +62,7 @@
 import org.robolectric.shadows.ShadowPackageManager;
 
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowUserManager.class)
 public class AvatarViewMixinTest {
     private static final String FAKE_ACCOUNT = "test@domain.com";
     private static final String FAKE_DOMAIN = "domain.com";
diff --git a/tests/robotests/src/com/android/settings/accounts/TopLevelAccountEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/TopLevelAccountEntryPreferenceControllerTest.java
index 1cd5fb1..3a67d7f 100644
--- a/tests/robotests/src/com/android/settings/accounts/TopLevelAccountEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/TopLevelAccountEntryPreferenceControllerTest.java
@@ -48,15 +48,12 @@
         mController = new TopLevelAccountEntryPreferenceController(mContext, "test_key");
         LABELS = ShadowAuthenticationHelper.getLabels();
         TYPES = ShadowAuthenticationHelper.getTypes();
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @After
     public void tearDown() {
         ShadowAuthenticationHelper.reset();
-
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
index b6ef32c..a662be8 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
@@ -35,8 +35,10 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.util.FeatureFlagUtils;
 
 import com.android.settings.R;
+import com.android.settings.core.FeatureFlags;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -81,6 +83,7 @@
         when(mBackupManager.getCurrentTransport()).thenReturn("test_transport");
         mBackupSettingsHelper = new BackupSettingsHelper(mContext);
         mUserManager = Shadow.extract(mContext.getSystemService(Context.USER_SERVICE));
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
index 232bc16..b1f9ed1 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
@@ -27,7 +27,6 @@
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -47,13 +46,7 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mController = new TopLevelConnectedDevicesPreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index a0024c0..1e6bc41 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -77,7 +77,6 @@
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.TileUtils;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -147,13 +146,7 @@
                 .thenReturn(new ResolveInfo());
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mImpl = new DashboardFeatureProviderImpl(mContext);
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java
index e19066a..7e6be9b 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import com.android.settings.core.FeatureFlags;
 import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,13 +68,7 @@
         when(mStorageManagerVolumeProvider.getVolumes()).thenReturn(mVolumes);
 
         mController = new TopLevelStoragePreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
index 16c77a4..d20beab 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
@@ -27,7 +27,6 @@
 
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,13 +43,7 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mController = new TopLevelAboutDevicePreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void teardown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
index 621ddfa..efc45e0 100644
--- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
@@ -87,6 +87,7 @@
                 com.android.internal.R.bool.config_adaptive_sleep_available);
 
         doReturn(null).when(mContext).getSystemService(DevicePolicyManager.class);
+        doReturn(mResources).when(mContext).getResources();
 
         doReturn(mResources).when(mSettings).getResources();
         doReturn(mContext).when(mSettings).getContext();
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
index a52ad71..864d2b9 100644
--- a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
@@ -36,7 +36,6 @@
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,13 +65,7 @@
         when(mContext.getString(R.string.config_wallpaper_picker_class)).thenReturn("cls");
 
         mController = new TopLevelDisplayPreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 6d2298b..f2677ce 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -27,7 +27,6 @@
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,13 +43,7 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mController = new TopLevelBatteryPreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
index 1e84207..df1dfd0 100644
--- a/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
@@ -28,10 +28,12 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.provider.Settings;
+import android.util.FeatureFlagUtils;
 
 import androidx.preference.Preference;
 
 import com.android.settings.R;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -65,6 +67,7 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest();
         mController = new GesturesSettingPreferenceController(mActivity);
+        FeatureFlagUtils.setEnabled(RuntimeEnvironment.application, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index bae4432..40315d2 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -26,11 +26,13 @@
 import static org.mockito.Mockito.when;
 
 import android.os.Build;
+import android.util.FeatureFlagUtils;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 
 import com.android.settings.R;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.HideNonSystemOverlayMixin;
 import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest;
 
@@ -41,6 +43,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
@@ -51,6 +54,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        FeatureFlagUtils.setEnabled(RuntimeEnvironment.application, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java
index 2fa7413..f5bc961 100644
--- a/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java
@@ -25,7 +25,6 @@
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,13 +43,7 @@
         mContext = RuntimeEnvironment.application;
         mController = new TopLevelLocationPreferenceController(mContext, PREFERENCE_KEY);
         mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/network/TopLevelNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/TopLevelNetworkEntryPreferenceControllerTest.java
index 857b3eb..fc01c68 100644
--- a/tests/robotests/src/com/android/settings/network/TopLevelNetworkEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/TopLevelNetworkEntryPreferenceControllerTest.java
@@ -74,15 +74,12 @@
                 mMobileNetworkPreferenceController);
         ReflectionHelpers.setField(mController, "mTetherPreferenceController",
                 mTetherPreferenceController);
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @After
     public void tearDown() {
         ShadowUtils.reset();
-
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
index 03ce25a..634b9a8 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -45,6 +45,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings.Global;
+import android.util.FeatureFlagUtils;
 
 import androidx.annotation.Nullable;
 import androidx.preference.Preference;
@@ -53,6 +54,7 @@
 import com.android.internal.widget.LockscreenCredential;
 import com.android.settings.R;
 import com.android.settings.biometrics.BiometricEnrollBase;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
 import com.android.settings.search.SearchFeatureProvider;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
@@ -68,6 +70,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowPersistentDataBlockManager;
@@ -90,6 +93,7 @@
     public void setUp() {
         Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1);
         mFragment = new ChooseLockGenericFragment();
+        FeatureFlagUtils.setEnabled(RuntimeEnvironment.application, FeatureFlags.SILKY_HOME, false);
     }
 
     @After
diff --git a/tests/robotests/src/com/android/settings/security/TopLevelSecurityEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/TopLevelSecurityEntryPreferenceControllerTest.java
index 33d22d4..05abc40 100644
--- a/tests/robotests/src/com/android/settings/security/TopLevelSecurityEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/TopLevelSecurityEntryPreferenceControllerTest.java
@@ -30,7 +30,6 @@
 import com.android.settings.R;
 import com.android.settings.core.FeatureFlags;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,13 +57,7 @@
         when(mContext.getSystemService(Context.FACE_SERVICE))
                 .thenReturn(mFaceManager);
         mController = new TopLevelSecurityEntryPreferenceController(mContext, "test_key");
-    }
-
-    @After
-    public void tearDown() {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
-            FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
-        }
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
index 0d34a76..e80e77a 100644
--- a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
@@ -21,8 +21,10 @@
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.util.FeatureFlagUtils;
 
 import com.android.settings.R;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 
 import org.junit.Before;
@@ -47,6 +49,7 @@
         mContext = RuntimeEnvironment.application;
         mController = new ResetPreferenceController(mContext, KEY_RESET_DASHBOARD);
         mShadowUserManager = ShadowUserManager.getShadow();
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, false);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
similarity index 74%
rename from tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
rename to tests/unit/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
index dbfd3b2..5827516 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 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.
@@ -19,8 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertNull;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -35,11 +33,16 @@
 import android.telephony.ims.ImsMmTelManager;
 
 import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.internal.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.network.ims.MockWifiCallingQueryImsState;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 
 import org.junit.Before;
 import org.junit.Ignore;
@@ -47,62 +50,57 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
 public class WifiCallingPreferenceControllerTest {
     private static final int SUB_ID = 2;
-
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
     @Mock
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
     private TelephonyManager mTelephonyManager;
     @Mock
     private ImsMmTelManager mImsMmTelManager;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
+
+    private PreferenceScreen mScreen;
+    private PreferenceManager mPreferenceManager;
 
     private MockWifiCallingQueryImsState mQueryImsState;
 
-    private WifiCallingPreferenceController mController;
+    private TestWifiCallingPreferenceController mController;
     private Preference mPreference;
     private Context mContext;
     private PersistableBundle mCarrierConfig;
 
     @Before
+    @UiThreadTest
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = spy(RuntimeEnvironment.application);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
 
         mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID);
         mQueryImsState.setIsEnabledByUser(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
 
-        mPreference = new Preference(mContext);
-        mController = spy(new WifiCallingPreferenceController(mContext, "wifi_calling") {
-            @Override
-            protected ImsMmTelManager getImsMmTelManager(int subId) {
-                return mImsMmTelManager;
-            }
-        });
+        mController = new TestWifiCallingPreferenceController(mContext, "wifi_calling");
         mController.mCarrierConfigManager = mCarrierConfigManager;
         mController.init(SUB_ID);
         mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
-        doReturn(mQueryImsState).when(mController).queryImsState(anyInt());
-        mPreference.setKey(mController.getPreferenceKey());
-
-        when(mController.getTelephonyManager(mContext, SUB_ID)).thenReturn(mTelephonyManager);
-
         mCarrierConfig = new PersistableBundle();
         when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
 
-        when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
-                mPreference);
+        mPreferenceManager = new PreferenceManager(mContext);
+        mScreen = mPreferenceManager.createPreferenceScreen(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(mController.getPreferenceKey());
+        mScreen.addPreference(mPreference);
     }
 
     @Test
+    @UiThreadTest
     public void updateState_noSimCallManager_setCorrectSummary() {
         mController.mSimCallManager = null;
         mQueryImsState.setIsEnabledByUser(true);
@@ -118,6 +116,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void updateState_notCallIdle_disable() {
         mController.mCallState = TelephonyManager.CALL_STATE_RINGING;
 
@@ -127,6 +126,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void updateState_invalidPhoneAccountHandle_shouldNotCrash() {
         mController.mSimCallManager = new PhoneAccountHandle(null /* invalid */, "");
 
@@ -135,6 +135,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void updateState_wfcNonRoamingByConfig() {
         assertNull(mController.mSimCallManager);
         mCarrierConfig.putBoolean(
@@ -154,6 +155,7 @@
     }
 
     @Test
+    @UiThreadTest
     public void updateState_wfcRoamingByConfig() {
         assertNull(mController.mSimCallManager);
         // useWfcHomeModeForRoaming is false by default. In order to check wfc in roaming mode. We
@@ -171,12 +173,15 @@
     }
 
     @Test
+    @UiThreadTest
     public void displayPreference_notAvailable_setPreferenceInvisible() {
         mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
 
-        mController.displayPreference(mPreferenceScreen);
+        mController.displayPreference(mScreen);
 
-        assertThat(mPreferenceScreen.isVisible()).isFalse();
+        assertThat(mController.getPreferenceKey()).isEqualTo("wifi_calling");
+        assertThat(mScreen.findPreference(mController.getPreferenceKey()).isVisible()).isFalse();
     }
 
     @Test
@@ -184,16 +189,39 @@
     public void displayPreference_available_setsSubscriptionIdOnIntent() {
         final Intent intent = new Intent();
         mPreference.setIntent(intent);
-        mController.displayPreference(mPreferenceScreen);
+        mController.displayPreference(mScreen);
         assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID,
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isEqualTo(SUB_ID);
     }
 
     @Test
+    @UiThreadTest
     public void getAvailabilityStatus_noWiFiCalling_shouldReturnUnsupported() {
         mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(null);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.UNSUPPORTED_ON_DEVICE);
     }
+
+    private class TestWifiCallingPreferenceController extends WifiCallingPreferenceController {
+        TestWifiCallingPreferenceController(Context context, String preferenceKey) {
+            super(context, preferenceKey);
+        }
+
+        @Override
+        protected ImsMmTelManager getImsMmTelManager(int subId) {
+            return mImsMmTelManager;
+        }
+
+        @Override
+        protected TelephonyManager getTelephonyManager(Context context, int subId) {
+            return mTelephonyManager;
+        }
+
+        @Override
+        protected WifiCallingQueryImsState queryImsState(int subId) {
+            return mQueryImsState;
+        }
+    }
 }