diff --git a/res/values/strings.xml b/res/values/strings.xml
index c23abe9..9a56264 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8806,6 +8806,9 @@
     <!-- [CHAR LIMIT=NONE] App notification settings: link to app notification settings-->
     <string name="app_settings_link">Additional settings in the app</string>
 
+    <!-- [CHAR LIMIT=NONE] Apps & notification settings: summary on the link to notification settings-->
+    <string name="notification_screen_summary">Notification history, bubbles, recently sent</string>
+
     <!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
     <string name="app_notification_listing_summary_zero">On for all apps</string>
     <!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
@@ -11319,6 +11322,10 @@
     <string name="platform_compat_default_disabled_title">Default disabled changes</string>
     <!-- Title for target SDK gated app compat changes category (do not translate 'targetSdkVersion') [CHAR LIMIT=50] -->
     <string name="platform_compat_target_sdk_title">Enabled for targetSdkVersion &gt; <xliff:g id="number" example="29">%d</xliff:g></string>
+    <!-- Title for the dialog shown when no debuggable apps are available [CHAR LIMIT=20] -->
+    <string name="platform_compat_dialog_title_no_apps">No apps available</string>
+    <!-- Explanatory text shown when no debuggable apps are available [CHAR LIMIT=NONE] -->
+    <string name="platform_compat_dialog_text_no_apps">App compatibility changes can only be modified for debuggable apps. Install a debuggable app and try again.</string>
 
     <!-- Slices Strings -->
 
diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml
index 98b9844..bd2e85c 100644
--- a/res/xml/app_and_notification.xml
+++ b/res/xml/app_and_notification.xml
@@ -57,9 +57,9 @@
     <Preference
         android:key="configure_notification_settings"
         android:title="@string/configure_notification_settings"
+        android:summary="@string/notification_screen_summary"
         android:order="-440"
-        android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
-        settings:controller="com.android.settings.notification.ConfigureNotificationPreferenceController"/>
+        android:fragment="com.android.settings.notification.ConfigureNotificationSettings"/>
 
     <!-- Notifications (appears before manage_perms), default apps (appears after) -->
     <PreferenceCategory
diff --git a/src/com/android/settings/accessibility/BalanceSeekBar.java b/src/com/android/settings/accessibility/BalanceSeekBar.java
index b108e18..ecc226b 100644
--- a/src/com/android/settings/accessibility/BalanceSeekBar.java
+++ b/src/com/android/settings/accessibility/BalanceSeekBar.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.Utils.isNightMode;
+
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
@@ -113,8 +115,7 @@
                 res.getDimensionPixelSize(R.dimen.balance_seekbar_center_marker_width),
                 res.getDimensionPixelSize(R.dimen.balance_seekbar_center_marker_height));
         mCenterMarkerPaint = new Paint();
-        // TODO use a more suitable colour?
-        mCenterMarkerPaint.setColor(Color.BLACK);
+        mCenterMarkerPaint.setColor(isNightMode(context) ? Color.WHITE : Color.BLACK);
         mCenterMarkerPaint.setStyle(Paint.Style.FILL);
         // Remove the progress colour
         setProgressTintList(ColorStateList.valueOf(Color.TRANSPARENT));
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index c1ee545..a493ae0 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -323,16 +323,18 @@
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return isAvailable(context);
+                    if (isAvailable(context)) {
+                        return hasEnrolledBiometrics(context);
+                    }
+
+                    return false;
                 }
 
                 @Override
                 public List<String> getNonIndexableKeys(Context context) {
                     final List<String> keys = super.getNonIndexableKeys(context);
                     if (isAvailable(context)) {
-                        final FaceManager faceManager = context.getSystemService(FaceManager.class);
-                        final boolean hasEnrolled = faceManager.hasEnrolledTemplates(
-                                UserHandle.myUserId());
+                        final boolean hasEnrolled = hasEnrolledBiometrics(context);
                         keys.add(hasEnrolled ? PREF_KEY_ENROLL_FACE_UNLOCK
                                 : PREF_KEY_DELETE_FACE_DATA);
                     }
@@ -353,5 +355,13 @@
                     }
                     return isAttentionSupported;
                 }
+
+                private boolean hasEnrolledBiometrics(Context context) {
+                    final FaceManager faceManager = Utils.getFaceManagerOrNull(context);
+                    if (faceManager != null) {
+                        return faceManager.hasEnrolledTemplates(UserHandle.myUserId());
+                    }
+                    return false;
+                }
             };
 }
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 331e572..d2ad30d 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -29,5 +29,4 @@
     public static final String CONTROLLER_ENHANCEMENT = "settings_controller_loading_enhancement";
     public static final String CONDITIONAL_CARDS = "settings_conditionals";
     public static final String TETHER_ALL_IN_ONE = "settings_tether_all_in_one";
-    public static final String CONTEXTUAL_HOME2 = "settings_contextual_home2";
 }
diff --git a/src/com/android/settings/development/AppPicker.java b/src/com/android/settings/development/AppPicker.java
index 8e927db..51215a1 100644
--- a/src/com/android/settings/development/AppPicker.java
+++ b/src/com/android/settings/development/AppPicker.java
@@ -47,10 +47,14 @@
             = "com.android.settings.extra.REQUESTIING_PERMISSION";
     public static final String EXTRA_DEBUGGABLE = "com.android.settings.extra.DEBUGGABLE";
     public static final String EXTRA_NON_SYSTEM = "com.android.settings.extra.NON_SYSTEM";
+    public static final String EXTRA_INCLUDE_NOTHING = "com.android.settings.extra.INCLUDE_NOTHING";
+
+    public static final int RESULT_NO_MATCHING_APPS = -2;
 
     private String mPermissionName;
     private boolean mDebuggableOnly;
     private boolean mNonSystemOnly;
+    private boolean mIncludeNothing;
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -60,9 +64,11 @@
         mPermissionName = getIntent().getStringExtra(EXTRA_REQUESTIING_PERMISSION);
         mDebuggableOnly = getIntent().getBooleanExtra(EXTRA_DEBUGGABLE, false);
         mNonSystemOnly = getIntent().getBooleanExtra(EXTRA_NON_SYSTEM, false);
+        mIncludeNothing = getIntent().getBooleanExtra(EXTRA_INCLUDE_NOTHING, true);
 
         mAdapter = new AppListAdapter(this);
         if (mAdapter.getCount() <= 0) {
+            setResult(RESULT_NO_MATCHING_APPS);
             finish();
         } else {
             setListAdapter(mAdapter);
@@ -160,9 +166,11 @@
                 mPackageInfoList.add(info);
             }
             Collections.sort(mPackageInfoList, sDisplayNameComparator);
-            MyApplicationInfo info = new MyApplicationInfo();
-            info.label = context.getText(R.string.no_application);
-            mPackageInfoList.add(0, info);
+            if (mIncludeNothing) {
+                MyApplicationInfo info = new MyApplicationInfo();
+                info.label = context.getText(R.string.no_application);
+                mPackageInfoList.add(0, info);
+            }
             addAll(mPackageInfoList);
         }
 
diff --git a/src/com/android/settings/development/compat/PlatformCompatDashboard.java b/src/com/android/settings/development/compat/PlatformCompatDashboard.java
index 2f2c750..fe64948 100644
--- a/src/com/android/settings/development/compat/PlatformCompatDashboard.java
+++ b/src/com/android/settings/development/compat/PlatformCompatDashboard.java
@@ -20,6 +20,7 @@
 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_COMPAT_CHANGE_APP;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.settings.SettingsEnums;
 import android.compat.Compatibility.ChangeConfig;
 import android.content.Context;
@@ -124,6 +125,14 @@
                 } catch (PackageManager.NameNotFoundException e) {
                     startAppPicker();
                 }
+            } else if (resultCode == AppPicker.RESULT_NO_MATCHING_APPS) {
+                new AlertDialog.Builder(getContext())
+                        .setTitle(R.string.platform_compat_dialog_title_no_apps)
+                        .setMessage(R.string.platform_compat_dialog_text_no_apps)
+                        .setPositiveButton(R.string.okay, (dialog, which) -> finish())
+                        .setOnDismissListener(dialog -> finish())
+                        .setCancelable(false)
+                        .show();
             }
             return;
         }
@@ -254,7 +263,8 @@
     }
 
     private void startAppPicker() {
-        final Intent intent = new Intent(getContext(), AppPicker.class);
+        final Intent intent = new Intent(getContext(), AppPicker.class)
+                .putExtra(AppPicker.EXTRA_INCLUDE_NOTHING, false);
         // If build is neither userdebug nor eng, only include debuggable apps
         final boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
         if (!debuggableBuild) {
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index fc666ec..ac35017 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -19,14 +19,11 @@
 import static com.android.settings.homepage.contextualcards.ContextualCardLoader.CARD_CONTENT_LOADER_ID;
 import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.STICKY_VALUE;
 import static com.android.settings.intelligence.ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE;
-import static com.android.settings.slices.CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI;
-import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI;
 
 import static java.util.stream.Collectors.groupingBy;
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.net.Uri;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.text.format.DateUtils;
@@ -55,7 +52,6 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -85,8 +81,6 @@
     static final String KEY_CONTEXTUAL_CARDS = "key_contextual_cards";
 
     private static final String TAG = "ContextualCardManager";
-    private static final List<Uri> STICKY_CARDS =
-            Arrays.asList(CONTEXTUAL_WIFI_SLICE_URI, BLUETOOTH_DEVICES_SLICE_URI);
 
     private final Context mContext;
     private final Lifecycle mLifecycle;
@@ -364,29 +358,11 @@
 
     private List<ContextualCard> getCardsWithStickyViewType(List<ContextualCard> cards) {
         final List<ContextualCard> result = new ArrayList<>(cards);
-        int replaceCount = 0;
         for (int index = 0; index < result.size(); index++) {
             final ContextualCard card = cards.get(index);
-            if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2)) {
-                if (card.getCategory() == STICKY_VALUE) {
-                    result.set(index, card.mutate().setViewType(
-                            SliceContextualCardRenderer.VIEW_TYPE_STICKY).build());
-                }
-                continue;
-            }
-
-            if (replaceCount > STICKY_CARDS.size() - 1) {
-                break;
-            }
-
-            if (card.getCardType() != ContextualCard.CardType.SLICE) {
-                continue;
-            }
-
-            if (STICKY_CARDS.contains(card.getSliceUri())) {
+            if (card.getCategory() == STICKY_VALUE) {
                 result.set(index, card.mutate().setViewType(
                         SliceContextualCardRenderer.VIEW_TYPE_STICKY).build());
-                replaceCount++;
             }
         }
         return result;
diff --git a/src/com/android/settings/notification/ConfigureNotificationPreferenceController.java b/src/com/android/settings/notification/ConfigureNotificationPreferenceController.java
deleted file mode 100644
index 3aa1008..0000000
--- a/src/com/android/settings/notification/ConfigureNotificationPreferenceController.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2019 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
- */
-
-package com.android.settings.notification;
-
-import android.content.Context;
-
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-public class ConfigureNotificationPreferenceController extends BasePreferenceController {
-
-    private NotificationBackend mBackend;
-
-    public ConfigureNotificationPreferenceController(Context context, String key) {
-        super(context, key);
-        mBackend = new NotificationBackend();
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return AVAILABLE;
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        final int blockedAppCount = mBackend.getBlockedAppCount();
-        if (blockedAppCount == 0) {
-            return mContext.getText(R.string.app_notification_listing_summary_zero);
-        }
-        return mContext.getResources().getQuantityString(
-                R.plurals.app_notification_listing_summary_others,
-                blockedAppCount, blockedAppCount);
-    }
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
index 127b9e2..69333d7 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -610,7 +610,6 @@
 
     @Test
     public void getCardsWithViewType_hasOneStickySlice_shouldHaveOneStickyCard() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2, true);
         final List<ContextualCard> cards = new ArrayList<>();
         cards.add(buildContextualCard(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI.toString()));
         cards.add(buildContextualCard(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()));
@@ -628,89 +627,6 @@
     }
 
     @Test
-    public void getCardsWithViewType_hasWifiSlice_shouldHaveOneStickyCard() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2, false);
-        final List<ContextualCard> cards = new ArrayList<>();
-        cards.add(buildContextualCard(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI.toString()));
-        cards.add(buildContextualCard(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()));
-        final List<Integer> categories = Arrays.asList(
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE
-        );
-        final List<ContextualCard> cardListWithWifi = buildCategoriedCards(cards, categories);
-
-        final List<ContextualCard> result = mManager.getCardsWithViewType(cardListWithWifi);
-
-        assertThat(result).hasSize(cards.size());
-        assertThat(result.get(0).getViewType()).isEqualTo(VIEW_TYPE_STICKY);
-        assertThat(result.get(1).getViewType()).isEqualTo(VIEW_TYPE_FULL_WIDTH);
-    }
-
-    @Test
-    public void getCardsWithViewType_hasBluetoothDeviceSlice_shouldHaveOneStickyCard() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2, false);
-        final List<ContextualCard> cards = new ArrayList<>();
-        cards.add(buildContextualCard(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI.toString()));
-        cards.add(buildContextualCard(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()));
-        final List<Integer> categories = Arrays.asList(
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE
-        );
-        final List<ContextualCard> cardListWithBT = buildCategoriedCards(cards, categories);
-
-        final List<ContextualCard> result = mManager.getCardsWithViewType(cardListWithBT);
-
-        assertThat(result).hasSize(cards.size());
-        assertThat(result.get(0).getViewType()).isEqualTo(VIEW_TYPE_STICKY);
-        assertThat(result.get(1).getViewType()).isEqualTo(VIEW_TYPE_FULL_WIDTH);
-    }
-
-    @Test
-    public void getCardsWithViewType_hasWifiAndBtDeviceSlice_shouldHaveTwoStickyCards() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2, false);
-        final List<ContextualCard> cards = new ArrayList<>();
-        cards.add(buildContextualCard(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI.toString()));
-        cards.add(buildContextualCard(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI.toString()));
-        cards.add(buildContextualCard(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()));
-        final List<Integer> categories = Arrays.asList(
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE
-        );
-        final List<ContextualCard> cardListWithWifiBT = buildCategoriedCards(cards, categories);
-
-        final List<ContextualCard> result = mManager.getCardsWithViewType(cardListWithWifiBT);
-
-        assertThat(result).hasSize(cards.size());
-        assertThat(result.stream()
-                .filter(card -> card.getViewType() == VIEW_TYPE_STICKY)
-                .count())
-                .isEqualTo(2);
-    }
-
-    @Test
-    public void getCardsWithViewType_noWifiOrBtDeviceSlice_shouldNotHaveStickyCard() {
-        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONTEXTUAL_HOME2, false);
-        final List<Integer> categories = Arrays.asList(
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE,
-                ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE
-        );
-        final List<ContextualCard> cardListWithoutWifiBT =
-                buildCategoriedCards(getContextualCardList(), categories);
-
-        final List<ContextualCard> result = mManager.getCardsWithViewType(cardListWithoutWifiBT);
-
-        assertThat(result).hasSize(cardListWithoutWifiBT.size());
-        assertThat(result.stream()
-                .filter(card -> card.getViewType() == VIEW_TYPE_STICKY)
-                .count())
-                .isEqualTo(0);
-    }
-
-    @Test
     public void getCardsToKeep_hasSavedCard_shouldResetSavedCards() {
         final List<String> savedCardNames = new ArrayList<>();
         savedCardNames.add(TEST_SLICE_NAME);
diff --git a/tests/robotests/src/com/android/settings/notification/ConfigureNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ConfigureNotificationPreferenceControllerTest.java
deleted file mode 100644
index 83fe07a..0000000
--- a/tests/robotests/src/com/android/settings/notification/ConfigureNotificationPreferenceControllerTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-package com.android.settings.notification;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import com.android.settings.testutils.shadow.ShadowNotificationBackend;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowNotificationBackend.class)
-public class ConfigureNotificationPreferenceControllerTest {
-
-    private ConfigureNotificationPreferenceController mController;
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mController = new ConfigureNotificationPreferenceController(mContext, "key");
-    }
-
-    @Test
-    public void getSummary_noBlockedApps() {
-        ShadowNotificationBackend.setBlockedAppCount(0);
-
-        assertThat(mController.getSummary().toString()).contains("On");
-    }
-
-    @Test
-    public void getSummary_someBlockedApps() {
-        ShadowNotificationBackend.setBlockedAppCount(5);
-
-        assertThat(mController.getSummary().toString()).contains("Off");
-        assertThat(mController.getSummary().toString()).contains("5");
-    }
-}
diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
index be030bf..9d9cc34 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -50,7 +50,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
 import android.net.TetheringManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
@@ -78,13 +77,11 @@
     private static final String TEST_RESPONSE_ACTION = "testProvisioningResponseAction";
     private static final String TEST_NO_UI_ACTION = "testNoUiProvisioningRequestAction";
     private static final int BOGUS_RECEIVER_RESULT = -5;
-    private static final int TEST_CHECK_PERIOD = 100;
     private static final int MS_PER_HOUR = 60 * 60 * 1000;
     private static final int SHORT_TIMEOUT = 100;
     private static final int PROVISION_TIMEOUT = 1000;
 
     private TetherService mService;
-    private MockResources mResources;
     private MockTetherServiceWrapper mWrapper;
     int mLastReceiverResultCode = BOGUS_RECEIVER_RESULT;
     private int mLastTetherRequestType = TETHERING_INVALID;
@@ -109,7 +106,6 @@
         super.setUp();
         MockitoAnnotations.initMocks(this);
 
-        mResources = new MockResources();
         mContext = new TestContextWrapper(getContext());
         setContext(mContext);
 
@@ -302,30 +298,6 @@
         }
     }
 
-    private static class MockResources extends android.test.mock.MockResources {
-        @Override
-        public int getInteger(int id) {
-            switch(id) {
-                case com.android.internal.R.integer.config_mobile_hotspot_provision_check_period:
-                    return TEST_CHECK_PERIOD;
-                default:
-                    return 0;
-            }
-        }
-
-        @Override
-        public String getString(int id) {
-            switch(id) {
-                case com.android.internal.R.string.config_mobile_hotspot_provision_response:
-                    return TEST_RESPONSE_ACTION;
-                case com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui:
-                    return TEST_NO_UI_ACTION;
-                default:
-                    return null;
-            }
-        }
-    }
-
     private class TestContextWrapper extends ContextWrapper {
 
         public TestContextWrapper(Context base) {
@@ -333,11 +305,6 @@
         }
 
         @Override
-        public Resources getResources() {
-            return mResources;
-        }
-
-        @Override
         public SharedPreferences getSharedPreferences(String name, int mode) {
             // Stub out prefs to control the persisted tether type list.
             if (name == "tetherPrefs") {
