diff --git a/res/values/strings.xml b/res/values/strings.xml
index 51da73d..8f6cc9c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2634,8 +2634,6 @@
     <string name="kernel_version">Kernel version</string>
     <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
     <string name="build_number">Build number</string>
-    <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
-    <string name="selinux_status">SELinux status</string>
 
     <!-- About phone screen, show when a value of some status item is unavailable. -->
     <string name="device_info_not_available">Not available</string>
@@ -3436,9 +3434,9 @@
     <!-- Message on first screen of choose password flow [CHAR LIMIT=NONE] -->
     <string name="lockpassword_choose_your_password_message">For security, set a password</string>
     <!-- Header on first screen of choose password/PIN as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
-    <string name="lockpassword_choose_your_password_header_for_fingerprint">To use fingerprint, set password</string>
+    <string name="lockpassword_choose_your_password_header_for_fingerprint">To use fingerprint, set a password</string>
     <!-- Header on first screen of choose pattern as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
-    <string name="lockpassword_choose_your_pattern_header_for_fingerprint">To use fingerprint, set pattern</string>
+    <string name="lockpassword_choose_your_pattern_header_for_fingerprint">To use fingerprint, set a pattern</string>
     <!-- Message on first screen of choose PIN flow [CHAR LIMIT=NONE] -->
     <string name="lockpassword_choose_your_pin_message">For security, set a PIN</string>
     <!-- Header on first screen of choose password/PIN as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
@@ -5974,11 +5972,6 @@
     from their cell phone carrier. The use of the string is similar to the string
     "system_update_settings_list_item_title" in this project. [CHAR LIMIT=25] -->
     <string name="additional_system_update_settings_list_item_title">Additional system updates</string>
-    <!-- These statuses are displayed when a device was built with SE Android supoprt.
-    These are displayed by the settings app in the about section. -->
-    <string name="selinux_status_disabled">Disabled</string>
-    <string name="selinux_status_permissive">Permissive</string>
-    <string name="selinux_status_enforcing">Enforcing</string>
 
     <!-- Notification of installed CA Certs --> <skip/>
 
diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
index b094175..1771799 100644
--- a/res/xml/device_info_settings.xml
+++ b/res/xml/device_info_settings.xml
@@ -103,10 +103,4 @@
                 android:title="@string/build_number"
                 android:summary="@string/summary_placeholder"/>
 
-        <!-- SELinux status information -->
-        <Preference
-                android:key="selinux_status"
-                android:title="@string/selinux_status"
-                android:summary="@string/selinux_status_enforcing"/>
-
 </PreferenceScreen>
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 7ca52e2..abf68f2 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -35,7 +35,6 @@
 import com.android.settings.deviceinfo.KernelVersionPreferenceController;
 import com.android.settings.deviceinfo.ManualPreferenceController;
 import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
-import com.android.settings.deviceinfo.SELinuxStatusPreferenceController;
 import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
 import com.android.settings.deviceinfo.SecurityPatchPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -129,7 +128,6 @@
         controllers.add(new DeviceModelPreferenceController(context, fragment));
         controllers.add(new SecurityPatchPreferenceController(context));
         controllers.add(new FccEquipmentIdPreferenceController(context));
-        controllers.add(new SELinuxStatusPreferenceController(context));
         controllers.add(new SafetyInfoPreferenceController(context));
         return controllers;
     }
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 89724cc..3b2ea1a 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -103,6 +103,7 @@
 import android.view.animation.Animation;
 import android.view.animation.Animation.AnimationListener;
 import android.view.animation.AnimationUtils;
+import android.widget.EditText;
 import android.widget.ListView;
 import android.widget.TabWidget;
 
@@ -1362,4 +1363,7 @@
                 && volume.isMountedReadable();
     }
 
+    public static void setEditTextCursorPosition(EditText editText) {
+        editText.setSelection(editText.getText().length());
+    }
 }
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index ddf68c1..ddf3bf5 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -92,7 +92,7 @@
         mApplicationFeatureProvider = FeatureFactory.getFactory(activity)
                 .getApplicationFeatureProvider(activity);
         mState = ApplicationsState.getInstance(activity.getApplication());
-        mSession = mState.newSession(this);
+        mSession = mState.newSession(this, getLifecycle());
         mDpm = new DevicePolicyManagerWrapper(
                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
@@ -107,7 +107,6 @@
     @Override
     public void onResume() {
         super.onResume();
-        mSession.resume();
         mAppsControlDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(getActivity(),
                 UserManager.DISALLOW_APPS_CONTROL, mUserId);
         mAppsControlDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(getActivity(),
@@ -118,16 +117,10 @@
         }
     }
 
-    @Override
-    public void onPause() {
-        mSession.pause();
-        super.onPause();
-    }
 
     @Override
     public void onDestroy() {
         stopListeningToPackageRemove();
-        mSession.release();
         super.onDestroy();
     }
 
diff --git a/src/com/android/settings/applications/AppStateBaseBridge.java b/src/com/android/settings/applications/AppStateBaseBridge.java
index d0b8431..2329b44 100644
--- a/src/com/android/settings/applications/AppStateBaseBridge.java
+++ b/src/com/android/settings/applications/AppStateBaseBridge.java
@@ -50,15 +50,15 @@
 
     public void resume() {
         mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
-        mAppSession.resume();
+        mAppSession.onResume();
     }
 
     public void pause() {
-        mAppSession.pause();
+        mAppSession.onPause();
     }
 
     public void release() {
-        mAppSession.release();
+        mAppSession.onDestroy();
     }
 
     public void forceUpdate(String pkg, int uid) {
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index a9e3ae2..9edbd86 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -988,7 +988,7 @@
             if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
             if (!mResumed) {
                 mResumed = true;
-                mSession.resume();
+                mSession.onResume();
                 mLastSortMode = sort;
                 if (mExtraInfoBridge != null) {
                     mExtraInfoBridge.resume();
@@ -1002,7 +1002,7 @@
         public void pause() {
             if (mResumed) {
                 mResumed = false;
-                mSession.pause();
+                mSession.onPause();
                 if (mExtraInfoBridge != null) {
                     mExtraInfoBridge.pause();
                 }
@@ -1015,7 +1015,7 @@
         }
 
         public void release() {
-            mSession.release();
+            mSession.onDestroy();
             if (mExtraInfoBridge != null) {
                 mExtraInfoBridge.release();
             }
diff --git a/src/com/android/settings/applications/ManageDomainUrls.java b/src/com/android/settings/applications/ManageDomainUrls.java
index 1d325ce..b9e251c 100644
--- a/src/com/android/settings/applications/ManageDomainUrls.java
+++ b/src/com/android/settings/applications/ManageDomainUrls.java
@@ -66,7 +66,7 @@
         setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
         mApplicationsState = ApplicationsState.getInstance(
                 (Application) getContext().getApplicationContext());
-        mSession = mApplicationsState.newSession(this);
+        mSession = mApplicationsState.newSession(this, getLifecycle());
         setHasOptionsMenu(true);
     }
 
@@ -76,24 +76,6 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        mSession.resume();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mSession.pause();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mSession.release();
-    }
-
-    @Override
     public void onRunningStateChanged(boolean running) {
     }
 
diff --git a/src/com/android/settings/applications/PremiumSmsAccess.java b/src/com/android/settings/applications/PremiumSmsAccess.java
index d220a46..70bc17c 100644
--- a/src/com/android/settings/applications/PremiumSmsAccess.java
+++ b/src/com/android/settings/applications/PremiumSmsAccess.java
@@ -32,7 +32,6 @@
 import com.android.settings.R;
 import com.android.settings.applications.AppStateBaseBridge.Callback;
 import com.android.settings.applications.AppStateSmsPremBridge.SmsState;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.notification.EmptyTextSettings;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.applications.ApplicationsState;
@@ -53,7 +52,7 @@
         super.onCreate(icicle);
         mApplicationsState = ApplicationsState.getInstance((Application)
                 getContext().getApplicationContext());
-        mSession = mApplicationsState.newSession(this);
+        mSession = mApplicationsState.newSession(this, getLifecycle());
         mSmsBackend = new AppStateSmsPremBridge(getContext(), mApplicationsState, this);
     }
 
@@ -66,21 +65,18 @@
     @Override
     public void onResume() {
         super.onResume();
-        mSession.resume();
         mSmsBackend.resume();
     }
 
     @Override
     public void onPause() {
         mSmsBackend.pause();
-        mSession.pause();
         super.onPause();
     }
 
     @Override
     public void onDestroy() {
         mSmsBackend.release();
-        mSession.release();
         super.onDestroy();
     }
 
diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
index 25413fa..576e656 100644
--- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
@@ -116,6 +116,7 @@
             mDeviceNameView.setSelection(deviceName.length());
         }
         mDeviceNameView.addTextChangedListener(this);
+        com.android.settings.Utils.setEditTextCursorPosition(mDeviceNameView);
         mDeviceNameView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
             @Override
             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
index a76ed46..eae2f29 100755
--- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
@@ -323,6 +323,7 @@
         final EditText deviceNameField = (EditText) mRootView.findViewById(R.id.name);
         if (deviceNameField != null) {
             deviceNameField.setText(mCachedDevice.getName());
+            com.android.settings.Utils.setEditTextCursorPosition(deviceNameField);
         }
 
         refreshProfiles();
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
index b424fa2..c623395 100644
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ b/src/com/android/settings/datausage/DataSaverSummary.java
@@ -61,7 +61,7 @@
                 (Application) getContext().getApplicationContext());
         mDataSaverBackend = new DataSaverBackend(getContext());
         mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
-        mSession = mApplicationsState.newSession(this);
+        mSession = mApplicationsState.newSession(this, getLifecycle());
     }
 
     @Override
@@ -78,7 +78,6 @@
         mDataSaverBackend.refreshWhitelist();
         mDataSaverBackend.refreshBlacklist();
         mDataSaverBackend.addListener(this);
-        mSession.resume();
         mDataUsageBridge.resume();
     }
 
@@ -87,7 +86,6 @@
         super.onPause();
         mDataSaverBackend.remListener(this);
         mDataUsageBridge.pause();
-        mSession.pause();
     }
 
     @Override
diff --git a/src/com/android/settings/datausage/UnrestrictedDataAccess.java b/src/com/android/settings/datausage/UnrestrictedDataAccess.java
index 58a34b9..c60b841 100644
--- a/src/com/android/settings/datausage/UnrestrictedDataAccess.java
+++ b/src/com/android/settings/datausage/UnrestrictedDataAccess.java
@@ -64,7 +64,7 @@
                 (Application) getContext().getApplicationContext());
         mDataSaverBackend = new DataSaverBackend(getContext());
         mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
-        mSession = mApplicationsState.newSession(this);
+        mSession = mApplicationsState.newSession(this, getLifecycle());
         mShowSystem = icicle != null && icicle.getBoolean(EXTRA_SHOW_SYSTEM);
         mFilter = mShowSystem ? ApplicationsState.FILTER_ALL_ENABLED
                 : ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER;
@@ -109,7 +109,6 @@
     @Override
     public void onResume() {
         super.onResume();
-        mSession.resume();
         mDataUsageBridge.resume();
     }
 
@@ -117,13 +116,11 @@
     public void onPause() {
         super.onPause();
         mDataUsageBridge.pause();
-        mSession.pause();
     }
 
     @Override
     public void onDestroy() {
         super.onDestroy();
-        mSession.release();
         mDataUsageBridge.release();
     }
 
diff --git a/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2.java b/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2.java
index deb6389..2005623 100644
--- a/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2.java
+++ b/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2.java
@@ -40,12 +40,6 @@
     static final String ENABLED = "1";
     @VisibleForTesting
     static final String DISABLED = "0";
-    @VisibleForTesting
-    static final String USERDEBUG_BUILD = "userdebug";
-    @VisibleForTesting
-    static final String ENG_BUILD = "eng";
-    @VisibleForTesting
-    static final String USER_BUILD = "user";
 
     private SwitchPreference mPreference;
 
@@ -57,9 +51,7 @@
     public boolean isAvailable() {
         final String buildType = SystemProperties.get(BUILD_TYPE);
 
-        return mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus) &&
-                (TextUtils.equals(USERDEBUG_BUILD, buildType) ||
-                        TextUtils.equals(ENG_BUILD, buildType));
+        return mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus);
     }
 
     @Override
diff --git a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
index afd1da1..39b6db2 100644
--- a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
+++ b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
@@ -67,9 +67,7 @@
 
     @Override
     public boolean isAvailable() {
-        return mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus) &&
-               (SystemProperties.get(BUILD_TYPE).equals("userdebug") ||
-                SystemProperties.get(BUILD_TYPE).equals("eng"));
+        return mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus);
     }
 
     @Override
diff --git a/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java b/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java
index fa7102a..e481809 100644
--- a/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java
+++ b/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java
@@ -28,6 +28,10 @@
 import com.android.settings.R;
 import com.android.settingslib.core.AbstractPreferenceController;
 
+/**
+ * deprecated in favor of {@link ConnectivityMonitorPreferenceControllerV2}
+ */
+@Deprecated
 public class ConnectivityMonitorPreferenceController extends AbstractPreferenceController implements
         PreferenceControllerMixin {
 
diff --git a/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2.java b/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2.java
new file mode 100644
index 0000000..1fe2a0f
--- /dev/null
+++ b/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+
+public class ConnectivityMonitorPreferenceControllerV2 extends
+        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_CONNECTIVITY_MONITOR_SWITCH = "connectivity_monitor_switch";
+    @VisibleForTesting
+    static final String BUILD_TYPE = "ro.build.type";
+    @VisibleForTesting
+    static final String PROPERTY_CONNECTIVITY_MONITOR = "persist.radio.enable_tel_mon";
+
+    @VisibleForTesting
+    static final String ENABLED_STATUS = "enabled";
+    @VisibleForTesting
+    static final String DISABLED_STATUS = "disabled";
+    @VisibleForTesting
+    static final String USER_ENABLED_STATUS = "user_enabled";
+    @VisibleForTesting
+    static final String USER_DISABLED_STATUS = "user_disabled";
+
+    @VisibleForTesting
+    static final String USERDEBUG_BUILD = "userdebug";
+    @VisibleForTesting
+    static final String ENG_BUILD = "eng";
+
+    private SwitchPreference mPreference;
+
+    public ConnectivityMonitorPreferenceControllerV2(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (SwitchPreference) screen.findPreference(KEY_CONNECTIVITY_MONITOR_SWITCH);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_CONNECTIVITY_MONITOR_SWITCH;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        final String buildType = SystemProperties.get(BUILD_TYPE);
+        return mContext.getResources().getBoolean(R.bool.config_show_connectivity_monitor)
+                && (TextUtils.equals(buildType, USERDEBUG_BUILD)
+                || TextUtils.equals(buildType, ENG_BUILD));
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean isEnabled = (Boolean) newValue;
+        SystemProperties.set(PROPERTY_CONNECTIVITY_MONITOR,
+                isEnabled ? USER_ENABLED_STATUS : USER_DISABLED_STATUS);
+        Toast.makeText(mContext, R.string.connectivity_monitor_toast,
+                Toast.LENGTH_LONG).show();
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final boolean enabled = isConnectivityMonitorEnabled();
+        mPreference.setChecked(enabled);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        SystemProperties.set(PROPERTY_CONNECTIVITY_MONITOR, USER_DISABLED_STATUS);
+        mPreference.setChecked(false);
+        mPreference.setEnabled(false);
+    }
+
+    private boolean isConnectivityMonitorEnabled() {
+        final String cmStatus = SystemProperties.get(PROPERTY_CONNECTIVITY_MONITOR,
+                DISABLED_STATUS);
+        return TextUtils.equals(ENABLED_STATUS, cmStatus) || TextUtils.equals(USER_ENABLED_STATUS,
+                cmStatus);
+    }
+}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 59f80c4..7fab863 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -257,7 +257,7 @@
         // verify apps over usb
         // logger buffer sizes
         // store logger data persistently on device
-        // telephony monitor
+        controllers.add(new ConnectivityMonitorPreferenceControllerV2(context));
         controllers.add(new CameraLaserSensorPreferenceControllerV2(context));
         controllers.add(new CameraHalHdrPlusPreferenceControllerV2(context));
         // feature flags
@@ -266,7 +266,7 @@
         controllers.add(new WifiAggressiveHandoverPreferenceController(context));
         controllers.add(new WifiRoamScansPreferenceController(context));
         controllers.add(new MobileDataAlwaysOnPreferenceController(context));
-        // tethering hardware acceleration
+        controllers.add(new TetheringHardwareAccelPreferenceController(context));
         // select usb configuration
         controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
         // disable absolute volume
@@ -277,7 +277,7 @@
         // bluetooth audio bits per sample
         // bluetooth audio channel mode
         // bluetooth audio ldac codec: playback quality
-        // show taps
+        controllers.add(new ShowTapsPreferenceController(context));
         // pointer location
         // show surface updates
         // show layout bounds
diff --git a/src/com/android/settings/development/ShowTapsPreferenceController.java b/src/com/android/settings/development/ShowTapsPreferenceController.java
new file mode 100644
index 0000000..ccfcbfa
--- /dev/null
+++ b/src/com/android/settings/development/ShowTapsPreferenceController.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+public class ShowTapsPreferenceController extends DeveloperOptionsPreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String SHOW_TOUCHES_KEY = "show_touches";
+
+    @VisibleForTesting
+    static final int SETTING_VALUE_ON = 1;
+    @VisibleForTesting
+    static final int SETTING_VALUE_OFF = 0;
+
+    private SwitchPreference mPreference;
+
+    public ShowTapsPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return SHOW_TOUCHES_KEY;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean isEnabled = (Boolean) newValue;
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, SETTING_VALUE_OFF);
+        mPreference.setChecked(showTapsMode != SETTING_VALUE_OFF);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        Settings.System.putInt(mContext.getContentResolver(), Settings.System.SHOW_TOUCHES,
+                SETTING_VALUE_OFF);
+        mPreference.setChecked(false);
+        mPreference.setEnabled(false);
+    }
+}
diff --git a/src/com/android/settings/development/TetheringHardwareAccelPreferenceController.java b/src/com/android/settings/development/TetheringHardwareAccelPreferenceController.java
new file mode 100644
index 0000000..f638f31
--- /dev/null
+++ b/src/com/android/settings/development/TetheringHardwareAccelPreferenceController.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+public class TetheringHardwareAccelPreferenceController extends
+        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener {
+
+    private static final String TETHERING_HARDWARE_OFFLOAD = "tethering_hardware_offload";
+
+    // We use the "disabled status" in code, but show the opposite text
+    // on screen. So a value 0 indicates the tethering hardware accel is enabled.
+    @VisibleForTesting
+    static final int SETTING_VALUE_ON = 0;
+    @VisibleForTesting
+    static final int SETTING_VALUE_OFF = 1;
+
+    private SwitchPreference mPreference;
+
+    public TetheringHardwareAccelPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return TETHERING_HARDWARE_OFFLOAD;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean isEnabled = (Boolean) newValue;
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED,
+                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final int tetheringMode = Settings.Global.getInt(
+                mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED, 0 /* default */);
+        mPreference.setChecked(tetheringMode != SETTING_VALUE_OFF);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED, SETTING_VALUE_OFF);
+        mPreference.setEnabled(false);
+        mPreference.setChecked(false);
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/SELinuxStatusPreferenceController.java b/src/com/android/settings/deviceinfo/SELinuxStatusPreferenceController.java
deleted file mode 100644
index 058992f..0000000
--- a/src/com/android/settings/deviceinfo/SELinuxStatusPreferenceController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2017 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.deviceinfo;
-
-import android.content.Context;
-import android.os.SELinux;
-import android.os.SystemProperties;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.text.TextUtils;
-
-import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-
-public class SELinuxStatusPreferenceController extends AbstractPreferenceController implements
-        PreferenceControllerMixin {
-
-    private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux";
-    private static final String KEY_SELINUX_STATUS = "selinux_status";
-
-    public SELinuxStatusPreferenceController(Context context) {
-        super(context);
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return !TextUtils.isEmpty(SystemProperties.get(PROPERTY_SELINUX_STATUS));
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_SELINUX_STATUS;
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        final Preference pref = screen.findPreference(KEY_SELINUX_STATUS);
-        if (pref == null) {
-            return;
-        }
-        if (!SELinux.isSELinuxEnabled()) {
-            String status = mContext.getResources().getString(R.string.selinux_status_disabled);
-            pref.setSummary(status);
-        } else if (!SELinux.isSELinuxEnforced()) {
-            String status = mContext.getResources().getString(R.string.selinux_status_permissive);
-            pref.setSummary(status);
-        }
-    }
-}
-
diff --git a/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/settings/display/BrightnessLevelPreferenceController.java
index f9c9d53..ee573eb 100644
--- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java
+++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java
@@ -35,13 +35,13 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import java.text.NumberFormat;
 
 public class BrightnessLevelPreferenceController extends AbstractPreferenceController implements
-        PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
+        PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
 
     private static final String TAG = "BrightnessPrefCtrl";
     private static final String KEY_BRIGHTNESS = "brightness";
@@ -114,7 +114,7 @@
     }
 
     @Override
-    public void onResume() {
+    public void onStart() {
         mContentResolver.registerContentObserver(BRIGHTNESS_MODE_URI, false, mBrightnessObserver);
         mContentResolver.registerContentObserver(BRIGHTNESS_URI, false, mBrightnessObserver);
         mContentResolver.registerContentObserver(BRIGHTNESS_FOR_VR_URI, false, mBrightnessObserver);
@@ -122,7 +122,7 @@
     }
 
     @Override
-    public void onPause() {
+    public void onStop() {
         mContentResolver.unregisterContentObserver(mBrightnessObserver);
     }
 
diff --git a/src/com/android/settings/display/DensityPreference.java b/src/com/android/settings/display/DensityPreference.java
index a62e6b5..581a3ee 100644
--- a/src/com/android/settings/display/DensityPreference.java
+++ b/src/com/android/settings/display/DensityPreference.java
@@ -27,6 +27,7 @@
 
 import com.android.settings.R;
 import com.android.settingslib.CustomEditTextPreference;
+import com.android.settings.Utils;
 import com.android.settingslib.display.DisplayDensityUtils;
 
 import java.text.NumberFormat;
@@ -63,6 +64,7 @@
         if (editText != null) {
             editText.setInputType(InputType.TYPE_CLASS_NUMBER);
             editText.setText(getCurrentSwDp() + "");
+            Utils.setEditTextCursorPosition(editText);
         }
     }
 
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index 20acee9..c034746 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -28,7 +28,6 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -77,7 +76,7 @@
  */
 //TODO(b/35810915): Make InstalledAppDetails use this controller
 public class AppButtonsPreferenceController extends AbstractPreferenceController implements
-        PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause, OnDestroy,
+        PreferenceControllerMixin, LifecycleObserver, OnResume, OnDestroy,
         ApplicationsState.Callbacks {
     public static final String APP_CHG = "chg";
 
@@ -144,7 +143,7 @@
 
         if (packageName != null) {
             mAppEntry = mState.getEntry(packageName, mUserId);
-            mSession = mState.newSession(this);
+            mSession = mState.newSession(this, lifecycle);
             lifecycle.addObserver(this);
         } else {
             mFinishing = true;
@@ -179,7 +178,6 @@
 
     @Override
     public void onResume() {
-        mSession.resume();
         if (isAvailable() && !mFinishing) {
             mAppsControlDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(mActivity,
                     UserManager.DISALLOW_APPS_CONTROL, mUserId);
@@ -193,14 +191,8 @@
     }
 
     @Override
-    public void onPause() {
-        mSession.pause();
-    }
-
-    @Override
     public void onDestroy() {
         stopListeningToPackageRemove();
-        mSession.release();
     }
 
     private class UninstallAndDisableButtonListener implements View.OnClickListener {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index d29364d..adadb78 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -338,7 +338,8 @@
         return usageType == UsageType.CELL
                 || usageType == UsageType.BLUETOOTH
                 || usageType == UsageType.WIFI
-                || usageType == UsageType.APP;
+                || usageType == UsageType.APP
+                || usageType == UsageType.SYSTEM;
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/search/DatabaseIndexingManager.java b/src/com/android/settings/search/DatabaseIndexingManager.java
index d540d2f..5d6fe3b 100644
--- a/src/com/android/settings/search/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search/DatabaseIndexingManager.java
@@ -28,7 +28,8 @@
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS;
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEY_REF;
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns
+        .DATA_SUMMARY_ON_NORMALIZED;
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE;
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED;
 import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ENABLED;
@@ -234,9 +235,9 @@
     @VisibleForTesting
     List<IndexData> getIndexData(String locale, PreIndexData data) {
         if (mConverter == null) {
-            mConverter = new IndexDataConverter(mContext);
+            mConverter = new IndexDataConverter(mContext, locale);
         }
-        return mConverter.convertPreIndexDataToIndexData(data, locale);
+        return mConverter.convertPreIndexDataToIndexData(data);
     }
 
     /**
@@ -248,6 +249,10 @@
         ContentValues values;
 
         for (IndexData dataRow : indexData) {
+            if (TextUtils.isEmpty(dataRow.normalizedTitle)) {
+                continue;
+            }
+
             values = new ContentValues();
             values.put(IndexDatabaseHelper.IndexColumns.DOCID, dataRow.getDocId());
             values.put(LOCALE, dataRow.locale);
diff --git a/src/com/android/settings/search/DatabaseResultLoader.java b/src/com/android/settings/search/DatabaseResultLoader.java
index 3d280b2..c1663ab 100644
--- a/src/com/android/settings/search/DatabaseResultLoader.java
+++ b/src/com/android/settings/search/DatabaseResultLoader.java
@@ -93,7 +93,6 @@
      * If the query matches the prefix of the other words in the title, the best rank it can be is 3
      * If the query only matches the summary, the best rank it can be is 7
      * If the query only matches keywords or entries, the best rank it can be is 9
-     *
      */
     public static final int[] BASE_RANKS = {1, 3, 7, 9};
 
@@ -141,7 +140,7 @@
      * Creates and executes the query which matches prefixes of the first word of the given columns.
      *
      * @param matchColumns The columns to match on
-     * @param baseRank The highest rank achievable by these results
+     * @param baseRank     The highest rank achievable by these results
      * @return A set of the matching results.
      */
     private Set<SearchResult> firstWordQuery(String[] matchColumns, int baseRank) {
@@ -157,7 +156,7 @@
      * given columns.
      *
      * @param matchColumns The columns to match on
-     * @param baseRank The highest rank achievable by these results
+     * @param baseRank     The highest rank achievable by these results
      * @return A set of the matching results.
      */
     private Set<SearchResult> secondaryWordQuery(String[] matchColumns, int baseRank) {
@@ -172,7 +171,7 @@
      * Creates and executes the query which matches prefixes of the any word of the given columns.
      *
      * @param matchColumns The columns to match on
-     * @param baseRank The highest rank achievable by these results
+     * @param baseRank     The highest rank achievable by these results
      * @return A set of the matching results.
      */
     private Set<SearchResult> anyWordQuery(String[] matchColumns, int baseRank) {
@@ -186,8 +185,8 @@
      * Generic method used by all of the query methods above to execute a query.
      *
      * @param whereClause Where clause for the SQL query which uses bindings.
-     * @param selection List of the transformed query to match each bind in the whereClause
-     * @param baseRank The highest rank achievable by these results.
+     * @param selection   List of the transformed query to match each bind in the whereClause
+     * @param baseRank    The highest rank achievable by these results.
      * @return A set of the matching results.
      */
     private Set<SearchResult> query(String whereClause, String[] selection, int baseRank) {
@@ -249,7 +248,7 @@
     private String[] buildSingleWordSelection(String query, int size) {
         String[] selection = new String[size];
 
-        for(int i = 0; i < size; i ++) {
+        for (int i = 0; i < size; i++) {
             selection[i] = query;
         }
         return selection;
@@ -267,7 +266,7 @@
         final String query = mQueryText + "%";
         final String subStringQuery = "% " + mQueryText + "%";
 
-        for(int i = 0; i < (size - 1); i += 2) {
+        for (int i = 0; i < (size - 1); i += 2) {
             selection[i] = query;
             selection[i + 1] = subStringQuery;
         }
diff --git a/src/com/android/settings/search/indexing/IndexData.java b/src/com/android/settings/search/indexing/IndexData.java
index c05c95d..0e1fa2d 100644
--- a/src/com/android/settings/search/indexing/IndexData.java
+++ b/src/com/android/settings/search/indexing/IndexData.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.text.TextUtils;
+
 import com.android.settings.SettingsActivity;
 import com.android.settings.search.DatabaseIndexingUtils;
 import com.android.settings.search.ResultPayload;
diff --git a/src/com/android/settings/search/indexing/IndexDataConverter.java b/src/com/android/settings/search/indexing/IndexDataConverter.java
index 90430a8..487132b 100644
--- a/src/com/android/settings/search/indexing/IndexDataConverter.java
+++ b/src/com/android/settings/search/indexing/IndexDataConverter.java
@@ -17,29 +17,31 @@
 
 package com.android.settings.search.indexing;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.XmlResourceParser;
 import android.provider.SearchIndexableData;
 import android.provider.SearchIndexableResource;
 import android.support.annotation.DrawableRes;
-import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
+
 import com.android.settings.core.PreferenceControllerMixin;
 
 import com.android.settings.search.DatabaseIndexingUtils;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.ResultPayload;
 import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.search.SearchIndexableResources;
 import com.android.settings.search.XmlParserUtils;
+
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -47,10 +49,6 @@
 
 /**
  * Helper class to convert {@link PreIndexData} to {@link IndexData}.
- *
- * TODO (b/33577327) This is just copied straight from DatabaseIndexingManager. But it's still ugly.
- * TODO              This is currently a long chain of method calls. It needs to be broken up.
- * TODO              but for the sake of easy code reviews, that will happen later.
  */
 public class IndexDataConverter {
 
@@ -64,70 +62,77 @@
 
     private String mLocale;
 
-    private List<IndexData> mIndexData;
-
-    public IndexDataConverter(Context context) {
+    public IndexDataConverter(Context context, String locale) {
         mContext = context;
-        mLocale = Locale.getDefault().toString();
-    }
-
-    public List<IndexData> convertPreIndexDataToIndexData(PreIndexData preIndexData,
-            String locale) {
         mLocale = locale;
-        mIndexData = new ArrayList<>();
-        List<SearchIndexableData> dataToUpdate = preIndexData.dataToUpdate;
-        Map<String, Set<String>> nonIndexableKeys = preIndexData.nonIndexableKeys;
-        parsePreIndexData(dataToUpdate, nonIndexableKeys);
-        return mIndexData;
     }
 
     /**
-     * Inserts {@link SearchIndexableData} into the database.
+     * Return the collection of {@param preIndexData} converted into {@link IndexData}.
      *
-     * @param dataToUpdate     is a {@link List} of the data to be inserted.
-     * @param nonIndexableKeys is a {@link Map} from Package Name to a {@link Set} of keys which
-     *                         identify search results which should not be surfaced.
+     * @param preIndexData a collection of {@link SearchIndexableResource},
+     *                     {@link SearchIndexableRaw} and non-indexable keys.
      */
-    private void parsePreIndexData(List<SearchIndexableData> dataToUpdate,
-            Map<String, Set<String>> nonIndexableKeys) {
-        final long current = System.currentTimeMillis();
+    public List<IndexData> convertPreIndexDataToIndexData(PreIndexData preIndexData) {
 
-        for (SearchIndexableData data : dataToUpdate) {
-            try {
-                addOneIndexData(data, nonIndexableKeys);
-            } catch (Exception e) {
-                Log.e(LOG_TAG, "Cannot index: " + (data != null ? data.className : data)
-                        + " for locale: " + mLocale, e);
+        final long current = System.currentTimeMillis();
+        final List<SearchIndexableData> indexableData = preIndexData.dataToUpdate;
+        final Map<String, Set<String>> nonIndexableKeys = preIndexData.nonIndexableKeys;
+        final List<IndexData> indexData = new ArrayList<>();
+
+        for (SearchIndexableData data : indexableData) {
+            if (data instanceof SearchIndexableRaw) {
+                final SearchIndexableRaw rawData = (SearchIndexableRaw) data;
+                final Set<String> rawNonIndexableKeys = nonIndexableKeys.get(
+                        rawData.intentTargetPackage);
+                final IndexData.Builder builder = convertRaw(rawData, rawNonIndexableKeys);
+
+                if (builder != null) {
+                    indexData.add(builder.build(mContext));
+                }
+            } else if (data instanceof SearchIndexableResource) {
+                final SearchIndexableResource sir = (SearchIndexableResource) data;
+                final Set<String> resourceNonIndexableKeys =
+                        getNonIndexableKeysForResource(nonIndexableKeys, sir.packageName);
+
+                if (sir.xmlResId == 0) {
+                    // Index from provider
+                    final Indexable.SearchIndexProvider provider = getSearchProvider(sir);
+                    if (provider == null) {
+                        continue;
+                    }
+                    indexData.addAll(convertIndexProvider(provider, sir, resourceNonIndexableKeys));
+
+                } else {
+                    final List<IndexData> resourceData = convertResource(sir,
+                            resourceNonIndexableKeys);
+                    indexData.addAll(resourceData);
+                }
+
             }
         }
 
-        final long now = System.currentTimeMillis();
-        Log.d(LOG_TAG, "Indexing locale '" + mLocale + "' took " +
-                (now - current) + " millis");
+        final long endConversion = System.currentTimeMillis();
+        Log.d(LOG_TAG, "Converting pre-index data to index data took: "
+                + (endConversion - current));
+
+        return indexData;
     }
 
-    private void addOneIndexData(SearchIndexableData data,
-            Map<String, Set<String>> nonIndexableKeys) {
-        if (data instanceof SearchIndexableResource) {
-            addOneResource((SearchIndexableResource) data, nonIndexableKeys);
-        } else if (data instanceof SearchIndexableRaw) {
-            addOneRaw((SearchIndexableRaw) data, nonIndexableKeys);
-        }
-    }
-
-    private void addOneRaw(SearchIndexableRaw raw, Map<String,
-            Set<String>> nonIndexableKeysFromResource) {
+    /**
+     * Return the conversion of {@link SearchIndexableRaw} to {@link IndexData}.
+     * The fields of {@link SearchIndexableRaw} are a subset of {@link IndexData},
+     * and there is some data sanitization in the conversion.
+     */
+    @Nullable
+    private IndexData.Builder convertRaw(SearchIndexableRaw raw, Set<String> nonIndexableKeys) {
         // Should be the same locale as the one we are processing
         if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
-            return;
+            return null;
         }
 
-        Set<String> packageKeys = nonIndexableKeysFromResource.get(raw.intentTargetPackage);
-        boolean enabled = raw.enabled;
-
-        if (packageKeys != null && packageKeys.contains(raw.key)) {
-            enabled = false;
-        }
+        // A row is enabled if it does not show up as an nonIndexableKey
+        boolean enabled = !(nonIndexableKeys != null && nonIndexableKeys.contains(raw.key));
 
         IndexData.Builder builder = new IndexData.Builder();
         builder.setTitle(raw.title)
@@ -145,58 +150,22 @@
                 .setKey(raw.key)
                 .setUserId(raw.userId);
 
-        addRowToData(builder.build(mContext));
+        return builder;
     }
 
-    private void addOneResource(SearchIndexableResource sir,
-        Map<String, Set<String>> nonIndexableKeysFromResource) {
-
-        if (sir == null) {
-            Log.e(LOG_TAG, "Cannot index a null resource!");
-            return;
-        }
-
-        final List<String> nonIndexableKeys = new ArrayList<>();
-
-        if (sir.xmlResId > SearchIndexableResources.NO_DATA_RES_ID) {
-            Set<String> resNonIndexableKeys = nonIndexableKeysFromResource.get(sir.packageName);
-            if (resNonIndexableKeys != null && resNonIndexableKeys.size() > 0) {
-                nonIndexableKeys.addAll(resNonIndexableKeys);
-            }
-
-            addIndexDataFromResource(sir, nonIndexableKeys);
-        } else {
-            if (TextUtils.isEmpty(sir.className)) {
-                Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
-                return;
-            }
-
-            final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className);
-            if (clazz == null) {
-                Log.d(LOG_TAG, "SearchIndexableResource '" + sir.className +
-                        "' should implement the " + Indexable.class.getName() + " interface!");
-                return;
-            }
-
-            // Will be non null only for a Local provider implementing a
-            // SEARCH_INDEX_DATA_PROVIDER field
-            final Indexable.SearchIndexProvider provider =
-                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);
-            if (provider != null) {
-                List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(sir.context);
-                if (providerNonIndexableKeys != null) {
-                    nonIndexableKeys.addAll(providerNonIndexableKeys);
-                }
-
-                addIndexDataFromProvider(provider, sir, nonIndexableKeys);
-            }
-        }
-    }
-
-    private void addIndexDataFromResource(SearchIndexableResource sir,
-            List<String> nonIndexableKeys) {
+    /**
+     * Return the conversion of the {@link SearchIndexableResource} to {@link IndexData}.
+     * Each of the elements in the xml layout attribute of {@param sir} is a candidate to be
+     * converted (including the header element).
+     *
+     * TODO (b/33577327) simplify this method.
+     */
+    private List<IndexData> convertResource(SearchIndexableResource sir,
+            Set<String> nonIndexableKeys) {
         final Context context = sir.context;
         XmlResourceParser parser = null;
+
+        List<IndexData> resourceIndexData = new ArrayList<>();
         try {
             parser = context.getResources().getXml(sir.xmlResId);
 
@@ -226,8 +195,7 @@
             String keywords;
             String headerKeywords;
             String childFragment;
-            @DrawableRes
-            int iconResId;
+            @DrawableRes int iconResId;
             ResultPayload payload;
             boolean enabled;
             final String fragmentName = sir.className;
@@ -242,9 +210,6 @@
                         .getPreferenceControllerUriMap(fragmentName, context);
             }
 
-            // Insert rows for the main PreferenceScreen node. Rewrite the data for removing
-            // hyphens.
-
             headerTitle = XmlParserUtils.getDataTitle(context, attrs);
             headerSummary = XmlParserUtils.getDataSummary(context, attrs);
             headerKeywords = XmlParserUtils.getDataKeywords(context, attrs);
@@ -319,8 +284,7 @@
                             .setChildClassName(childFragment)
                             .setPayload(payload);
 
-                    // Insert rows for the child nodes of PreferenceScreen
-                    addRowToData(builder.build(mContext));
+                    resourceIndexData.add(builder.build(mContext));
                 } else {
                     // TODO (b/33577327) We removed summary off here. We should check if we can
                     // merge this 'else' section with the one above. Put a break point to
@@ -334,13 +298,13 @@
 
                     builder.setSummaryOn(summaryOn);
 
-                    addRowToData(builder.build(mContext));
+                    resourceIndexData.add(builder.build(mContext));
                 }
             }
 
             // The xml header's title does not match the title of one of the child settings.
             if (isHeaderUnique) {
-                addRowToData(headerBuilder.build(mContext));
+                resourceIndexData.add(headerBuilder.build(mContext));
             }
         } catch (XmlPullParserException e) {
             throw new RuntimeException("Error parsing PreferenceScreen", e);
@@ -349,62 +313,44 @@
         } finally {
             if (parser != null) parser.close();
         }
+        return resourceIndexData;
     }
 
-    private void addIndexDataFromProvider(Indexable.SearchIndexProvider provider,
-            SearchIndexableResource sir, List<String> nonIndexableKeys) {
+    private List<IndexData> convertIndexProvider(Indexable.SearchIndexProvider provider,
+            SearchIndexableResource sir, Set<String> nonIndexableKeys) {
+        final List<IndexData> indexData = new ArrayList<>();
 
         final String className = sir.className;
         final String intentAction = sir.intentAction;
         final String intentTargetPackage = sir.intentTargetPackage;
 
-        if (provider == null) {
-            Log.w(LOG_TAG, "Cannot find provider: " + className);
-            return;
-        }
+        // TODO (b/65376542) Move provider conversion to PreIndexTime
+        // TODO (b/37741509) Providers don't use general non-indexable keys
+        nonIndexableKeys.addAll(provider.getNonIndexableKeys(mContext));
 
         final List<SearchIndexableRaw> rawList = provider.getRawDataToIndex(mContext,
                 true /* enabled */);
 
         if (rawList != null) {
+            for (SearchIndexableRaw raw : rawList) {
+                // The classname and intent information comes from the PreIndexData
+                // This will be more clear when provider conversion is done at PreIndex time.
+                raw.className = className;
+                raw.intentAction = intentAction;
+                raw.intentTargetPackage = intentTargetPackage;
 
-            final int rawSize = rawList.size();
-            for (int i = 0; i < rawSize; i++) {
-                SearchIndexableRaw raw = rawList.get(i);
-
-                // Should be the same locale as the one we are processing
-                if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
-                    continue;
+                IndexData.Builder builder = convertRaw(raw, nonIndexableKeys);
+                if (builder != null) {
+                    indexData.add(builder.build(mContext));
                 }
-                boolean enabled = !nonIndexableKeys.contains(raw.key);
-
-                IndexData.Builder builder = new IndexData.Builder();
-                builder.setTitle(raw.title)
-                        .setSummaryOn(raw.summaryOn)
-                        .setLocale(mLocale)
-                        .setEntries(raw.entries)
-                        .setKeywords(raw.keywords)
-                        .setClassName(className)
-                        .setScreenTitle(raw.screenTitle)
-                        .setIconResId(raw.iconResId)
-                        .setIntentAction(raw.intentAction)
-                        .setIntentTargetPackage(raw.intentTargetPackage)
-                        .setIntentTargetClass(raw.intentTargetClass)
-                        .setEnabled(enabled)
-                        .setKey(raw.key)
-                        .setUserId(raw.userId);
-
-                addRowToData(builder.build(mContext));
             }
         }
 
         final List<SearchIndexableResource> resList =
                 provider.getXmlResourcesToIndex(mContext, true);
-        if (resList != null) {
-            final int resSize = resList.size();
-            for (int i = 0; i < resSize; i++) {
-                SearchIndexableResource item = resList.get(i);
 
+        if (resList != null) {
+            for (SearchIndexableResource item : resList) {
                 // Should be the same locale as the one we are processing
                 if (!item.locale.toString().equalsIgnoreCase(mLocale)) {
                     continue;
@@ -420,16 +366,39 @@
                         ? intentTargetPackage
                         : item.intentTargetPackage;
 
-                addIndexDataFromResource(item, nonIndexableKeys);
+                indexData.addAll(convertResource(item, nonIndexableKeys));
             }
         }
+
+        return indexData;
     }
 
-    private void addRowToData(IndexData row) {
-        if (TextUtils.isEmpty(row.updatedTitle)) {
-            return;
+    private Set<String> getNonIndexableKeysForResource(Map<String, Set<String>> nonIndexableKeys,
+            String packageName) {
+        return nonIndexableKeys.containsKey(packageName)
+                ? nonIndexableKeys.get(packageName)
+                : new HashSet<>();
+    }
+
+    /**
+     * @return Return the {@link Indexable.SearchIndexProvider} corresponding to the
+     * class specified by the Class name specified by {@param sir}.
+     */
+    private Indexable.SearchIndexProvider getSearchProvider(SearchIndexableResource sir) {
+        if (TextUtils.isEmpty(sir.className)) {
+            Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
+            return null;
         }
 
-        mIndexData.add(row);
+        final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className);
+        if (clazz == null) {
+            Log.d(LOG_TAG, "SearchIndexableResource '" + sir.className +
+                    "' should implement the " + Indexable.class.getName() + " interface!");
+            return null;
+        }
+
+        // Will be non null only for a Local provider implementing a
+        // SEARCH_INDEX_DATA_PROVIDER field
+        return DatabaseIndexingUtils.getSearchIndexProvider(clazz);
     }
 }
diff --git a/src/com/android/settings/search/indexing/PreIndexDataCollector.java b/src/com/android/settings/search/indexing/PreIndexDataCollector.java
index 7186df8..a4e1131 100644
--- a/src/com/android/settings/search/indexing/PreIndexDataCollector.java
+++ b/src/com/android/settings/search/indexing/PreIndexDataCollector.java
@@ -31,6 +31,7 @@
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Log;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settings.search.SettingsSearchIndexablesProvider;
@@ -186,7 +187,7 @@
 
     @VisibleForTesting
     List<String> getNonIndexablesKeysFromRemoteProvider(String packageName,
-        String authority) {
+            String authority) {
         try {
             final Context packageContext = mContext.createPackageContext(packageName, 0);
 
diff --git a/src/com/android/settings/sim/SimPreferenceDialog.java b/src/com/android/settings/sim/SimPreferenceDialog.java
index d195724..2b6ebe3 100644
--- a/src/com/android/settings/sim/SimPreferenceDialog.java
+++ b/src/com/android/settings/sim/SimPreferenceDialog.java
@@ -40,6 +40,7 @@
 import android.widget.TextView;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 
 public class SimPreferenceDialog extends Activity {
 
@@ -98,13 +99,14 @@
 
         EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name);
         nameText.setText(savedInstanceState.getString(SIM_NAME));
+        Utils.setEditTextCursorPosition(nameText);
     }
 
     private void createEditDialog(Bundle bundle) {
         final Resources res = mContext.getResources();
         EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name);
         nameText.setText(mSubInfoRecord.getDisplayName());
-
+        Utils.setEditTextCursorPosition(nameText);
         final Spinner tintSpinner = (Spinner) mDialogLayout.findViewById(R.id.spinner);
         SelectColorAdapter adapter = new SelectColorAdapter(mContext,
                 R.layout.settings_color_picker_item, mColorStrings);
@@ -154,7 +156,7 @@
             @Override
             public void onClick(DialogInterface dialog, int whichButton) {
                 final EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name);
-
+                Utils.setEditTextCursorPosition(nameText);
                 String displayName = nameText.getText().toString();
                 int subId = mSubInfoRecord.getSubscriptionId();
                 mSubInfoRecord.setDisplayName(displayName);
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
index ae0102f..97e5e04 100644
--- a/tests/robotests/Android.mk
+++ b/tests/robotests/Android.mk
@@ -9,12 +9,12 @@
 # Include the testing libraries (JUnit4 + Robolectric libs).
 LOCAL_STATIC_JAVA_LIBRARIES := \
     mockito-robolectric-prebuilt \
+    platform-robolectric-android-all-stubs \
     truth-prebuilt
 
 LOCAL_JAVA_LIBRARIES := \
     junit \
-    platform-robolectric-prebuilt \
-    sdk_vcurrent \
+    platform-robolectric-3.4.2-prebuilt \
     telephony-common
 
 LOCAL_INSTRUMENTATION_FOR := Settings
@@ -40,4 +40,6 @@
 
 LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
 
-include prebuilts/misc/common/robolectric/run_robotests.mk
\ No newline at end of file
+LOCAL_ROBOTEST_TIMEOUT := 36000
+
+include prebuilts/misc/common/robolectric/3.4.2/run_robotests.mk
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 1588d5d..33a1d95 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -18,4 +18,5 @@
     <bool name="config_show_camera_hal_hdrplus">false</bool>
     <bool name="config_enableColorTemperature">false</bool>
     <bool name="config_show_camera_laser_sensor">false</bool>
+    <bool name="config_show_connectivity_monitor">false</bool>
 </resources>
\ No newline at end of file
diff --git a/tests/robotests/res/values/config.xml b/tests/robotests/res/values/config.xml
index 4f32bf7..0afbe29 100644
--- a/tests/robotests/res/values/config.xml
+++ b/tests/robotests/res/values/config.xml
@@ -20,4 +20,5 @@
     <bool name="config_enableColorTemperature">true</bool>
     <bool name="config_show_camera_laser_sensor">true</bool>
     <bool name="config_show_camera_hal_hdrplus">true</bool>
+    <bool name="config_show_connectivity_monitor">true</bool>
 </resources>
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 3fc46e8..fac136c 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
@@ -35,10 +34,8 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.os.Bundle;
-import android.view.Menu;
 
 import com.android.settings.search.SearchActivity;
-import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -50,7 +47,6 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
diff --git a/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java b/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
index dd17d9c..ecda97e 100644
--- a/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsLicenseActivityTest.java
@@ -39,8 +39,8 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
-import org.robolectric.util.ActivityController;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
diff --git a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
index 69a1351..206ba95 100644
--- a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
@@ -37,9 +37,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.res.builder.RobolectricPackageManager.ComponentState;
+import org.robolectric.shadows.ShadowPackageManager.ComponentState;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(
@@ -57,7 +57,7 @@
 
     @Before
     public void setUp() {
-        RuntimeEnvironment.getRobolectricPackageManager().setComponentEnabledSetting(
+        Shadows.shadowOf(application.getPackageManager()).setComponentEnabledSetting(
                 new ComponentName(application, SetupRedactionInterstitial.class),
                 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                 PackageManager.DONT_KILL_APP);
@@ -77,7 +77,7 @@
         findFragment(mActivity).onChosenLockSaveFinished(false, null);
 
         ComponentState redactionComponentState =
-                RuntimeEnvironment.getRobolectricPackageManager().getComponentState(
+                Shadows.shadowOf(application.getPackageManager()).getComponentState(
                         new ComponentName(application, SetupRedactionInterstitial.class));
         assertThat(redactionComponentState.newState).named("Redaction component state")
                 .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index 26b5b02..ca02c1d 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -25,6 +25,8 @@
 import android.text.SpannableStringBuilder;
 import android.text.format.DateUtils;
 import android.text.style.TtsSpan;
+import android.widget.EditText;
+import android.widget.TextView;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.wrapper.DevicePolicyManagerWrapper;
@@ -325,4 +327,15 @@
         assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager,
                 PACKAGE_NAME)).isTrue();
     }
+
+    @Test
+    public void testSetEditTextCursorPosition_shouldGetExpectedEditTextLenght() {
+        final EditText editText = new EditText(mContext);
+        final CharSequence text = "test";
+        editText.setText(text, TextView.BufferType.EDITABLE);
+        final int length = editText.getText().length();
+        Utils.setEditTextCursorPosition(editText);
+
+        assertThat(editText.getSelectionEnd()).isEqualTo(length);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java
index 785bdbd..66621a0 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java
@@ -16,14 +16,19 @@
 
 package com.android.settings.accessibility;
 
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.app.Activity;
 import android.content.Context;
 import android.os.UserManager;
 
-import android.test.mock.MockContentResolver;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import org.junit.Before;
@@ -35,11 +40,6 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ShortcutServicePickerFragmentTest {
@@ -58,7 +58,6 @@
     private PackageManagerWrapper mPackageManager;
 
     private ShortcutServicePickerFragment mFragment;
-    private MockContentResolver mContentResolver;
 
     @Before
     public void setUp() {
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
index 15a3746..cfed83b 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
@@ -41,7 +41,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.util.ReflectionHelpers;
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountHeaderPreferenceControllerTest.java
index 34ac183..db1db10 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountHeaderPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
 import android.accounts.Account;
@@ -76,6 +77,7 @@
         FakeFeatureFactory.setupForTest(mContext);
         mHeaderPreference = new LayoutPreference(
                 RuntimeEnvironment.application, R.layout.settings_entity_header);
+        doReturn(mContext).when(mActivity).getApplicationContext();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
index 8c13aab..8dba2f2 100644
--- a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
@@ -17,7 +17,6 @@
 
 import android.app.Activity;
 import android.content.pm.UserInfo;
-import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 
@@ -25,7 +24,6 @@
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.Tile;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java
index 8145b40..027bd33 100644
--- a/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java
@@ -85,10 +85,10 @@
         mController.setResult(result);
         mController.updateUi(mContext);
 
-        assertThat(mAppPreference.getSummary()).isEqualTo("1.00B");
-        assertThat(mCachePreference.getSummary()).isEqualTo("10.00B");
-        assertThat(mDataPreference.getSummary()).isEqualTo("90.00B");
-        assertThat(mTotalPreference.getSummary()).isEqualTo("101B");
+        assertThat(mAppPreference.getSummary()).isEqualTo("1.00 B");
+        assertThat(mCachePreference.getSummary()).isEqualTo("10.00 B");
+        assertThat(mDataPreference.getSummary()).isEqualTo("90.00 B");
+        assertThat(mTotalPreference.getSummary()).isEqualTo("101 B");
     }
 
     @Test
@@ -103,10 +103,10 @@
         mController.setCacheCleared(true);
         mController.updateUi(mContext);
 
-        assertThat(mAppPreference.getSummary()).isEqualTo("1.00B");
-        assertThat(mCachePreference.getSummary()).isEqualTo("0.00B");
-        assertThat(mDataPreference.getSummary()).isEqualTo("90.00B");
-        assertThat(mTotalPreference.getSummary()).isEqualTo("91.00B");
+        assertThat(mAppPreference.getSummary()).isEqualTo("1.00 B");
+        assertThat(mCachePreference.getSummary()).isEqualTo("0.00 B");
+        assertThat(mDataPreference.getSummary()).isEqualTo("90.00 B");
+        assertThat(mTotalPreference.getSummary()).isEqualTo("91.00 B");
     }
 
     @Test
@@ -121,9 +121,9 @@
         mController.setDataCleared(true);
         mController.updateUi(mContext);
 
-        assertThat(mAppPreference.getSummary()).isEqualTo("1.00B");
-        assertThat(mCachePreference.getSummary()).isEqualTo("0.00B");
-        assertThat(mDataPreference.getSummary()).isEqualTo("0.00B");
-        assertThat(mTotalPreference.getSummary()).isEqualTo("1.00B");
+        assertThat(mAppPreference.getSummary()).isEqualTo("1.00 B");
+        assertThat(mCachePreference.getSummary()).isEqualTo("0.00 B");
+        assertThat(mDataPreference.getSummary()).isEqualTo("0.00 B");
+        assertThat(mTotalPreference.getSummary()).isEqualTo("1.00 B");
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index 35f961b..93f364b 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -192,7 +192,7 @@
         when(stats.getTotalBytes()).thenReturn(1L);
 
         assertThat(InstalledAppDetails.getStorageSummary(context, stats, true))
-                .isEqualTo("1.00B used in external storage");
+                .isEqualTo("1.00 B used in external storage");
     }
 
     @Test
@@ -202,7 +202,7 @@
         when(stats.getTotalBytes()).thenReturn(1L);
 
         assertThat(InstalledAppDetails.getStorageSummary(context, stats, false))
-                .isEqualTo("1.00B used in internal storage");
+                .isEqualTo("1.00 B used in internal storage");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
index 5df5bed..3d04c73 100644
--- a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
@@ -77,7 +77,7 @@
     public void storageShouldBeZeroBytesIfQueriedBeforeStorageQueryFinishes() {
         mController.setupView(mHolder);
 
-        assertThat(mHolder.summary.getText().toString()).isEqualTo("0.00B");
+        assertThat(mHolder.summary.getText().toString()).isEqualTo("0.00 B");
     }
 
     @Test
@@ -88,7 +88,7 @@
         mController.queryStats();
         mController.setupView(mHolder);
 
-        assertThat(mHolder.summary.getText().toString()).isEqualTo("1.00B");
+        assertThat(mHolder.summary.getText().toString()).isEqualTo("1.00 B");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/PhotosViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/PhotosViewHolderControllerTest.java
index 7eacba2..7bf338d 100644
--- a/tests/robotests/src/com/android/settings/applications/PhotosViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/PhotosViewHolderControllerTest.java
@@ -59,7 +59,7 @@
     public void storageShouldBeZeroBytesIfQueriedBeforeStorageQueryFinishes() {
         mController.setupView(mHolder);
 
-        assertThat(mHolder.summary.getText().toString()).isEqualTo("0.00B");
+        assertThat(mHolder.summary.getText().toString()).isEqualTo("0.00 B");
     }
 
     @Test
@@ -70,7 +70,7 @@
         mController.queryStats();
         mController.setupView(mHolder);
 
-        assertThat(mHolder.summary.getText().toString()).isEqualTo("11.00B");
+        assertThat(mHolder.summary.getText().toString()).isEqualTo("11.00 B");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
index 52916f5..65f0b46 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
@@ -25,6 +25,7 @@
 import com.android.settings.TestConfig;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
@@ -42,8 +43,12 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAssistPickerTest {
 
-    private static final ComponentName TEST_ASSIST =
-            new ComponentName("com.android.settings", "assist");
+    private static ComponentName sTestAssist;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sTestAssist = new ComponentName("com.android.settings", "assist");
+    }
 
     private Context mContext;
     private DefaultAssistPicker mPicker;
@@ -59,22 +64,22 @@
     @Test
     public void setDefaultAppKey_shouldUpdateDefaultAssist() {
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
-        assistants.add(new DefaultAssistPicker.Info(TEST_ASSIST));
+        assistants.add(new DefaultAssistPicker.Info(sTestAssist));
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
-        mPicker.setDefaultKey(TEST_ASSIST.flattenToString());
+        mPicker.setDefaultKey(sTestAssist.flattenToString());
 
         assertThat(Settings.Secure.getString(mContext.getContentResolver(),
                 Settings.Secure.ASSISTANT))
-                .isEqualTo(TEST_ASSIST.flattenToString());
+                .isEqualTo(sTestAssist.flattenToString());
         assertThat(mPicker.getDefaultKey())
-                .isEqualTo(TEST_ASSIST.flattenToString());
+                .isEqualTo(sTestAssist.flattenToString());
     }
 
     @Test
     public void setDefaultAppKey_noAvaialbleAssit_shouldClearDefaultAssist() {
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
-        mPicker.setDefaultKey(TEST_ASSIST.flattenToString());
+        mPicker.setDefaultKey(sTestAssist.flattenToString());
 
         assertThat(Settings.Secure.getString(mContext.getContentResolver(),
                 Settings.Secure.ASSISTANT))
@@ -86,7 +91,7 @@
     @Test
     public void setDefaultAppKeyToNull_shouldClearDefaultAssist() {
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
-        assistants.add(new DefaultAssistPicker.Info(TEST_ASSIST));
+        assistants.add(new DefaultAssistPicker.Info(sTestAssist));
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
         mPicker.setDefaultKey(null);
 
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
index 9a3ec10..06d3b8b 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
@@ -17,19 +17,19 @@
 package com.android.settings.applications.defaultapps;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.content.ComponentName;
 import android.content.Context;
 import android.os.UserManager;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import org.junit.Before;
@@ -46,8 +46,7 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAutofillPickerTest {
 
-    private static final String TEST_APP_KEY = new ComponentName("foo.bar",
-            "foo.bar.Baz").flattenToString();
+    private static final String TEST_APP_KEY = "foo.bar/foo.bar.Baz";
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Activity mActivity;
diff --git a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
index f56fbbf..c7ca133 100644
--- a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
@@ -51,6 +51,7 @@
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -66,11 +67,16 @@
 
     private static final String TEST_INSTALLER_PACKAGE_NAME = "com.installer";
     private static final String TEST_INSTALLER_ACTIVITY_NAME = "com.installer.InstallerActivity";
-    private static final ComponentName TEST_INSTALLER_COMPONENT =
-            new ComponentName(
-                    TEST_INSTALLER_PACKAGE_NAME,
-                    TEST_INSTALLER_ACTIVITY_NAME);
     private static final String TEST_AIA_PACKAGE_NAME = "test.aia.package";
+    private static ComponentName sTestInstallerComponent;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sTestInstallerComponent =
+                new ComponentName(
+                        TEST_INSTALLER_PACKAGE_NAME,
+                        TEST_INSTALLER_ACTIVITY_NAME);
+    }
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     Context mockContext;
@@ -133,7 +139,7 @@
         receivedListener.onClick(mockInstallButton);
         assertThat(testFragment.getStartActivityIntent()).isNotNull();
         assertThat(testFragment.getStartActivityIntent().getComponent())
-                .isEqualTo(TEST_INSTALLER_COMPONENT);
+                .isEqualTo(sTestInstallerComponent);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
index 69c8a03..44c7e10 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.backup;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.isA;
@@ -32,9 +34,9 @@
 import android.content.pm.PackageManager;
 import android.os.UserHandle;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.search.SearchIndexableRaw;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.After;
 import org.junit.Before;
@@ -44,14 +46,13 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
-import org.robolectric.res.builder.RobolectricPackageManager;
-import org.robolectric.util.ActivityController;
-
-import static com.google.common.truth.Truth.assertThat;
+import org.robolectric.shadows.ShadowPackageManager;
 
 import java.util.List;
 
@@ -64,7 +65,7 @@
     private ActivityController<BackupSettingsActivity> mActivityController;
     private BackupSettingsActivity mActivity;
     private Application mApplication;
-    private RobolectricPackageManager mPackageManager;
+    private ShadowPackageManager mPackageManager;
     private static boolean mIsBackupProvidedByOEM;
 
     @Mock
@@ -84,7 +85,7 @@
         mApplication = RuntimeEnvironment.application;
         mActivityController = Robolectric.buildActivity(BackupSettingsActivity.class);
         mActivity = mActivityController.get();
-        mPackageManager = (RobolectricPackageManager) mApplication.getPackageManager();
+        mPackageManager = Shadows.shadowOf(mApplication.getPackageManager());
         doReturn(mComponent).when(mIntent).getComponent();
     }
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
index 8fa8f06..b973edb 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
@@ -38,6 +38,7 @@
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -62,8 +63,12 @@
 })
 public class BluetoothEnablerTest {
 
-    private static final EnforcedAdmin FAKE_ENFORCED_ADMIN =
-            new EnforcedAdmin(new ComponentName("test.package", "test.Class"), 10);
+    private static EnforcedAdmin sFakeEnforcedAdmin;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sFakeEnforcedAdmin = new EnforcedAdmin(new ComponentName("test.package", "test.Class"), 10);
+    }
 
     @Mock
     private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -130,7 +135,7 @@
     public void maybeEnforceRestrictions_disallowBluetoothRestrictionSet() {
         // GIVEN Bluetooth has been disallowed...
         when(mRestrictionUtils.checkIfRestrictionEnforced(
-                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(sFakeEnforcedAdmin);
         when(mRestrictionUtils.checkIfRestrictionEnforced(
                 mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(null);
 
@@ -139,7 +144,7 @@
         assertThat(mBluetoothEnabler.maybeEnforceRestrictions()).isTrue();
 
         // THEN the expected EnfoceAdmin is set.
-        verify(mMasterSwitchController).setDisabledByAdmin(FAKE_ENFORCED_ADMIN);
+        verify(mMasterSwitchController).setDisabledByAdmin(sFakeEnforcedAdmin);
 
         // THEN the switch is unchecked.
         verify(mMasterSwitchController).setChecked(false);
@@ -151,14 +156,14 @@
         when(mRestrictionUtils.checkIfRestrictionEnforced(
                 mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(null);
         when(mRestrictionUtils.checkIfRestrictionEnforced(
-                mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+                mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(sFakeEnforcedAdmin);
 
         // WHEN the maybeEnforceRestrictions is called...
         // THEN true is returned to indicate there was a restriction to enforce.
         assertThat(mBluetoothEnabler.maybeEnforceRestrictions()).isTrue();
 
         // THEN the expected EnfoceAdmin is set.
-        verify(mMasterSwitchController).setDisabledByAdmin(FAKE_ENFORCED_ADMIN);
+        verify(mMasterSwitchController).setDisabledByAdmin(sFakeEnforcedAdmin);
 
         // THEN the switch is unchecked.
         verify(mMasterSwitchController).setChecked(false);
@@ -168,7 +173,7 @@
     public void maybeEnforceRestrictions_disallowBluetoothNotOverriden() {
         // GIVEN Bluetooth has been disallowed...
         when(mRestrictionUtils.checkIfRestrictionEnforced(
-                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(sFakeEnforcedAdmin);
         when(mRestrictionUtils.checkIfRestrictionEnforced(
                 mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(null);
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java
index 7713aaf..cdaf876 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java
@@ -22,7 +22,6 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
-import android.text.TextUtils;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
@@ -35,8 +34,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
-import java.util.List;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BluetoothFilesPreferenceControllerTest {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
index 9634661..c9d5746 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
@@ -21,7 +21,6 @@
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.support.v7.preference.PreferenceScreen;
 
-import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
index 21bc868..9343721 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -33,7 +33,6 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 2f4e6d8..a977872 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Activity;
@@ -59,7 +60,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
 import org.robolectric.shadows.ShadowApplication;
@@ -138,7 +138,7 @@
 
     @Test
     public void bindPreference_noFragmentMetadata_shouldBindToProfileSelector() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
         tile.userHandle = new ArrayList<>();
@@ -159,7 +159,7 @@
 
     @Test
     public void bindPreference_noFragmentMetadataSingleUser_shouldBindToDirectLaunchIntent() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
         tile.userHandle = new ArrayList<>();
@@ -184,19 +184,19 @@
 
     @Test
     public void bindPreference_toInternalSettingActivity_shouldBindToDirectLaunchIntentAndNotLog() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
         tile.userHandle = new ArrayList<>();
         tile.userHandle.add(mock(UserHandle.class));
         tile.intent = new Intent();
         tile.intent.setComponent(
-                new ComponentName(RuntimeEnvironment.application.getPackageName(), "class"));
+                new ComponentName(application.getPackageName(), "class"));
 
         when(mActivity.getSystemService(Context.USER_SERVICE))
                 .thenReturn(mUserManager);
         when(mActivity.getApplicationContext().getPackageName())
-                .thenReturn(RuntimeEnvironment.application.getPackageName());
+                .thenReturn(application.getPackageName());
 
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -211,7 +211,7 @@
 
     @Test
     public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.intent = new Intent();
         tile.intent.setComponent(new ComponentName("pkg", "class"));
@@ -224,7 +224,7 @@
 
     @Test
     public void bindPreference_noSummary_shouldSetSummaryToPlaceholder() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.intent = new Intent();
         tile.intent.setComponent(new ComponentName("pkg", "class"));
@@ -232,12 +232,12 @@
                 preference, tile, null /*key */, Preference.DEFAULT_ORDER);
 
         assertThat(preference.getSummary())
-                .isEqualTo(RuntimeEnvironment.application.getString(R.string.summary_placeholder));
+                .isEqualTo(application.getString(R.string.summary_placeholder));
     }
 
     @Test
     public void bindPreference_hasSummary_shouldSetSummary() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.summary = "test";
         tile.intent = new Intent();
@@ -254,7 +254,7 @@
             ShadowThreadUtils.class
     })
     public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.intent = new Intent();
         tile.intent.setComponent(new ComponentName("pkg", "class"));
@@ -270,7 +270,7 @@
 
     @Test
     public void bindPreference_withNullKeyTileKey_shouldUseTileKey() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.key = "key";
         tile.intent = new Intent();
@@ -287,12 +287,12 @@
             ShadowThreadUtils.class
     })
     public void bindPreference_withIconUri_shouldLoadIconFromContentProvider() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.key = "key";
         tile.intent = new Intent();
         tile.intent.setComponent(
-                new ComponentName(RuntimeEnvironment.application.getPackageName(), "class"));
+                new ComponentName(application.getPackageName(), "class"));
         tile.metaData = new Bundle();
         tile.metaData.putString(TileUtils.META_DATA_PREFERENCE_ICON_URI,
                 "content://com.android.settings/tile_icon");
@@ -304,7 +304,7 @@
     @Test
     public void bindPreference_withBaseOrder_shouldOffsetPriority() {
         final int baseOrder = 100;
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
         tile.priority = 10;
@@ -316,7 +316,7 @@
 
     @Test
     public void bindPreference_withOrderMetadata_shouldUseOrderInMetadata() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final int testOrder = -30;
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
@@ -330,7 +330,7 @@
 
     @Test
     public void bindPreference_invalidOrderMetadata_shouldIgnore() {
-        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Preference preference = new Preference(application);
         final Tile tile = new Tile();
         tile.metaData = new Bundle();
         tile.metaData.putString(mImpl.META_DATA_KEY_ORDER, "hello");
@@ -368,7 +368,7 @@
     @Test
     public void clickPreference_withUnresolvableIntent_shouldNotLaunchAnything() {
         ReflectionHelpers.setField(
-                mImpl, "mPackageManager", RuntimeEnvironment.getPackageManager());
+                mImpl, "mPackageManager", application.getPackageManager());
         Activity activity = Robolectric.buildActivity(Activity.class).get();
         final ShadowApplication application = ShadowApplication.getInstance();
         final Preference preference = new Preference(application.getApplicationContext());
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java
index 8eb4273..01d253f 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java
@@ -21,9 +21,15 @@
 import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
 
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SuggestionLogHelperTest {
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java
index a5dbf78..9ddce53 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataPlanSummaryPreferenceTest.java
@@ -31,6 +31,7 @@
 import com.android.settings.widget.DonutView;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
@@ -48,9 +49,16 @@
     private static final String TEST_PLAN_USAGE = "Test plan usage";
     private static final String TEST_PLAN_NAME = "Test plan name";
     private static final String TEST_PLAN_DESCRIPTION = "Test plan description";
-    private static final int PLAN_USAGE_TEXT_COLOR = Color.parseColor("#FF5C94F1");
-    private static final int METER_BACKGROUND_COLOR = Color.parseColor("#FFDBDCDC");
-    private static final int METER_CONSUMED_COLOR = Color.parseColor("#FF5C94F1");
+    private static int sPlanUsageTextColor;
+    private static int sMeterBackgroundColor;
+    private static int sMeterConsumedColor;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sPlanUsageTextColor = Color.parseColor("#FF5C94F1");
+        sMeterBackgroundColor = Color.parseColor("#FFDBDCDC");
+        sMeterConsumedColor = Color.parseColor("#FF5C94F1");
+    }
 
     private DataPlanSummaryPreference mPreference;
     private PreferenceViewHolder mHolder;
@@ -87,18 +95,18 @@
     @Test
     public void shouldRender_withData() {
         mPreference.setTitle(TEST_PLAN_USAGE);
-        mPreference.setUsageTextColor(PLAN_USAGE_TEXT_COLOR);
+        mPreference.setUsageTextColor(sPlanUsageTextColor);
         mPreference.setName(TEST_PLAN_NAME);
         mPreference.setDescription(TEST_PLAN_DESCRIPTION);
         mPreference.setPercentageUsage(0.25D);
-        mPreference.setMeterBackgroundColor(METER_BACKGROUND_COLOR);
-        mPreference.setMeterConsumedColor(METER_CONSUMED_COLOR);
+        mPreference.setMeterBackgroundColor(sMeterBackgroundColor);
+        mPreference.setMeterConsumedColor(sMeterConsumedColor);
 
         mPreference.onBindViewHolder(mHolder);
 
         TextView planUsageTextView = (TextView) mHolder.findViewById(android.R.id.title);
         assertThat(planUsageTextView.getTextColors().getDefaultColor())
-                .isEqualTo(PLAN_USAGE_TEXT_COLOR);
+                .isEqualTo(sPlanUsageTextColor);
         assertThat(planUsageTextView.getText()).isEqualTo(TEST_PLAN_USAGE);
 
         TextView planNameTextView = (TextView) mHolder.findViewById(android.R.id.text1);
@@ -108,7 +116,7 @@
         assertThat(planDescriptionTextView.getText()).isEqualTo(TEST_PLAN_DESCRIPTION);
 
         DonutView donutView = (DonutView) mHolder.findViewById(R.id.donut);
-        assertThat(donutView.getMeterBackgroundColor()).isEqualTo(METER_BACKGROUND_COLOR);
-        assertThat(donutView.getMeterConsumedColor()).isEqualTo(METER_CONSUMED_COLOR);
+        assertThat(donutView.getMeterBackgroundColor()).isEqualTo(sMeterBackgroundColor);
+        assertThat(donutView.getMeterConsumedColor()).isEqualTo(sMeterConsumedColor);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java
index 30c7736..72e0b10 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataPlanUsageSummaryTest.java
@@ -34,7 +34,6 @@
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.testutils.shadow.ShadowConnectivityManager;
 import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
 import com.android.settingslib.NetworkPolicyEditor;
 import java.util.ArrayList;
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 431796a..750f785 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -31,17 +31,14 @@
 import com.android.settings.R;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.testutils.shadow.ShadowConnectivityManager;
 import com.android.settingslib.NetworkPolicyEditor;
 import java.util.ArrayList;
-import java.util.List;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.util.ReflectionHelpers;
diff --git a/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java
index 82d3dd9..06969bb 100644
--- a/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/AutoTimeFormatPreferenceControllerTest.java
@@ -30,16 +30,13 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import java.util.List;
 import java.util.Locale;
-import org.junit.After;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.annotation.Resetter;
 import org.robolectric.shadows.ShadowApplication;
 
 @RunWith(SettingsRobolectricTestRunner.class)
diff --git a/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java
index 31b6841..cd13513 100644
--- a/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/TimeFormatPreferenceControllerTest.java
@@ -39,7 +39,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Answers.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
diff --git a/tests/robotests/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2Test.java
index d4e7e20..f28fd6e 100644
--- a/tests/robotests/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2Test.java
+++ b/tests/robotests/src/com/android/settings/development/CameraHalHdrPlusPreferenceControllerV2Test.java
@@ -16,11 +16,6 @@
 
 package com.android.settings.development;
 
-import static com.android.settings.development.CameraHalHdrPlusPreferenceControllerV2.ENG_BUILD;
-import static com.android.settings.development
-        .CameraHalHdrPlusPreferenceControllerV2.USERDEBUG_BUILD;
-import static com.android.settings.development.CameraHalHdrPlusPreferenceControllerV2.USER_BUILD;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.verify;
@@ -57,6 +52,8 @@
     private Context mContext;
     private CameraHalHdrPlusPreferenceControllerV2 mController;
 
+    static final String USERDEBUG_BUILD = "userdebug";
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -82,30 +79,6 @@
     }
 
     @Test
-    public void isAvailable_withUserdebugBuild_shouldReturnTrue() {
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrPlusPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_withEngBuild_shouldReturnTrue() {
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrPlusPreferenceControllerV2.BUILD_TYPE, ENG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_withUserBuild_shouldReturnFalse() {
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrPlusPreferenceControllerV2.BUILD_TYPE, USER_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
     public void updateState_cameraHalHdrPlusEnabled_shouldCheckedPreference() {
         SettingsShadowSystemProperties.set(
                 CameraHalHdrPlusPreferenceControllerV2.PROPERTY_CAMERA_HAL_HDRPLUS,
diff --git a/tests/robotests/src/com/android/settings/development/CameraHalHdrplusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraHalHdrplusPreferenceControllerTest.java
index 913c7dd..48833e4 100644
--- a/tests/robotests/src/com/android/settings/development/CameraHalHdrplusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CameraHalHdrplusPreferenceControllerTest.java
@@ -57,8 +57,6 @@
     private SwitchPreference mPreference;
 
     static final String USERDEBUG_BUILD = "userdebug";
-    static final String ENG_BUILD = "eng";
-    static final String USER_BUILD = "user";
 
     private CameraHalHdrplusPreferenceController mController;
 
@@ -83,39 +81,6 @@
     }
 
     @Test
-    public void isAvailable_withUserdebugBuild_shouldReturnTrue() {
-        when(mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus))
-                .thenReturn(true);
-
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrplusPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_withEngBuild_shouldReturnTrue() {
-        when(mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus))
-                .thenReturn(true);
-
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrplusPreferenceController.BUILD_TYPE, ENG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_withUserBuild_shouldReturnFalse() {
-        when(mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus))
-                .thenReturn(true);
-
-        SettingsShadowSystemProperties.set(
-                CameraHalHdrplusPreferenceController.BUILD_TYPE, USER_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
     public void displayPreference_cameraHalHdrplusEnabled_shouldCheckedPreference() {
         when(mContext.getResources().getBoolean(R.bool.config_show_camera_hal_hdrplus))
                 .thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
index 25c09fe..4003d9f 100644
--- a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
@@ -34,7 +34,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
-import org.robolectric.RuntimeEnvironment;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.verify;
diff --git a/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java
index d968ff9..bb9a6ee 100644
--- a/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java
@@ -38,6 +38,10 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+/**
+ * deprecated in favor of {@link ConnectivityMonitorPreferenceControllerV2}
+ */
+@Deprecated
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ConnectivityMonitorPreferenceControllerTest {
diff --git a/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2Test.java
new file mode 100644
index 0000000..5b4f594
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerV2Test.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import static com.android.settings.development.ConnectivityMonitorPreferenceControllerV2.ENG_BUILD;
+import static com.android.settings.development
+        .ConnectivityMonitorPreferenceControllerV2.USERDEBUG_BUILD;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows =
+        SettingsShadowSystemProperties.class)
+public class ConnectivityMonitorPreferenceControllerV2Test {
+
+    private static final String USER_BUILD = "user";
+
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private SwitchPreference mPreference;
+
+    private Context mContext;
+    private ConnectivityMonitorPreferenceControllerV2 mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        SettingsShadowSystemProperties.clear();
+        mContext = RuntimeEnvironment.application;
+        mController = new ConnectivityMonitorPreferenceControllerV2(mContext);
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        mController.displayPreference(mScreen);
+    }
+
+    @Test
+    public void isAvailable_trueShowFlagWithUserdebugBuild_shouldReturnTrue() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_trueShowFlagWithEngBuild_shouldReturnTrue() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, ENG_BUILD);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_trueShowFlagWithUserBuild_shouldReturnFalse() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USER_BUILD);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void isAvailable_falseShowFlagWithUserdebugBuild_shouldReturnFalse() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void isAvailable_falseShowFlagWithEngBuild_shouldReturnFalse() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, ENG_BUILD);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void isAvailable_falseShowFlagWithUserBuild_shouldReturnFalse() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USER_BUILD);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void updateState_connectivityMonitorEnabled_shouldCheckedPreference() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.ENABLED_STATUS);
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_connectivityMonitorUserEnabled_shouldCheckedPreference() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.USER_ENABLED_STATUS);
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_connectivityMonitorDisabled_shouldUncheckedPreference() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.DISABLED_STATUS);
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void updateState_connectivityMonitorUserDisabled_shouldUncheckedPreference() {
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.USER_DISABLED_STATUS);
+        SettingsShadowSystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onPreferenceChange_preferenceChecked_shouldEnableConnectivityMonitor() {
+        SystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.USER_ENABLED_STATUS);
+
+        mController.handlePreferenceTreeClick(mPreference);
+
+        assertThat(ConnectivityMonitorPreferenceControllerV2.USER_ENABLED_STATUS).isEqualTo(
+                SystemProperties.get(
+                        ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                        ConnectivityMonitorPreferenceControllerV2.DISABLED_STATUS));
+    }
+
+    @Test
+    public void onPreferenceChange_preferenceUnchecked_shouldDisableConnectivityMonitor() {
+        SystemProperties.set(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                ConnectivityMonitorPreferenceControllerV2.USER_DISABLED_STATUS);
+
+        mController.handlePreferenceTreeClick(mPreference);
+
+        assertThat(ConnectivityMonitorPreferenceControllerV2.USER_DISABLED_STATUS).isEqualTo(
+                SystemProperties.get(
+                        ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                        ConnectivityMonitorPreferenceControllerV2.DISABLED_STATUS));
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
+        mController.onDeveloperOptionsSwitchEnabled();
+
+        verify(mPreference).setEnabled(true);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+        mController.onDeveloperOptionsSwitchDisabled();
+
+        String mode = SystemProperties.get(
+                ConnectivityMonitorPreferenceControllerV2.PROPERTY_CONNECTIVITY_MONITOR,
+                null /* default */);
+
+        assertThat(mode).isEqualTo(ConnectivityMonitorPreferenceControllerV2.USER_DISABLED_STATUS);
+        verify(mPreference).setEnabled(false);
+        verify(mPreference).setChecked(false);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/development/ShowTapsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ShowTapsPreferenceControllerTest.java
new file mode 100644
index 0000000..b2731ea
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/ShowTapsPreferenceControllerTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ShowTapsPreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private SwitchPreference mPreference;
+
+    private Context mContext;
+
+    private ShowTapsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mController = new ShowTapsPreferenceController(mContext);
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        mController.displayPreference(mScreen);
+    }
+
+    @After
+    public void tearDown() {
+        SettingsShadowSystemProperties.clear();
+    }
+
+    @Test
+    public void updateState_showTapsEnabled_shouldCheckedPreference() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, ShowTapsPreferenceController.SETTING_VALUE_ON);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_showTapsDisabled_shouldUncheckedPreference() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, ShowTapsPreferenceController.SETTING_VALUE_OFF);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onPreferenceChange_preferenceChecked_shouldEnableShowTaps() {
+        mController.onPreferenceChange(mPreference, true /* new value */);
+
+        int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, -1 /* default */);
+
+        assertThat(showTapsMode).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_ON);
+    }
+
+    @Test
+    public void onPreferenceChange__preferenceUnchecked_shouldDisableCameraLaserSensor() {
+        mController.onPreferenceChange(mPreference, false /* new value */);
+
+        int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, -1 /* default */);
+
+        assertThat(showTapsMode).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_OFF);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchEnabled_preferenceShouldBeEnabled() {
+        mController.onDeveloperOptionsSwitchEnabled();
+
+        verify(mPreference).setEnabled(true);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchDisabled_preferenceShouldBeEnabled() {
+        mController.onDeveloperOptionsSwitchDisabled();
+
+        int showTapsMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SHOW_TOUCHES, -1 /* default */);
+
+        assertThat(showTapsMode).isEqualTo(ShowTapsPreferenceController.SETTING_VALUE_OFF);
+        verify(mPreference).setEnabled(false);
+        verify(mPreference).setChecked(false);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/development/TetheringHardwareAccelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/TetheringHardwareAccelPreferenceControllerTest.java
new file mode 100644
index 0000000..e044f2a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/TetheringHardwareAccelPreferenceControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class TetheringHardwareAccelPreferenceControllerTest {
+
+    @Mock
+    private SwitchPreference mPreference;
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+
+    private Context mContext;
+    private TetheringHardwareAccelPreferenceController mController;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mController = new TetheringHardwareAccelPreferenceController(mContext);
+        when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+                mPreference);
+        mController.displayPreference(mPreferenceScreen);
+    }
+
+    @Test
+    public void onPreferenceChanged_settingEnabled_turnOnTetheringAccel() {
+        mController.onPreferenceChange(mPreference, true /* new value */);
+
+        final int mode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED, -1 /* default */);
+
+        assertThat(mode).isEqualTo(TetheringHardwareAccelPreferenceController.SETTING_VALUE_ON);
+    }
+
+    @Test
+    public void onPreferenceChanged_settingDisabled_turnOffTetheringAccel() {
+        mController.onPreferenceChange(mPreference, false /* new value */);
+
+        final int mode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED, -1 /* default */);
+
+        assertThat(mode).isEqualTo(TetheringHardwareAccelPreferenceController.SETTING_VALUE_OFF);
+    }
+
+    @Test
+    public void updateState_settingEnabled_preferenceShouldBeChecked() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED,
+                TetheringHardwareAccelPreferenceController.SETTING_VALUE_ON);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED,
+                TetheringHardwareAccelPreferenceController.SETTING_VALUE_OFF);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+        mController.onDeveloperOptionsSwitchDisabled();
+        final int mode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.Global.TETHER_OFFLOAD_DISABLED, -1 /* default */);
+
+        assertThat(mode).isEqualTo(TetheringHardwareAccelPreferenceController.SETTING_VALUE_OFF);
+        verify(mPreference).setEnabled(false);
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
+        mController.onDeveloperOptionsSwitchEnabled();
+
+        verify(mPreference).setEnabled(true);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
index bd40240..8ebfb89 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceControllerTest.java
@@ -97,8 +97,8 @@
         mController.updateBytes(0, 32 * GIGABYTE);
         mController.updateState(mPreference);
 
-        assertThat(mPreference.getTitle().toString()).isEqualTo("0.00B");
-        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 32GB");
+        assertThat(mPreference.getTitle().toString()).isEqualTo("0.00 B");
+        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 32 GB");
     }
 
     @Test
@@ -106,8 +106,8 @@
         mController.updateBytes(KILOBYTE, KILOBYTE * 10);
         mController.updateState(mPreference);
 
-        assertThat(mPreference.getTitle().toString()).isEqualTo("1.00KB");
-        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 10KB");
+        assertThat(mPreference.getTitle().toString()).isEqualTo("1.00 KB");
+        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 10 KB");
     }
 
     @Test
@@ -123,8 +123,8 @@
         mController.updateSizes(svp, volume);
         mController.updateState(mPreference);
 
-        assertThat(mPreference.getTitle().toString()).isEqualTo("9.00KB");
-        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 10KB");
+        assertThat(mPreference.getTitle().toString()).isEqualTo("9.00 KB");
+        assertThat(mPreference.getSummary().toString()).isEqualTo("Used of 10 KB");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
index 66bdba1..95144bd 100644
--- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.display;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.reset;
@@ -30,8 +31,8 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.wrapper.PowerManagerWrapper;
 
 import org.junit.Before;
@@ -41,7 +42,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowContentResolver;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -80,14 +81,13 @@
     }
 
     @Test
-    public void onResume_shouldRegisterObserver() {
+    public void onStart_shouldRegisterObserver() {
         Context context = RuntimeEnvironment.application;
         BrightnessLevelPreferenceController controller =
             new BrightnessLevelPreferenceController(context, null, mPowerManager);
-        ShadowContentResolver shadowContentResolver =
-            (ShadowContentResolver) ShadowExtractor.extract(context.getContentResolver());
+        ShadowContentResolver shadowContentResolver = Shadow.extract(context.getContentResolver());
 
-        controller.onResume();
+        controller.onStart();
 
         assertThat(shadowContentResolver.getContentObservers(
             System.getUriFor(System.SCREEN_BRIGHTNESS_MODE))).isNotEmpty();
@@ -100,16 +100,15 @@
     }
 
     @Test
-    public void onPause_shouldUnregisterObserver() {
+    public void onStop_shouldUnregisterObserver() {
         Context context = RuntimeEnvironment.application;
         BrightnessLevelPreferenceController controller =
             new BrightnessLevelPreferenceController(context, null, mPowerManager);
-        ShadowContentResolver shadowContentResolver =
-            (ShadowContentResolver) ShadowExtractor.extract(context.getContentResolver());
+        ShadowContentResolver shadowContentResolver = Shadow.extract(context.getContentResolver());
 
         controller.displayPreference(mScreen);
-        controller.onResume();
-        controller.onPause();
+        controller.onStart();
+        controller.onStop();
 
         assertThat(shadowContentResolver.getContentObservers(
             System.getUriFor(System.SCREEN_BRIGHTNESS_MODE))).isEmpty();
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
index 6e58b13..d495b74 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java
@@ -47,7 +47,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
@@ -75,8 +74,6 @@
         MockitoAnnotations.initMocks(this);
         ShadowUtils.setFingerprintManager(mFingerprintManager);
 
-        RuntimeEnvironment.getAppResourceLoader().getResourceIndex();
-
         mActivity = Robolectric.buildActivity(
                 FingerprintEnrollFindSensor.class,
                 new Intent()
diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
index bf2dfae..0254bcb 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintSuggestionActivityTest.java
@@ -42,10 +42,10 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
 import org.robolectric.shadows.ShadowKeyguardManager;
-import org.robolectric.util.ActivityController;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
index b2ef65b..c3899e9 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java
@@ -40,7 +40,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowAlertDialog;
@@ -66,8 +65,6 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowUtils.setFingerprintManager(mFingerprintManager);
-        RuntimeEnvironment.getAppResourceLoader().getResourceIndex();
-
     }
 
     private void createActivity(Intent intent) {
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
index f5859ac..2d98bf4 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
@@ -48,15 +48,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.shadows.ShadowActivity;
 import org.robolectric.shadows.ShadowActivity.IntentForResult;
 import org.robolectric.shadows.ShadowKeyguardManager;
-import org.robolectric.util.ActivityController;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(
@@ -80,7 +79,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        RuntimeEnvironment.getRobolectricPackageManager()
+        Shadows.shadowOf(application.getPackageManager())
                 .setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
         ShadowFingerprintManager.addToServiceMap();
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 4353b54..e010cf3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -38,6 +38,7 @@
 
 import com.android.settings.R;
 import com.android.settings.TestConfig;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 
 import org.junit.Before;
@@ -54,7 +55,13 @@
 import org.robolectric.util.FragmentTestUtil;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(
+        manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {
+                SettingsShadowResources.class,
+                SettingsShadowResources.SettingsShadowTheme.class
+        })
 public class BackgroundActivityPreferenceControllerTest {
     private static final int UID_LOW_SDK = 1234;
     private static final int UID_HIGH_SDK = 3456;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index a461f46..a57b6ca 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -147,7 +147,7 @@
     }
 
     @Test
-    public void extractPackageFromSipper_normalSipper_returnDefaultPakcage() {
+    public void extractPackageFromSipper_normalSipper_returnDefaultPackage() {
         BatteryEntry entry = createBatteryEntryForApp();
 
         assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(entry.sipper.mPackages);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
index 796e63c..b87089a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoLoaderTest.java
@@ -26,7 +26,6 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.os.BatteryManager;
 import android.os.BatteryStats;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.TestConfig;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 6bde839..8030463 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -37,7 +37,6 @@
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceManager;
 
-import android.view.View;
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatterySipper.DrainType;
 import com.android.internal.os.BatteryStatsHelper;
@@ -133,7 +132,7 @@
         when(mShadowContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(
                 mConnectivityManager);
 
-        mPowerUsageData = new PowerUsageData(UsageType.SYSTEM);
+        mPowerUsageData = new PowerUsageData(UsageType.USER);
         mMaxBatterySipper.totalPowerMah = TYPE_BLUETOOTH_USAGE;
         mMaxBatterySipper.drainType = DrainType.BLUETOOTH;
         mNormalBatterySipper.drainType = DrainType.SCREEN;
@@ -342,6 +341,13 @@
     }
 
     @Test
+    public void testShouldHideSummary_typeSystem_returnTrue() {
+        mPowerUsageData.usageType = UsageType.SYSTEM;
+
+        assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue();
+    }
+
+    @Test
     public void testShouldHideSummary_typeWifi_returnTrue() {
         mPowerUsageData.usageType = UsageType.WIFI;
 
@@ -364,7 +370,7 @@
 
     @Test
     public void testShouldHideSummary_typeNormal_returnFalse() {
-        mPowerUsageData.usageType = UsageType.SYSTEM;
+        mPowerUsageData.usageType = UsageType.IDLE;
 
         assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isFalse();
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 5971711..4385409 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -66,6 +66,7 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -107,10 +108,14 @@
     private static final double BATTERY_OVERCOUNTED_USAGE = 500;
     private static final double PRECISION = 0.001;
     private static final double POWER_USAGE_PERCENTAGE = 50;
-    private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
-            new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
     public static final String NEW_ML_EST_SUFFIX = "(New ML est)";
     public static final String OLD_EST_SUFFIX = "(Old est)";
+    private static Intent sAdditionalBatteryInfoIntent;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sAdditionalBatteryInfoIntent =new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
+    }
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
@@ -188,7 +193,7 @@
         when(mToggleAppsMenu.getItemId()).thenReturn(MENU_TOGGLE_APPS);
         when(mHighPowerMenu.getItemId()).thenReturn(MENU_HIGH_POWER_APPS);
         when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent())
-                .thenReturn(ADDITIONAL_BATTERY_INFO_INTENT);
+                .thenReturn(sAdditionalBatteryInfoIntent);
         when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER);
         when(mBatteryHelper.getStats().computeBatteryRealtime(anyLong(), anyInt())).thenReturn(
                 TIME_SINCE_LAST_FULL_CHARGE_US);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
index 1111804..8431fde 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
index 8297e81..3f48d0a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
@@ -32,7 +32,6 @@
 import android.support.v7.preference.Preference;
 
 import com.android.settings.SettingsActivity;
-import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
index f8d02ff..edf026a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.spy;
 
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
 import android.os.BatteryStats;
 import android.text.format.DateUtils;
 
diff --git a/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
index 7ea42b8..041b7e0 100644
--- a/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
@@ -27,7 +27,6 @@
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PickupGesturePreferenceControllerTest.java
similarity index 98%
rename from tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/gestures/PickupGesturePreferenceControllerTest.java
index 833f016..a2a6923 100644
--- a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PickupGesturePreferenceControllerTest.java
@@ -43,7 +43,7 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class PIckupGesturePreferenceControllerTest {
+public class PickupGesturePreferenceControllerTest {
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
index d4fc014..063d7eb 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -16,33 +16,26 @@
 
 package com.android.settings.gestures;
 
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.hardware.fingerprint.FingerprintManager;
 import android.provider.Settings;
 
-import com.android.settings.search.InlinePayload;
-import com.android.settings.search.InlineSwitchPayload;
-import com.android.settings.search.ResultPayload;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
-import com.android.settings.testutils.shadow.ShadowSecureSettings;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
 import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
+
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
diff --git a/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryCursorLoaderTest.java b/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryCursorLoaderTest.java
index a76aebc..7b149f3 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryCursorLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryCursorLoaderTest.java
@@ -49,7 +49,7 @@
         MockitoAnnotations.initMocks(this);
         mContentProvider = new FakeProvider();
         mLoader = new UserDictionaryCursorLoader(RuntimeEnvironment.application, "" /* locale */);
-        ShadowContentResolver.registerProvider(UserDictionary.AUTHORITY, mContentProvider);
+        ShadowContentResolver.registerProviderInternal(UserDictionary.AUTHORITY, mContentProvider);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryListTest.java b/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryListTest.java
index c6793cb..91fcaae 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryListTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/UserDictionaryListTest.java
@@ -47,7 +47,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContentProvider = new FakeProvider();
-        ShadowContentResolver.registerProvider(UserDictionary.AUTHORITY, mContentProvider);
+        ShadowContentResolver.registerProviderInternal(UserDictionary.AUTHORITY, mContentProvider);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
index c7e0e0a..87691a5 100644
--- a/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationPreferenceControllerTest.java
@@ -15,7 +15,6 @@
  */
 package com.android.settings.location;
 
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.nullable;
@@ -35,10 +34,8 @@
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.display.AutoBrightnessPreferenceController;
 import com.android.settings.search.InlineListPayload;
 import com.android.settings.search.InlinePayload;
-import com.android.settings.search.InlineSwitchPayload;
 import com.android.settings.search.ResultPayload;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
@@ -53,7 +50,6 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
index 97c0d94..089e330 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
@@ -16,21 +16,13 @@
 
 package com.android.settings.notification;
 
-import android.app.NotificationManager;
-import android.app.NotificationManager.Policy;
-import android.content.Context;
-import android.support.v7.preference.Preference;
-
-import com.android.settings.R;
 import com.android.settings.notification.NotificationBackend.AppRow;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import org.robolectric.annotation.Config;
 
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
diff --git a/tests/robotests/src/com/android/settings/notification/SuppressorHelperTest.java b/tests/robotests/src/com/android/settings/notification/SuppressorHelperTest.java
index 86f3d81..74c41f3 100644
--- a/tests/robotests/src/com/android/settings/notification/SuppressorHelperTest.java
+++ b/tests/robotests/src/com/android/settings/notification/SuppressorHelperTest.java
@@ -21,12 +21,19 @@
 import android.content.pm.ServiceInfo;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.when;
 
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SuppressorHelperTest {
     private static final String SUPPRESSOR_NAME = "wear";
 
diff --git a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java b/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java
index 47d5287..cd62c15 100644
--- a/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java
+++ b/tests/robotests/src/com/android/settings/search/CursorToSearchResultConverterTest.java
@@ -37,6 +37,7 @@
 import com.android.settings.wifi.WifiSettings;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -59,9 +60,14 @@
     private static final String TARGET_PACKAGE = "a.b.c";
     private static final String TARGET_CLASS = "a.b.c.class";
     private static final String KEY = "key";
-    private static final Intent INTENT = new Intent("com.android.settings");
     private static final int ICON = R.drawable.ic_search_24dp;
     private static final int BASE_RANK = 1;
+    private static Intent sIntent;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sIntent = new Intent("com.android.settings");
+    }
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private SiteMapManager mSiteMapManager;
@@ -120,7 +126,7 @@
     @Test
     public void testParseCursor_MatchesIcon() {
         final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
-        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(INTENT));
+        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
         final String BLANK = "";
         cursor.addRow(new Object[]{
                 KEY.hashCode(),      // Doc ID
@@ -171,7 +177,7 @@
     @Test
     public void testLongTitle_PenalizedInRank() {
         final MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
-        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(INTENT));
+        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
         final String BLANK = "";
         cursor.addRow(new Object[]{
                 KEY.hashCode(),      // Doc ID
@@ -203,7 +209,7 @@
         for (SearchResult result : results) {
             payload = result.payload;
             Intent intent = payload.getIntent();
-            assertThat(intent.getAction()).isEqualTo(INTENT.getAction());
+            assertThat(intent.getAction()).isEqualTo(sIntent.getAction());
         }
     }
 
@@ -375,7 +381,7 @@
     private MatrixCursor getDummyCursor(String[] keys, String className) {
         MatrixCursor cursor = new MatrixCursor(DatabaseResultLoader.SELECT_COLUMNS);
         final String BLANK = "";
-        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(INTENT));
+        final byte[] payload = ResultPayloadUtils.marshall(new ResultPayload(sIntent));
 
         for (int i = 0; i < keys.length; i++) {
             ArrayList<Object> item = new ArrayList<>(DatabaseResultLoader.SELECT_COLUMNS.length);
@@ -386,7 +392,7 @@
             item.add(className); // classname
             item.add(BLANK); // screen title
             item.add(null); // Icon
-            item.add(INTENT.getAction()); // Intent action
+            item.add(sIntent.getAction()); // Intent action
             item.add(TARGET_PACKAGE); // target package
             item.add(TARGET_CLASS); // target class
             item.add(keys[i]); // Key
diff --git a/tests/robotests/src/com/android/settings/search/InlinePayloadTest.java b/tests/robotests/src/com/android/settings/search/InlinePayloadTest.java
index 1747cca..8bb558f 100644
--- a/tests/robotests/src/com/android/settings/search/InlinePayloadTest.java
+++ b/tests/robotests/src/com/android/settings/search/InlinePayloadTest.java
@@ -3,7 +3,6 @@
 import android.content.Context;
 import android.content.ContentResolver;
 import android.content.Intent;
-import android.os.Parcel;
 import android.provider.Settings;
 import com.android.settings.TestConfig;
 import com.android.settings.search.ResultPayload.SettingsSource;
diff --git a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
index d78a818..4976c6a 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
@@ -60,8 +60,8 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
-import org.robolectric.util.ActivityController;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Set;
diff --git a/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
index 72df771..e857ae4 100644
--- a/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
+++ b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
@@ -19,12 +19,12 @@
 
 import android.content.Context;
 import android.provider.SearchIndexableResource;
+
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -76,7 +76,8 @@
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
-                public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+                public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+                        boolean enabled) {
                     final SearchIndexableRaw data = new SearchIndexableRaw(context);
                     data.title = TITLE;
                     data.summaryOn = SUMMARY_ON;
@@ -118,7 +119,7 @@
 
                 @Override
                 public List<AbstractPreferenceController>
-                        getPreferenceControllers(Context context) {
+                getPreferenceControllers(Context context) {
                     return null;
                 }
             };
diff --git a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
index b5bfea0..cac6f3a 100644
--- a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
+++ b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 import android.text.TextUtils;
+
 import com.android.settings.TestConfig;
 import com.android.settings.R;
 import com.android.settings.search.ResultPayload;
@@ -27,6 +28,7 @@
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settings.testutils.DatabaseTestUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -40,6 +42,7 @@
 import java.util.Set;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.spy;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -97,7 +100,7 @@
     @Before
     public void setUp() {
         mContext = spy(RuntimeEnvironment.application);
-        mConverter = spy(new IndexDataConverter(mContext));
+        mConverter = spy(new IndexDataConverter(mContext, localeStr));
     }
 
     @After
@@ -110,8 +113,7 @@
         final SearchIndexableRaw raw = getFakeRaw();
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(raw);
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData.size()).isEqualTo(1);
         final IndexData row = indexData.get(0);
@@ -148,8 +150,7 @@
         preIndexData.dataToUpdate.add(raw);
         preIndexData.nonIndexableKeys.put(raw.intentTargetPackage, keys);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData.size()).isEqualTo(1);
         assertThat(indexData.get(0).enabled).isFalse();
@@ -163,8 +164,7 @@
         final SearchIndexableRaw raw = getFakeRaw("ca-fr");
         PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(raw);
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData).isEmpty();
     }
@@ -175,8 +175,7 @@
     @Test
     public void testNullResource_NothingInserted() {
         PreIndexData preIndexData = new PreIndexData();
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData).isEmpty();
     }
@@ -187,8 +186,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        final List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        final List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
         int numEnabled = getEnabledResultCount(indexData);
 
         assertThat(numEnabled).isEqualTo(NUM_DISPLAY_ENTRIES);
@@ -205,8 +203,7 @@
         preIndexData.dataToUpdate.add(resource);
         preIndexData.nonIndexableKeys.put(packageName, keys);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData.size()).isEqualTo(NUM_DISPLAY_ENTRIES);
         assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_DISPLAY_ENTRIES - 2);
@@ -218,8 +215,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         final IndexData row = findIndexDataForTitle(indexData, PAGE_TITLE);
 
@@ -234,8 +230,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         String checkBoxSummaryOn = "summary_on";
         String checkBoxSummaryOff = "summary_off";
@@ -252,8 +247,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         String listSummary = "summary_4";
         String listKey = "pref_key_4";
@@ -268,8 +262,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         final IndexData row = findIndexDataForTitle(indexData, TITLE_THREE);
 
@@ -286,8 +279,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(indexData.size()).isEqualTo(NUM_FAKE_FRAGMENT_ENTRIES);
         assertThat(findIndexDataForTitle(indexData, PAGE_TITLE)).isNotNull();
@@ -306,8 +298,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         final IndexData data = findIndexDataForTitle(indexData, FakeSettingsFragment.TITLE);
         assertFakeFragment(data);
@@ -322,8 +313,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_ENABLED_FAKE_FRAGMENT_ENTRIES);
     }
@@ -334,8 +324,7 @@
         final PreIndexData preIndexData = new PreIndexData();
         preIndexData.dataToUpdate.add(resource);
 
-        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
-                localeStr);
+        List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
 
         int numEnabled = getEnabledResultCount(indexData);
         final IndexData nonTitlePref = findIndexDataForKey(indexData, "pref_key_1");
diff --git a/tests/robotests/src/com/android/settings/security/ConfigureKeyGuardDialogTest.java b/tests/robotests/src/com/android/settings/security/ConfigureKeyGuardDialogTest.java
index 1809e88..38a6b42 100644
--- a/tests/robotests/src/com/android/settings/security/ConfigureKeyGuardDialogTest.java
+++ b/tests/robotests/src/com/android/settings/security/ConfigureKeyGuardDialogTest.java
@@ -26,8 +26,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.android.controller.FragmentController;
 import org.robolectric.annotation.Config;
-import org.robolectric.util.FragmentController;
 
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.spy;
@@ -47,7 +47,7 @@
                 Robolectric.buildFragment(ConfigureKeyGuardDialog.class);
         final ConfigureKeyGuardDialog fragment = spy(fragmentController.get());
         doNothing().when(fragment).startPasswordSetup();
-        fragmentController.attach().create().start().resume();
+        fragmentController.create().start().resume();
         fragment.onClick(null /* dialog */, DialogInterface.BUTTON_POSITIVE);
         fragment.onDismiss(null /* dialog */);
 
diff --git a/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
index 75551e5..5ad8500 100644
--- a/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/support/NewDeviceIntroSuggestionActivityTest.java
@@ -17,6 +17,20 @@
 package com.android.settings.support;
 
 
+import static com.android.settings.support.NewDeviceIntroSuggestionActivity
+        .PERMANENT_DISMISS_THRESHOLD;
+import static com.android.settings.support.NewDeviceIntroSuggestionActivity
+        .PREF_KEY_SUGGGESTION_COMPLETE;
+import static com.android.settings.support.NewDeviceIntroSuggestionActivity
+        .PREF_KEY_SUGGGESTION_FIRST_DISPLAY_TIME;
+import static com.android.settings.support.NewDeviceIntroSuggestionActivity.isSuggestionComplete;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+import static org.robolectric.RuntimeEnvironment.application;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -33,20 +47,9 @@
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.res.builder.RobolectricPackageManager;
-
-import static com.android.settings.support.NewDeviceIntroSuggestionActivity
-        .PERMANENT_DISMISS_THRESHOLD;
-import static com.android.settings.support.NewDeviceIntroSuggestionActivity
-        .PREF_KEY_SUGGGESTION_COMPLETE;
-import static com.android.settings.support.NewDeviceIntroSuggestionActivity
-        .PREF_KEY_SUGGGESTION_FIRST_DISPLAY_TIME;
-import static com.android.settings.support.NewDeviceIntroSuggestionActivity.isSuggestionComplete;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.when;
+import org.robolectric.shadows.ShadowPackageManager;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -57,14 +60,14 @@
 
     private FakeFeatureFactory mFeatureFactory;
     private Context mContext;
-    private RobolectricPackageManager mRobolectricPackageManager;
+    private ShadowPackageManager mShadowPackageManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mFeatureFactory = FakeFeatureFactory.setupForTest(mMockContext);
-        mContext = RuntimeEnvironment.application;
-        mRobolectricPackageManager = RuntimeEnvironment.getRobolectricPackageManager();
+        mContext = application;
+        mShadowPackageManager = Shadows.shadowOf(application.getPackageManager());
 
         when(mFeatureFactory.suggestionsFeatureProvider.getSharedPrefs(any(Context.class)))
                 .thenReturn(getSharedPreferences());
@@ -115,7 +118,7 @@
                 .thenReturn("https://com.android.settings");
 
         final Intent intent = NewDeviceIntroSuggestionActivity.getLaunchIntent(mContext);
-        mRobolectricPackageManager.addResolveInfoForIntent(intent, new ResolveInfo());
+        mShadowPackageManager.addResolveInfoForIntent(intent, new ResolveInfo());
         assertThat(isSuggestionComplete(mContext)).isFalse();
     }
 
diff --git a/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java b/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java
index 2c59ba7..178e4ec 100644
--- a/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java
+++ b/tests/robotests/src/com/android/settings/support/SupportDashboardActivityTest.java
@@ -19,20 +19,22 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.robolectric.RuntimeEnvironment.application;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.search.SearchIndexableRaw;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
 import java.util.List;
@@ -45,7 +47,7 @@
 
     @Before
     public void setUp() {
-        mContext = RuntimeEnvironment.application;
+        mContext = application;
     }
 
     @Test
@@ -67,10 +69,11 @@
 
     @Test
     public void shouldHandleIntentAction() {
-        RuntimeEnvironment.getRobolectricPackageManager().setQueryIntentImplicitly(true);
+        PackageManager packageManager = application.getPackageManager();
+        Shadows.shadowOf(packageManager).setQueryIntentImplicitly(true);
         // Intent action used by setup wizard to start support settings
         Intent intent = new Intent("com.android.settings.action.SUPPORT_SETTINGS");
-        ResolveInfo resolveInfo = RuntimeEnvironment.getPackageManager().resolveActivity(
+        ResolveInfo resolveInfo = packageManager.resolveActivity(
                 intent,
                 PackageManager.MATCH_DEFAULT_ONLY);
         assertThat(resolveInfo).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java b/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java
index 8cc05e0..31c654c 100644
--- a/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/support/SupportDisclaimerDialogFragmentTest.java
@@ -37,7 +37,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.robolectric.internal.Shadow.directlyOn;
+import static org.robolectric.shadow.api.Shadow.directlyOn;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
diff --git a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
index 91bfff2..2e8bac0 100644
--- a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
+++ b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java
@@ -20,11 +20,11 @@
 
 import org.junit.runners.model.InitializationError;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.manifest.AndroidManifest;
 import org.robolectric.res.Fs;
 import org.robolectric.res.ResourcePath;
-import org.robolectric.util.ActivityController;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.List;
@@ -79,35 +79,35 @@
 
     public static void getIncludedResourcePaths(String packageName, List<ResourcePath> paths) {
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./packages/apps/Settings/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/base/packages/SettingsLib/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/base/core/res/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/opt/setupwizard/library/main/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/opt/setupwizard/library/gingerbread/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/opt/setupwizard/library/recyclerview/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/support/v7/appcompat/res"),
                 null));
         paths.add(new ResourcePath(
-                packageName,
+                null,
                 Fs.fileFromPath("./frameworks/support/v7/cardview/res"),
                 null));
     }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
index c56438f..39fd028 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java
@@ -4,7 +4,7 @@
 
 import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.Shadows.shadowOf;
-import static org.robolectric.internal.Shadow.directlyOn;
+import static org.robolectric.shadow.api.Shadow.directlyOn;
 
 import android.annotation.DimenRes;
 import android.content.res.ColorStateList;
@@ -25,13 +25,13 @@
 import com.android.settings.R;
 
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.XmlResourceParserImpl;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.RealObject;
-import org.robolectric.internal.Shadow;
 import org.robolectric.res.StyleData;
 import org.robolectric.res.StyleResolver;
-import org.robolectric.res.builder.XmlResourceParserImpl;
+import org.robolectric.res.ThemeStyleSet;
 import org.robolectric.shadows.ShadowAssetManager;
 import org.robolectric.shadows.ShadowResources;
 import org.robolectric.util.ReflectionHelpers;
@@ -133,7 +133,7 @@
         if (override instanceof String) {
             return (String) override;
         }
-        return Shadow.directlyOn(
+        return directlyOn(
                 realResources, Resources.class, "getString", ClassParameter.from(int.class, id));
     }
 
@@ -143,7 +143,7 @@
         if (override instanceof Integer) {
             return (Integer) override;
         }
-        return Shadow.directlyOn(
+        return directlyOn(
                 realResources, Resources.class, "getInteger", ClassParameter.from(int.class, id));
     }
 
@@ -153,7 +153,7 @@
         if (override instanceof Boolean) {
             return (boolean) override;
         }
-        return Shadow.directlyOn(realResources, Resources.class, "getBoolean",
+        return directlyOn(realResources, Resources.class, "getBoolean",
                 ClassParameter.from(int.class, id));
     }
 
@@ -184,13 +184,16 @@
 
             // Track down all styles and remove all inheritance from private styles.
             ShadowAssetManager assetManager = shadowOf(RuntimeEnvironment.application.getAssets());
-            // The Object's below are actually ShadowAssetManager.OverlayedStyle. We can't use it
-            // here because it's package private.
-            Map<Long, List<Object>> appliedStylesList =
-                    ReflectionHelpers.getField(assetManager, "appliedStyles");
+            Map<Long, Object /* NativeTheme */> appliedStylesList =
+                    ReflectionHelpers.getField(assetManager, "nativeThemes");
             for (Long idx : appliedStylesList.keySet()) {
-                List<Object> appliedStyles = appliedStylesList.get(idx);
-                for (Object appliedStyle : appliedStyles) {
+                ThemeStyleSet appliedStyles = ReflectionHelpers.getField(
+                        appliedStylesList.get(idx), "themeStyleSet");
+                // The Object's below are actually ShadowAssetManager.OverlayedStyle. We can't use
+                // it here because it's private.
+                List<Object /* OverlayedStyle */> overlayedStyles =
+                        ReflectionHelpers.getField(appliedStyles, "styles");
+                for (Object appliedStyle : overlayedStyles) {
                     StyleResolver styleResolver = ReflectionHelpers.getField(appliedStyle, "style");
                     List<StyleData> styleDatas =
                             ReflectionHelpers.getField(styleResolver, "styles");
@@ -223,5 +226,9 @@
             return directlyOn(realTheme, Theme.class)
                     .resolveAttribute(resid, outValue, resolveRefs);
         }
+
+        private Resources getResources() {
+            return ReflectionHelpers.callInstanceMethod(ShadowTheme.class, this, "getResources");
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java
index b84cf42..d79e7aa 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java
@@ -25,7 +25,7 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
-import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowContextImpl;
 import org.robolectric.util.ReflectionHelpers;
 
@@ -96,7 +96,7 @@
     }
 
     public static ShadowFingerprintManager get() {
-        return (ShadowFingerprintManager) ShadowExtractor.extract(
+        return (ShadowFingerprintManager) Shadow.extract(
                 RuntimeEnvironment.application.getSystemService(FingerprintManager.class));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPackageMonitor.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPackageMonitor.java
index b93b035..5a5f076 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPackageMonitor.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPackageMonitor.java
@@ -28,8 +28,7 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.RealObject;
-import org.robolectric.internal.Shadow;
-import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowMessageQueue;
 
@@ -56,8 +55,8 @@
     }
 
     private static void setupBackgroundThreadScheduler() {
-        ShadowMessageQueue shadowMessageQueue = ((ShadowMessageQueue) ShadowExtractor.extract(
-                BackgroundThread.getHandler().getLooper().getQueue()));
+        ShadowMessageQueue shadowMessageQueue = Shadow.extract(
+                BackgroundThread.getHandler().getLooper().getQueue());
         shadowMessageQueue.setScheduler(
                 ShadowApplication.getInstance().getBackgroundThreadScheduler());
     }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
index 860ee11..4d4fd62 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -25,7 +25,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
-import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadow.api.Shadow;
 
 import java.util.Collections;
 import java.util.List;
@@ -63,7 +63,7 @@
     }
 
     public static ShadowUserManager getShadow() {
-        return (ShadowUserManager) ShadowExtractor.extract(
+        return (ShadowUserManager) Shadow.extract(
                 RuntimeEnvironment.application.getSystemService(UserManager.class));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
index dd93938..d8c0861 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
@@ -30,9 +30,9 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
-import org.robolectric.util.ActivityController;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
index 2a53ab6..73d001a 100644
--- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
+++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
@@ -36,6 +36,7 @@
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -66,11 +67,17 @@
 public class WebViewAppPickerTest {
     private Context mContext = RuntimeEnvironment.application;
 
-    private final static UserInfo FIRST_USER = new UserInfo(0, "FIRST_USER", 0);
-    private final static UserInfo SECOND_USER = new UserInfo(0, "SECOND_USER", 0);
+    private static UserInfo sFirstUser;
+    private static UserInfo sSecondUser;
 
     private final static String DEFAULT_PACKAGE_NAME = "DEFAULT_PACKAGE_NAME";
 
+    @BeforeClass
+    public static void beforeClass() {
+        sFirstUser = new UserInfo(0, "FIRST_USER", 0);
+        sSecondUser = new UserInfo(0, "SECOND_USER", 0);
+    }
+
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Activity mActivity;
     @Mock
@@ -261,14 +268,14 @@
         UserPackageWrapper packageForFirstUser = mock(UserPackageWrapper.class);
         when(packageForFirstUser.isEnabledPackage()).thenReturn(false);
         when(packageForFirstUser.isInstalledPackage()).thenReturn(true);
-        when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
+        when(packageForFirstUser.getUserInfo()).thenReturn(sFirstUser);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
         when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
                 .thenReturn(Arrays.asList(packageForFirstUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
-                "(disabled for user %s)", FIRST_USER.name);
+                "(disabled for user %s)", sFirstUser.name);
         assertThat(mPicker.getDisabledReason(wvusWrapper, mContext,
                 DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
@@ -278,14 +285,14 @@
         UserPackageWrapper packageForFirstUser = mock(UserPackageWrapper.class);
         when(packageForFirstUser.isEnabledPackage()).thenReturn(true);
         when(packageForFirstUser.isInstalledPackage()).thenReturn(false);
-        when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
+        when(packageForFirstUser.getUserInfo()).thenReturn(sFirstUser);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
         when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
                 .thenReturn(Arrays.asList(packageForFirstUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
-                "(uninstalled for user %s)", FIRST_USER.name);
+                "(uninstalled for user %s)", sFirstUser.name);
         assertThat(mPicker.getDisabledReason(wvusWrapper, mContext,
                 DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
@@ -295,19 +302,19 @@
         UserPackageWrapper packageForFirstUser = mock(UserPackageWrapper.class);
         when(packageForFirstUser.isEnabledPackage()).thenReturn(false);
         when(packageForFirstUser.isInstalledPackage()).thenReturn(true);
-        when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
+        when(packageForFirstUser.getUserInfo()).thenReturn(sFirstUser);
 
         UserPackageWrapper packageForSecondUser = mock(UserPackageWrapper.class);
         when(packageForSecondUser.isEnabledPackage()).thenReturn(true);
         when(packageForSecondUser.isInstalledPackage()).thenReturn(false);
-        when(packageForSecondUser.getUserInfo()).thenReturn(SECOND_USER);
+        when(packageForSecondUser.getUserInfo()).thenReturn(sSecondUser);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
         when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
                 .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
-                "(disabled for user %s)", FIRST_USER.name);
+                "(disabled for user %s)", sFirstUser.name);
         assertThat(mPicker.getDisabledReason(
                 wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
@@ -321,19 +328,19 @@
         UserPackageWrapper packageForFirstUser = mock(UserPackageWrapper.class);
         when(packageForFirstUser.isEnabledPackage()).thenReturn(false);
         when(packageForFirstUser.isInstalledPackage()).thenReturn(false);
-        when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
+        when(packageForFirstUser.getUserInfo()).thenReturn(sFirstUser);
 
         UserPackageWrapper packageForSecondUser = mock(UserPackageWrapper.class);
         when(packageForSecondUser.isEnabledPackage()).thenReturn(true);
         when(packageForSecondUser.isInstalledPackage()).thenReturn(true);
-        when(packageForSecondUser.getUserInfo()).thenReturn(SECOND_USER);
+        when(packageForSecondUser.getUserInfo()).thenReturn(sSecondUser);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
         when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
                 .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
-                "(uninstalled for user %s)", FIRST_USER.name);
+                "(uninstalled for user %s)", sFirstUser.name);
         assertThat(mPicker.getDisabledReason(wvusWrapper, mContext,
                 DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
diff --git a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java
index 297054d..16d883a 100644
--- a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java
@@ -44,6 +44,7 @@
 
 import com.google.common.collect.Lists;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -59,12 +60,16 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class UseOpenWifiPreferenceControllerTest {
-    private static ComponentName ENABLE_ACTIVITY_COMPONENT =
-            new ComponentName("package", "activityClass");
-    private static NetworkScorerAppData APP_DATA =
-            new NetworkScorerAppData(0, null, null, ENABLE_ACTIVITY_COMPONENT, null);
-    private static NetworkScorerAppData APP_DATA_NO_ACTIVITY =
-            new NetworkScorerAppData(0, null, null, null, null);
+    private static ComponentName sEnableActivityComponent;
+    private static NetworkScorerAppData sAppData;
+    private static NetworkScorerAppData sAppDataNoActivity;
+
+    @BeforeClass
+    public static void beforeClass() {
+        sEnableActivityComponent = new ComponentName("package", "activityClass");
+        sAppData = new NetworkScorerAppData(0, null, null, sEnableActivityComponent, null);
+        sAppDataNoActivity = new NetworkScorerAppData(0, null, null, null, null);
+    }
 
     @Mock private Lifecycle mLifecycle;
     @Mock private Fragment mFragment;
@@ -92,7 +97,7 @@
      */
     private void setupScorers(@NonNull List<NetworkScorerAppData> scorers) {
         when(mNetworkScoreManagerWrapper.getActiveScorerPackage()).thenReturn(
-                ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                sEnableActivityComponent.getPackageName());
         when(mNetworkScoreManagerWrapper.getAllValidScorers()).thenReturn(scorers);
         when(mNetworkScoreManagerWrapper.getActiveScorer()).thenReturn(scorers.get(0));
     }
@@ -106,7 +111,7 @@
 
     @Test
     public void testIsAvailable_returnsFalseWhenScorersNotSupported() {
-        setupScorers(Lists.newArrayList(APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppDataNoActivity));
         createController();
 
         assertThat(mController.isAvailable()).isFalse();
@@ -114,7 +119,7 @@
 
     @Test
     public void testIsAvailable_returnsTrueIfActiveScorerSupported() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         assertThat(mController.isAvailable()).isTrue();
@@ -122,8 +127,8 @@
 
     @Test
     public void testIsAvailable_returnsTrueIfNonActiveScorerSupported() {
-        setupScorers(Lists.newArrayList(APP_DATA_NO_ACTIVITY, APP_DATA));
-        when(mNetworkScoreManagerWrapper.getActiveScorer()).thenReturn(APP_DATA_NO_ACTIVITY);
+        setupScorers(Lists.newArrayList(sAppDataNoActivity, sAppData));
+        when(mNetworkScoreManagerWrapper.getActiveScorer()).thenReturn(sAppDataNoActivity);
         createController();
 
         assertThat(mController.isAvailable()).isTrue();
@@ -150,7 +155,7 @@
 
     @Test
     public void onPreferenceChange_matchingKeyAndAvailable_enableShouldStartEnableActivity() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         final SwitchPreference pref = new SwitchPreference(mContext);
@@ -160,15 +165,15 @@
         verify(mFragment).startActivityForResult(mIntentCaptor.capture(),
                 eq(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY));
         Intent activityIntent = mIntentCaptor.getValue();
-        assertThat(activityIntent.getComponent()).isEqualTo(ENABLE_ACTIVITY_COMPONENT);
+        assertThat(activityIntent.getComponent()).isEqualTo(sEnableActivityComponent);
         assertThat(activityIntent.getAction()).isEqualTo(NetworkScoreManager.ACTION_CUSTOM_ENABLE);
     }
 
     @Test
     public void onPreferenceChange_matchingKeyAndAvailable_disableShouldUpdateSetting() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE,
-                ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                sEnableActivityComponent.getPackageName());
 
         createController();
 
@@ -182,7 +187,7 @@
 
     @Test
     public void onActivityResult_nonmatchingRequestCode_shouldDoNothing() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         assertThat(mController.onActivityResult(234 /* requestCode */ , Activity.RESULT_OK))
@@ -193,7 +198,7 @@
 
     @Test
     public void onActivityResult_matchingRequestCode_nonOkResult_shouldDoNothing() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         assertThat(mController
@@ -205,24 +210,24 @@
 
     @Test
     public void onActivityResult_matchingRequestCode_okResult_updatesSetting() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         assertThat(mController
                 .onActivityResult(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY, Activity.RESULT_OK))
                 .isEqualTo(true);
         assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE))
-                .isEqualTo(ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                .isEqualTo(sEnableActivityComponent.getPackageName());
     }
 
     @Test
     public void updateState_noEnableActivity_preferenceDisabled_summaryChanged() {
-        setupScorers(Lists.newArrayList(APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppDataNoActivity));
         createController();
 
         final SwitchPreference preference = mock(SwitchPreference.class);
         Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE,
-                ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                sEnableActivityComponent.getPackageName());
 
         mController.updateState(preference);
 
@@ -238,7 +243,7 @@
 
         final SwitchPreference preference = mock(SwitchPreference.class);
         Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE,
-                ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                sEnableActivityComponent.getPackageName());
 
         mController.updateState(preference);
 
@@ -249,12 +254,12 @@
 
     @Test
     public void updateState_enableActivityExists_preferenceEnabled() {
-        setupScorers(Lists.newArrayList(APP_DATA, APP_DATA_NO_ACTIVITY));
+        setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity));
         createController();
 
         final SwitchPreference preference = mock(SwitchPreference.class);
         Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE,
-                ENABLE_ACTIVITY_COMPONENT.getPackageName());
+                sEnableActivityComponent.getPackageName());
 
         mController.updateState(preference);
 
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
index 0435b7e..29df539 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
@@ -23,7 +23,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.provider.Settings;
@@ -34,14 +33,12 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
-import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
