diff --git a/res/drawable/ic_find_device_disabled.xml b/res/drawable/ic_find_device_disabled.xml
index ac23101..0658707 100644
--- a/res/drawable/ic_find_device_disabled.xml
+++ b/res/drawable/ic_find_device_disabled.xml
@@ -14,24 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M5,20l0,2l14,0l0,-2z"
-        android:strokeColor="#00000000"
-        android:fillColor="#F09300"
-        android:strokeWidth="1"/>
-    <path
-        android:pathData="M12,5.917C13.15,5.917 14.083,6.85 14.083,8C14.083,8.613 13.813,9.158 13.392,9.542L16.417,12.567C17.229,11.017 17.833,9.404 17.833,8C17.833,4.779 15.221,2.167 12,2.167C10.35,2.167 8.863,2.854 7.804,3.954L10.458,6.608C10.837,6.188 11.387,5.917 12,5.917ZM15.646,13.917L11.792,10.063L11.7,9.971L4.725,3L3.667,4.063L6.317,6.713C6.221,7.125 6.167,7.554 6.167,8C6.167,12.375 12,18.833 12,18.833C12,18.833 13.392,17.292 14.813,15.208L17.604,18L18.667,16.938L15.646,13.917Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#F09300"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M14,10.5v9.06C12.87,21,12,22,12,22S5,14.25,5,9A7,7,0,0,1,18.93,8H14.29A2.5,2.5,0,1,0,14,10.5ZM16,22h2V20H16Zm0-4h2V10H16Z" />
 </vector>
diff --git a/res/drawable/ic_find_device_enabled.xml b/res/drawable/ic_find_device_enabled.xml
index c47b9f0..37c2bdc 100644
--- a/res/drawable/ic_find_device_enabled.xml
+++ b/res/drawable/ic_find_device_enabled.xml
@@ -14,19 +14,17 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M18,8C18,4.69 15.31,2 12,2C8.69,2 6,4.69 6,8C6,12.5 12,19 12,19C12,19 18,12.5 18,8ZM10,8C10,6.9 10.9,6 12,6C13.1,6 14,6.9 14,8C14,9.1 13.11,10 12,10C10.9,10 10,9.1 10,8ZM5,20L5,22L19,22L19,20L5,20Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#4A90E2"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M12,2 C8.13400675,2 5,5.13400675 5,9 C5,14.25 12,22 12,22 C12,22 19,14.25 19,9
+C19,5.13400675 15.8659932,2 12,2 L12,2 Z M8.2,9.66 L9.61,8.24 L11,9.66
+L15.24,5.42 L16.65,6.83 L11,12.49 L8.2,9.66 Z" />
 </vector>
diff --git a/res/drawable/ic_ota_update_available.xml b/res/drawable/ic_ota_update_available.xml
index e2d7f33..34d0a64 100644
--- a/res/drawable/ic_ota_update_available.xml
+++ b/res/drawable/ic_ota_update_available.xml
@@ -14,19 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3L5,21C5,22.1 5.9,23 7,23L17,23C18.1,23 19,22.1 19,21L19,3C19,1.9 18.1,1.01 17,1.01ZM17,19L7,19L7,5L17,5L17,19ZM16,13L13,13L13,8L11,8L11,13L8,13L12,17L16,13Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#4A90E2"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M17,1H7A2,2,0,0,0,5,3V21a2,2,0,0,0,2,2H17a2,2,0,0,0,2-2V3A2,2,0,0,0,17,1Zm0,18H7V5H17Zm-1-6H13V8H11v5H8l4,4Z" />
 </vector>
diff --git a/res/drawable/ic_ota_update_current.xml b/res/drawable/ic_ota_update_current.xml
index d7a2f84..6a1d7a4 100644
--- a/res/drawable/ic_ota_update_current.xml
+++ b/res/drawable/ic_ota_update_current.xml
@@ -14,19 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3L5,21C5,22.1 5.9,23 7,23L17,23C18.1,23 19,22.1 19,21L19,3C19,1.9 18.1,1.01 17,1.01ZM17,19L7,19L7,5L17,5L17,19ZM10.627,13.093L9.144,11.746L8.054,12.79L10.627,15.181L16.156,10.044L15.066,9L10.627,13.093Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#4A90E2"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M17,1H7A2,2,0,0,0,5,3V21a2,2,0,0,0,2,2H17a2,2,0,0,0,2-2V3A2,2,0,0,0,17,1ZM9.11,14.06h0l1.41,1.41,5.66-5.66-1.42-1.4-4.24,4.24L9.11,11.24,7.7,12.66ZM17,19H7V5H17Z" />
 </vector>
diff --git a/res/drawable/ic_ota_update_stale.xml b/res/drawable/ic_ota_update_stale.xml
index 9145be8..8e51a23 100644
--- a/res/drawable/ic_ota_update_stale.xml
+++ b/res/drawable/ic_ota_update_stale.xml
@@ -14,19 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3L5,21C5,22.1 5.9,23 7,23L17,23C18.1,23 19,22.1 19,21L19,3C19,1.9 18.1,1.01 17,1.01ZM17,19L7,19L7,5L17,5L17,19ZM16,13L13,13L13,8L11,8L11,13L8,13L12,17L16,13Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#F09300"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M17,1a2,2,0,0,1,2,2V21a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V3A2,2,0,0,1,7,1Zm0,18V5H7V19ZM11,6.5h2v7H11Zm0,9h2v2H11Z" />
 </vector>
diff --git a/res/drawable/ic_package_verifier_disabled.xml b/res/drawable/ic_package_verifier_disabled.xml
index 5f19fec..b4054f3 100644
--- a/res/drawable/ic_package_verifier_disabled.xml
+++ b/res/drawable/ic_package_verifier_disabled.xml
@@ -14,18 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M5.785,3.762L12,1L21,5L21,11C21,13.231 20.381,15.402 19.306,17.283L5.785,3.762ZM4.386,4.384L3,5L3,11C3,16.555 6.835,21.735 12,23C14.622,22.358 16.902,20.706 18.511,18.509L4.386,4.384Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#F09300"
-        android:strokeWidth="1"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M2.808,2.808l17.678,17.678l-1.01,1.01l-17.678,-17.678z"
-        android:strokeColor="#00000000"
-        android:fillColor="#F09300"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M13.45,11l2.12-2.12L14.16,7.5,12,9.62,9.91,7.5,8.5,8.91,10.62,11,8.5,13.16l1.41,1.41L12,12.45l2.12,2.12,1.41-1.41Zm8.1-7.11A16.54,16.54,0,0,1,22,7.77a16.65,16.65,0,0,1-.47,4,16.56,16.56,0,0,1-3.79,7.14A16.66,16.66,0,0,1,12,23,16.61,16.61,0,0,1,2.45,3.93,33.57,33.57,0,0,1,12,1a33.57,33.57,0,0,1,9.55,2.93Z" />
 </vector>
diff --git a/res/drawable/ic_package_verifier_enabled.xml b/res/drawable/ic_package_verifier_enabled.xml
index 1059442..90f1490 100644
--- a/res/drawable/ic_package_verifier_enabled.xml
+++ b/res/drawable/ic_package_verifier_enabled.xml
@@ -14,19 +14,15 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M0,0l24,0l0,24l-24,0z"
-        android:strokeColor="#000000"
-        android:fillColor="#00000000"
-        android:strokeWidth="1.33333335e-11"
-        android:strokeAlpha="0.00784313771"/>
+        android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
     <path
-        android:pathData="M12,1L3,5L3,11C3,16.55 6.84,21.74 12,23C17.16,21.74 21,16.55 21,11L21,5L12,1Z"
-        android:strokeColor="#00000000"
-        android:fillColor="#4A90E2"
-        android:strokeWidth="1"/>
+        android:fillColor="#000000"
+        android:pathData="M21.55,3.93A16.54,16.54,0,0,1,22,7.77a16.65,16.65,0,0,1-.47,4,16.56,16.56,0,0,1-3.79,7.14A16.66,16.66,0,0,1,12,23,16.61,16.61,0,0,1,2.45,3.93,33.57,33.57,0,0,1,12,1,33.57,33.57,0,0,1,21.55,3.93ZM15.27,8.41,9.61,14.07,11,15.49l5.66-5.66ZM9.61,11.24,8.2,12.66l1.41,1.41L11,12.66Z" />
 </vector>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 236ec29..102de7e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4539,8 +4539,8 @@
     <string name="power_wifi">Wi\u2011Fi</string>
     <!-- Label for power consumed by Bluetooth -->
     <string name="power_bluetooth">Bluetooth</string>
-    <!-- Label for power consumed by Cell idle -->
-    <string name="power_cell">Cell standby</string>
+    <!-- Label for power consumed by Mobile network idle -->
+    <string name="power_cell">Mobile network standby</string>
     <!-- Label for power consumed by Calling -->
     <string name="power_phone">Voice calls</string>
     <!-- Label for power consumed when Idle -->
@@ -8171,8 +8171,11 @@
     <!-- Summary for Bluetooth when disabled. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_disabled">Not visible to other devices</string>
 
-    <!-- Summary for Bluetooth when connected. [CHAR LIMIT=NONE] -->
-    <string name="bluetooth_connected_summary">Connected to </string>
+    <!-- Summary for Bluetooth when connected to one device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_connected_summary">Connected to <xliff:g name="device">%1$s</xliff:g></string>
+
+    <!-- Summary for Bluetooth when connected to multiple devices. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_connected_multiple_devices_summary">Connected to multiple devices</string>
 
     <!-- [CHAR LIMIT=60] Name of dev option called "System UI demo mode" -->
     <string name="demo_mode">System UI demo mode</string>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 54eb878..bec8863 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -80,11 +80,6 @@
         android:fragment="com.android.settings.webview.WebViewAppPicker" />
 
     <SwitchPreference
-        android:key="enable_webview_multiprocess"
-        android:title="@string/enable_webview_multiprocess"
-        android:summary="@string/enable_webview_multiprocess_desc" />
-
-    <SwitchPreference
         android:key="color_temperature"
         android:title="@string/color_temperature"
         android:summary="@string/color_temperature_desc" />
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 24320b3..21ead46 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -95,7 +95,7 @@
         CharSequence serviceName = getServiceName(getContext());
         mServicePreference.setSummary(serviceName);
         mOnLockScreenSwitchPreference.setChecked(Settings.Secure.getInt(
-                cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, 1) == 1);
+                cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, 0) == 1);
         if (TextUtils.equals(serviceName, getString(R.string.accessibility_no_service_selected))) {
             // If there's no service configured, enabling the shortcut will have no effect
             // It should already be disabled, but force the switch to off just in case
diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java
index 45938ae..804d645 100644
--- a/src/com/android/settings/applications/AppHeaderController.java
+++ b/src/com/android/settings/applications/AppHeaderController.java
@@ -52,15 +52,13 @@
     @IntDef({ActionType.ACTION_NONE,
             ActionType.ACTION_APP_INFO,
             ActionType.ACTION_APP_PREFERENCE,
-            ActionType.ACTION_STORE_DEEP_LINK,
             ActionType.ACTION_NOTIF_PREFERENCE})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ActionType {
         int ACTION_NONE = 0;
         int ACTION_APP_INFO = 1;
-        int ACTION_STORE_DEEP_LINK = 2;
-        int ACTION_APP_PREFERENCE = 3;
-        int ACTION_NOTIF_PREFERENCE = 4;
+        int ACTION_APP_PREFERENCE = 2;
+        int ACTION_NOTIF_PREFERENCE = 3;
     }
 
     public static final String PREF_KEY_APP_HEADER = "pref_app_header";
@@ -254,20 +252,6 @@
                 }
                 return;
             }
-            case ActionType.ACTION_STORE_DEEP_LINK: {
-                final Intent intent = new Intent(Intent.ACTION_SHOW_APP_INFO)
-                        .setPackage(getInstallerPackageName(mContext, mPackageName));
-                final Intent result = resolveIntent(intent);
-                if (result == null) {
-                    button.setVisibility(View.GONE);
-                } else {
-                    result.putExtra(Intent.EXTRA_PACKAGE_NAME, mPackageName);
-                    button.setImageResource(R.drawable.ic_sim_sd);
-                    button.setOnClickListener(v -> mFragment.startActivity(intent));
-                    button.setVisibility(View.VISIBLE);
-                }
-                return;
-            }
             case ActionType.ACTION_NOTIF_PREFERENCE: {
                 if (mAppNotifPrefIntent == null) {
                     button.setVisibility(View.GONE);
@@ -295,15 +279,6 @@
         }
     }
 
-    private String getInstallerPackageName(Context context, String packageName) {
-        try {
-            return context.getPackageManager().getInstallerPackageName(packageName);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Exception while retrieving the package installer of " + packageName, e);
-            return null;
-        }
-    }
-
     private Intent resolveIntent(Intent i) {
         ResolveInfo result = mContext.getPackageManager().resolveActivity(i, 0);
         if (result != null) {
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 09771f2..16621f4 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -415,8 +415,8 @@
                 .getApplicationFeatureProvider(activity)
                 .newAppHeaderController(this, mHeader.findViewById(R.id.app_snippet))
                 .setPackageName(mPackageName)
-                .setButtonActions(AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
-                        AppHeaderController.ActionType.ACTION_APP_PREFERENCE)
+                .setButtonActions(AppHeaderController.ActionType.ACTION_APP_PREFERENCE,
+                        AppHeaderController.ActionType.ACTION_NONE)
                 .styleActionBar(activity)
                 .bindAppHeaderButtons();
         prepareUninstallAndStop();
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index 22b21e4..6c41f83 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -21,13 +21,16 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.widget.Switch;
 import android.widget.Toast;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.widget.SwitchWidgetController;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.WirelessUtils;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -45,6 +48,7 @@
     private boolean mValidListener;
     private final LocalBluetoothAdapter mLocalAdapter;
     private final IntentFilter mIntentFilter;
+    private final RestrictionUtils mRestrictionUtils;
 
     private static final String EVENT_DATA_IS_BT_ON = "is_bluetooth_on";
     private static final int EVENT_UPDATE_INDEX = 0;
@@ -63,6 +67,13 @@
     public BluetoothEnabler(Context context, SwitchWidgetController switchWidget,
             MetricsFeatureProvider metricsFeatureProvider, LocalBluetoothManager manager,
             int metricsEvent) {
+        this(context, switchWidget, metricsFeatureProvider, manager, metricsEvent,
+                new RestrictionUtils());
+    }
+
+    public BluetoothEnabler(Context context, SwitchWidgetController switchWidget,
+            MetricsFeatureProvider metricsFeatureProvider, LocalBluetoothManager manager,
+            int metricsEvent, RestrictionUtils restrictionUtils) {
         mContext = context;
         mMetricsFeatureProvider = metricsFeatureProvider;
         mSwitchWidget = switchWidget;
@@ -79,6 +90,7 @@
             mLocalAdapter = manager.getBluetoothAdapter();
         }
         mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+        mRestrictionUtils = restrictionUtils;
     }
 
     public void setupSwitchController() {
@@ -90,15 +102,17 @@
     }
 
     public void resume(Context context) {
+        if (mContext != context) {
+            mContext = context;
+        }
+
+        maybeEnforceRestrictions();
+
         if (mLocalAdapter == null) {
             mSwitchWidget.setEnabled(false);
             return;
         }
 
-        if (mContext != context) {
-            mContext = context;
-        }
-
         // Bluetooth state is not sticky, so set it manually
         handleStateChanged(mLocalAdapter.getBluetoothState());
 
@@ -156,6 +170,10 @@
 
     @Override
     public boolean onSwitchToggled(boolean isChecked) {
+        if (maybeEnforceRestrictions()) {
+            return true;
+        }
+
         // Show toast message if Bluetooth is not allowed in airplane mode
         if (isChecked &&
                 !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_BLUETOOTH)) {
@@ -182,4 +200,29 @@
         mSwitchWidget.setEnabled(false);
         return true;
     }
+
+    /**
+     * Enforces user restrictions disallowing Bluetooth (or its configuration) if there are any.
+     *
+     * @return if there was any user restriction to enforce.
+     */
+    @VisibleForTesting
+    boolean maybeEnforceRestrictions() {
+        EnforcedAdmin admin = mRestrictionUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_BLUETOOTH);
+        if (admin == null) {
+            admin = mRestrictionUtils.checkIfRestrictionEnforced(
+                    mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH);
+        }
+        mSwitchWidget.setDisabledByAdmin(admin);
+        if (admin != null) {
+            mSwitchWidget.setChecked(false);
+            if (mSwitch != null) {
+                mSwitch.setEnabled(false);
+                mSwitch.setChecked(false);
+            }
+        }
+        return admin != null;
+    }
+
 }
diff --git a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
index f98a209..c071570 100644
--- a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.support.v7.preference.PreferenceScreen;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.lifecycle.LifecycleObserver;
@@ -26,9 +27,9 @@
 import com.android.settings.core.lifecycle.events.OnStart;
 import com.android.settings.core.lifecycle.events.OnStop;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
-import com.android.settings.widget.MasterSwitchPreference;
 import com.android.settings.widget.MasterSwitchController;
+import com.android.settings.widget.MasterSwitchPreference;
+import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 public class BluetoothMasterSwitchPreferenceController extends PreferenceController
@@ -41,12 +42,20 @@
     private MasterSwitchPreference mBtPreference;
     private BluetoothEnabler mBluetoothEnabler;
     private BluetoothSummaryUpdater mSummaryUpdater;
+    private RestrictionUtils mRestrictionUtils;
 
     public BluetoothMasterSwitchPreferenceController(Context context,
             LocalBluetoothManager bluetoothManager) {
+        this(context, bluetoothManager, new RestrictionUtils());
+    }
+
+    @VisibleForTesting
+    public BluetoothMasterSwitchPreferenceController(Context context,
+            LocalBluetoothManager bluetoothManager, RestrictionUtils restrictionUtils) {
         super(context);
         mBluetoothManager = bluetoothManager;
         mSummaryUpdater = new BluetoothSummaryUpdater(mContext, this, mBluetoothManager);
+        mRestrictionUtils = restrictionUtils;
     }
 
     @Override
@@ -56,7 +65,8 @@
         mBluetoothEnabler = new BluetoothEnabler(mContext,
             new MasterSwitchController(mBtPreference),
             FeatureFactory.getFactory(mContext).getMetricsFeatureProvider(), mBluetoothManager,
-            MetricsEvent.ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE);
+            MetricsEvent.ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE,
+            mRestrictionUtils);
     }
 
     @Override
diff --git a/src/com/android/settings/bluetooth/RestrictionUtils.java b/src/com/android/settings/bluetooth/RestrictionUtils.java
new file mode 100644
index 0000000..9c0c481
--- /dev/null
+++ b/src/com/android/settings/bluetooth/RestrictionUtils.java
@@ -0,0 +1,43 @@
+/*
+ * 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.bluetooth;
+
+import android.content.Context;
+import android.os.UserHandle;
+
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+/**
+ * A utility class to aid testing.
+ */
+public class RestrictionUtils {
+
+    public RestrictionUtils() {}
+
+    /**
+     *  Utility method to check if user restriction is enforced on the current user.
+     *
+     * <p> It helps with testing - override it to avoid calling static method which calls system
+     * API.
+     */
+    public EnforcedAdmin checkIfRestrictionEnforced(Context context, String restriction) {
+        return RestrictedLockUtils.checkIfRestrictionEnforced(
+                context, restriction, UserHandle.myUserId());
+    }
+
+}
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index dda984b..aca4809 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -14,13 +14,16 @@
 
 package com.android.settings.datausage;
 
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
+import static android.net.NetworkPolicy.WARNING_DISABLED;
+
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.Fragment;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
+import android.icu.text.NumberFormat;
 import android.net.NetworkPolicy;
 import android.net.NetworkTemplate;
 import android.os.Bundle;
@@ -42,8 +45,7 @@
 import com.android.settingslib.NetworkPolicyEditor;
 import com.android.settingslib.net.DataUsageController;
 
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-import static android.net.NetworkPolicy.WARNING_DISABLED;
+import java.text.ParseException;
 
 public class BillingCycleSettings extends DataUsageBase implements
         Preference.OnPreferenceChangeListener, DataUsageEditController {
@@ -246,7 +248,6 @@
             final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
             final long bytes = isLimit ? editor.getPolicyLimitBytes(template)
                     : editor.getPolicyWarningBytes(template);
-            final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
 
             if (bytes > 1.5f * GB_IN_BYTES) {
                 final String bytesText = formatText(bytes / (float) GB_IN_BYTES);
@@ -265,7 +266,7 @@
 
         private String formatText(float v) {
             v = Math.round(v * 100) / 100f;
-            return String.valueOf(v);
+            return NumberFormat.getInstance().format(v);
         }
 
         @Override
@@ -278,15 +279,20 @@
 
             final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE);
             final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
-            EditText bytesField = (EditText) mView.findViewById(R.id.bytes);
-            Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner);
+            EditText bytesField = mView.findViewById(R.id.bytes);
+            Spinner spinner = mView.findViewById(R.id.size_spinner);
 
             String bytesString = bytesField.getText().toString();
-            if (bytesString.isEmpty()) {
-                bytesString = "0";
+
+            double input = 0;
+            try {
+                input = NumberFormat.getInstance().parse(bytesString).doubleValue();
+            } catch (ParseException e) {
+                Log.w(TAG, "Failed to parse byte value " + bytesString);
             }
-            final long bytes = (long) (Float.valueOf(bytesString)
-                        * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
+
+            final long bytes = (long) (input
+                    * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
 
             // to fix the overflow problem
             final long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes);
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
index adf2938..a2fe07d 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
@@ -123,9 +123,6 @@
         boolean isStorageManagerChecked =
                 Settings.Secure.getInt(getContentResolver(),
                         Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED, 0) != 0;
-        // Using the setCheckedInternal means the checked status won't propagate through the
-        // listeners -- this will prevent us from accidentally causing a metrics event on resume.
-        mSwitchBar.setCheckedInternal(isStorageManagerChecked);
         mDaysToRetain.setEnabled(isStorageManagerChecked);
     }
 
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
index a648102..8ab1a07 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
@@ -52,6 +52,17 @@
         mDaysToRetainPreference = Preconditions.checkNotNull(daysToRetainPreference);
         mFragmentManager = Preconditions.checkNotNull(fragmentManager);
 
+        initializeCheckedStatus();
+    }
+
+    private void initializeCheckedStatus() {
+        boolean isStorageManagerChecked =
+                Settings.Secure.getInt(
+                                mContext.getContentResolver(),
+                                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+                                0)
+                        != 0;
+        mSwitchBar.setChecked(isStorageManagerChecked);
         mSwitchBar.addOnSwitchChangeListener(this);
     }
 
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index bfb9f0f..583a5eb 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -127,7 +127,6 @@
     private static final String ENABLE_TERMINAL = "enable_terminal";
     private static final String KEEP_SCREEN_ON = "keep_screen_on";
     private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log";
-    private static final String WEBVIEW_MULTIPROCESS_KEY = "enable_webview_multiprocess";
     private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable";
     private static final String HDCP_CHECKING_KEY = "hdcp_checking";
     private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
@@ -319,7 +318,6 @@
     private ListPreference mOverlayDisplayDevices;
 
     private WebViewAppPreferenceController mWebViewAppPrefController;
-    private SwitchPreference mWebViewMultiprocess;
 
     private ListPreference mSimulateColorSpace;
 
@@ -497,7 +495,6 @@
             mLogpersist = null;
         }
         mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
-        mWebViewMultiprocess = findAndInitSwitchPref(WEBVIEW_MULTIPROCESS_KEY);
         mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
         mBluetoothEnableInbandRinging = findAndInitSwitchPref(BLUETOOTH_ENABLE_INBAND_RINGING_KEY);
         if (!BluetoothHeadset.isInbandRingingSupported(getContext())) {
@@ -814,7 +811,6 @@
         updateForceResizableOptions();
         Preference webViewAppPref = findPreference(mWebViewAppPrefController.getPreferenceKey());
         mWebViewAppPrefController.updateState(webViewAppPref);
-        updateWebViewMultiprocessOptions();
         updateOemUnlockOptions();
         if (mColorTemperaturePreference != null) {
             updateColorTemperature();
@@ -852,21 +848,6 @@
         pokeSystemProperties();
     }
 
-    private void updateWebViewMultiprocessOptions() {
-        try {
-            updateSwitchPreference(mWebViewMultiprocess,
-                                   mWebViewUpdateService.isMultiProcessEnabled());
-        } catch (RemoteException e) {
-        }
-    }
-
-    private void writeWebViewMultiprocessOptions() {
-        try {
-            mWebViewUpdateService.enableMultiProcess(mWebViewMultiprocess.isChecked());
-        } catch (RemoteException e) {
-        }
-    }
-
     private void updateHdcpValues() {
         ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
         if (hdcpChecking != null) {
@@ -2551,8 +2532,6 @@
             writeBluetoothDisableAbsVolumeOptions();
         } else if (preference == mBluetoothEnableInbandRinging) {
             writeBluetoothEnableInbandRingingOptions();
-        } else if (preference == mWebViewMultiprocess) {
-            writeWebViewMultiprocessOptions();
         } else if (SHORTCUT_MANAGER_RESET_KEY.equals(preference.getKey())) {
             resetShortcutManagerThrottling();
         } else {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
index a8e119d..b6d50ce 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java
@@ -53,8 +53,18 @@
             Bundle savedInstanceState) {
         final StorageManager storage = getActivity().getSystemService(StorageManager.class);
         final String fsUuid = getArguments().getString(VolumeRecord.EXTRA_FS_UUID);
+        // Passing null will crash the StorageManager, so let's early exit.
+        if (fsUuid == null) {
+            getActivity().finish();
+            return null;
+        }
         mRecord = storage.findRecordByUuid(fsUuid);
 
+        if (mRecord == null) {
+            getActivity().finish();
+            return null;
+        }
+
         final View view = inflater.inflate(R.layout.storage_internal_forget, container, false);
         final TextView body = (TextView) view.findViewById(R.id.body);
         final Button confirm = (Button) view.findViewById(R.id.confirm);
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index f7bb95d..2a5ac17 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.app.LoaderManager;
 import android.content.Context;
-import android.content.Intent;
 import android.content.Loader;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -29,16 +28,11 @@
 import android.os.storage.VolumeInfo;
 import android.provider.SearchIndexableResource;
 import android.support.annotation.VisibleForTesting;
-import android.util.Log;
 import android.util.SparseArray;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.applications.UserManagerWrapper;
 import com.android.settings.applications.UserManagerWrapperImpl;
@@ -58,7 +52,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Objects;
 
 public class StorageDashboardFragment extends DashboardFragment
     implements LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
@@ -101,8 +94,7 @@
         final long usedBytes = totalSize - mVolume.getPath().getFreeSpace();
         mSummaryController.updateBytes(usedBytes, totalSize);
         mPreferenceController.setVolume(mVolume);
-        mPreferenceController.setSystemSize(systemSize);
-
+        mPreferenceController.setUsedSize(usedBytes);
         mPreferenceController.setTotalSize(totalSize);
         for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
             PreferenceController controller = mSecondaryUsers.get(i);
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 36694f0..5c4e354 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -78,7 +78,7 @@
     private final StorageVolumeProvider mSvp;
     private VolumeInfo mVolume;
     private int mUserId;
-    private long mSystemSize;
+    private long mUsedBytes;
     private long mTotalSize;
 
     private StorageItemPreference mPhotoPreference;
@@ -226,17 +226,29 @@
         mGamePreference.setStorageSize(data.gamesSize, mTotalSize);
         mMoviesPreference.setStorageSize(data.videoAppsSize, mTotalSize);
         mAppPreference.setStorageSize(data.otherAppsSize, mTotalSize);
-        if (mSystemPreference != null) {
-            mSystemPreference.setStorageSize(mSystemSize + data.systemSize, mTotalSize);
-        }
 
-        long unattributedBytes = data.externalStats.totalBytes - data.externalStats.audioBytes
-                - data.externalStats.videoBytes - data.externalStats.imageBytes;
-        mFilePreference.setStorageSize(unattributedBytes, mTotalSize);
+        long unattributedExternalBytes =
+                data.externalStats.totalBytes
+                        - data.externalStats.audioBytes
+                        - data.externalStats.videoBytes
+                        - data.externalStats.imageBytes;
+        mFilePreference.setStorageSize(unattributedExternalBytes, mTotalSize);
+
+        // We define the system size as everything we can't classify.
+        if (mSystemPreference != null) {
+            mSystemPreference.setStorageSize(
+                    mUsedBytes
+                            - data.externalStats.totalBytes
+                            - data.musicAppsSize
+                            - data.gamesSize
+                            - data.videoAppsSize
+                            - data.otherAppsSize,
+                    mTotalSize);
+        }
     }
 
-    public void setSystemSize(long systemSizeBytes) {
-        mSystemSize = systemSizeBytes;
+    public void setUsedSize(long usedSizeBytes) {
+        mUsedBytes = usedSizeBytes;
     }
 
     public void setTotalSize(long totalSizeBytes) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 722f4ad..b718f8f 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -60,7 +60,6 @@
     final int[] mUsageTypes = {
             UsageType.WIFI,
             UsageType.CELL,
-            UsageType.SERVICE,
             UsageType.SYSTEM,
             UsageType.BLUETOOTH,
             UsageType.USER,
@@ -207,10 +206,9 @@
             return UsageType.UNACCOUNTED;
         } else if (drainType == DrainType.OVERCOUNTED) {
             return UsageType.OVERCOUNTED;
-        } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)) {
+        } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)
+                || mPowerUsageFeatureProvider.isTypeService(sipper)) {
             return UsageType.SYSTEM;
-        } else if (mPowerUsageFeatureProvider.isTypeService(sipper)) {
-            return UsageType.SERVICE;
         } else {
             return UsageType.APP;
         }
@@ -328,7 +326,6 @@
         @IntDef({UsageType.APP,
                 UsageType.WIFI,
                 UsageType.CELL,
-                UsageType.SERVICE,
                 UsageType.SYSTEM,
                 UsageType.BLUETOOTH,
                 UsageType.USER,
@@ -339,13 +336,12 @@
             int APP = 0;
             int WIFI = 1;
             int CELL = 2;
-            int SERVICE = 3;
-            int SYSTEM = 4;
-            int BLUETOOTH = 5;
-            int USER = 6;
-            int IDLE = 7;
-            int UNACCOUNTED = 8;
-            int OVERCOUNTED = 9;
+            int SYSTEM = 3;
+            int BLUETOOTH = 4;
+            int USER = 5;
+            int IDLE = 6;
+            int UNACCOUNTED = 7;
+            int OVERCOUNTED = 8;
         }
 
         @StringRes
@@ -379,8 +375,6 @@
                     return R.string.power_wifi;
                 case UsageType.CELL:
                     return R.string.power_cell;
-                case UsageType.SERVICE:
-                    return R.string.power_service;
                 case UsageType.SYSTEM:
                     return R.string.power_system;
                 case UsageType.BLUETOOTH:
diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java
index b7bf3dc..5436901 100644
--- a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java
+++ b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.support.v7.preference.Preference;
+import android.text.BidiFormatter;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 
@@ -76,12 +77,15 @@
             return;
         }
 
+        final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+
         String summary = null;
         for (String label : labels) {
             if (summary == null) {
-                summary = label;
+                summary = bidiFormatter.unicodeWrap(label);
             } else {
-                summary = mContext.getString(R.string.join_many_items_middle, summary, label);
+                summary = mContext.getString(R.string.join_many_items_middle, summary,
+                        bidiFormatter.unicodeWrap(label));
             }
         }
         preference.setSummary(summary);
diff --git a/src/com/android/settings/wifi/LinkablePreference.java b/src/com/android/settings/wifi/LinkablePreference.java
index 5bf51ed..9a6b11a 100644
--- a/src/com/android/settings/wifi/LinkablePreference.java
+++ b/src/com/android/settings/wifi/LinkablePreference.java
@@ -21,6 +21,7 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.text.Spannable;
+import android.text.method.LinkMovementMethod;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.widget.TextView;
@@ -81,6 +82,7 @@
                     mContentTitle.length(),
                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
             textView.setText(boldSpan);
+            textView.setMovementMethod(new LinkMovementMethod());
         }
     }
 
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index a87bd19..66e8c54 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -340,19 +340,13 @@
         mWifiTracker.startTracking();
 
         if (!isUiRestricted() && mWifiManager.isWifiEnabled()) {
-            forceUpdateAPs();
-        }
-    }
+            setProgressBarVisible(true);
+            mWifiTracker.forceUpdate();
+            if (DEBUG) Log.d(TAG, "WifiSettings onStart APs: " + mWifiTracker.getAccessPoints());
 
-    private void forceUpdateAPs() {
-        setProgressBarVisible(true);
-        mWifiTracker.forceUpdate();
-        if (DEBUG) {
-            Log.d(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
+            getView().removeCallbacks(mUpdateAccessPointsRunnable);
+            updateAccessPointPreferences();
         }
-
-        getView().removeCallbacks(mUpdateAccessPointsRunnable);
-        updateAccessPointPreferences();
     }
 
     /**
@@ -667,7 +661,7 @@
         final int wifiState = mWifiManager.getWifiState();
         switch (wifiState) {
             case WifiManager.WIFI_STATE_ENABLED:
-                forceUpdateAPs();
+                updateAccessPointsDelayed();
                 break;
 
             case WifiManager.WIFI_STATE_ENABLING:
diff --git a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
index 37a7521..8b9b4b4 100644
--- a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
@@ -18,7 +18,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.Matchers.eq;
@@ -172,25 +171,6 @@
     }
 
     @Test
-    public void bindButton_noStoreLink_shouldNotShowButton() {
-        final View appLinks = mLayoutInflater
-                .inflate(R.layout.app_details, null /* root */);
-        when(mContext.getPackageManager().resolveActivity(any(Intent.class), anyInt()))
-                .thenReturn(null);
-
-        mController = new AppHeaderController(mContext, mFragment, appLinks);
-        mController.setButtonActions(
-                AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
-                AppHeaderController.ActionType.ACTION_NONE);
-        mController.done(mActivity);
-
-        assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
-                .isEqualTo(View.GONE);
-        assertThat(appLinks.findViewById(R.id.right_button).getVisibility())
-                .isEqualTo(View.GONE);
-    }
-
-    @Test
     public void bindButton_noAppInfo_shouldNotShowButton() {
         final View appLinks = mLayoutInflater
                 .inflate(R.layout.app_details, null /* root */);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
index 7761afc..074bef2 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
@@ -15,12 +15,15 @@
  */
 package com.android.settings.bluetooth;
 
+import android.content.ComponentName;
 import android.content.Context;
+import android.os.UserManager;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.widget.MasterSwitchController;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 import org.junit.Before;
@@ -30,30 +33,108 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 
+import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertEquals;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BluetoothEnablerTest {
 
+    private static final EnforcedAdmin FAKE_ENFORCED_ADMIN =
+            new EnforcedAdmin(new ComponentName("test.package", "test.Class"), 10);
+
     @Mock
     private MetricsFeatureProvider mMetricsFeatureProvider;
     @Mock
     private Context mContext;
+    @Mock
+    private MasterSwitchController mMasterSwitchController;
+    @Mock
+    private RestrictionUtils mRestrictionUtils;
+
+    private BluetoothEnabler mBluetoothEnabler;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mBluetoothEnabler = new BluetoothEnabler(
+                mContext,
+                mMasterSwitchController,
+                mMetricsFeatureProvider,
+                mock(LocalBluetoothManager.class),
+                123,
+                mRestrictionUtils);
     }
 
     @Test
     public void onSwitchToggled_shouldLogActionWithSuppliedEvent() {
-        BluetoothEnabler bluetoothEnabler = new BluetoothEnabler(mContext,
-            mock(MasterSwitchController.class), mMetricsFeatureProvider,
-            mock(LocalBluetoothManager.class), 123);
-        bluetoothEnabler.onSwitchToggled(false);
+        // WHEN the switch is toggled...
+        mBluetoothEnabler.onSwitchToggled(false);
 
+        // THEN the corresponding metrics action is logged.
         verify(mMetricsFeatureProvider).action(mContext, 123, false);
     }
+
+    @Test
+    public void maybeEnforceRestrictions_noRestrictions() {
+        // GIVEN there are no restrictions set...
+        when(mRestrictionUtils.checkIfRestrictionEnforced(any(Context.class), any(String.class)))
+                .thenReturn(null);
+
+        // WHEN the maybeEnforceRestrictions is called...
+        // THEN false is returned to indicate there was no restriction to enforce
+        assertThat(mBluetoothEnabler.maybeEnforceRestrictions()).isFalse();
+
+        // THEN a null EnfoceAdmin is set.
+        verify(mMasterSwitchController).setDisabledByAdmin(null);
+        // THEN the state of the switch isn't changed.
+        verify(mMasterSwitchController, never()).setChecked(anyBoolean());
+    }
+
+    @Test
+    public void maybeEnforceRestrictions_disallowBluetoothRestrictionSet() {
+        // GIVEN Bluetooth has been disallowed...
+        when(mRestrictionUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+        when(mRestrictionUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(null);
+
+        // 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);
+
+        // THEN the switch is unchecked.
+        verify(mMasterSwitchController).setChecked(false);
+    }
+
+    @Test
+    public void maybeEnforceRestrictions_disallowConfigBluetoothRestrictionSet() {
+        // GIVEN configuring Bluetooth has been disallowed...
+        when(mRestrictionUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_BLUETOOTH)).thenReturn(null);
+        when(mRestrictionUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_CONFIG_BLUETOOTH)).thenReturn(FAKE_ENFORCED_ADMIN);
+
+        // 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);
+
+        // THEN the switch is unchecked.
+        verify(mMasterSwitchController).setChecked(false);
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
index 0e39c5d..177130e 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
@@ -52,6 +52,8 @@
     private PreferenceScreen mScreen;
     @Mock
     private MasterSwitchPreference mPreference;
+    @Mock
+    private RestrictionUtils mRestrictionUtils;
 
     private Context mContext;
     private BluetoothMasterSwitchPreferenceController mController;
@@ -60,7 +62,8 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application.getApplicationContext();
-        mController = new BluetoothMasterSwitchPreferenceController(mContext, mBluetoothManager);
+        mController = new BluetoothMasterSwitchPreferenceController(
+                mContext, mBluetoothManager, mRestrictionUtils);
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
     }
 
diff --git a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
index b4f5f3d..be04eec 100644
--- a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.deletionhelper;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -27,6 +29,7 @@
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.content.Context;
+import android.provider.Settings;
 import android.support.v7.preference.Preference;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -121,4 +124,41 @@
         verify(mFragmentManager.beginTransaction(), never())
                 .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
     }
+
+    @Test
+    public void initializeSwitchOnConstruction() {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+                1);
+
+        mController =
+                new AutomaticStorageManagerSwitchBarController(
+                        mContext,
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mPreference,
+                        mFragmentManager);
+
+        assertThat(mSwitchBar.isChecked()).isTrue();
+    }
+
+    @Test
+    public void initializingSwitchDoesNotTriggerView() {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+                1);
+
+        mController =
+                new AutomaticStorageManagerSwitchBarController(
+                        mContext,
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mPreference,
+                        mFragmentManager);
+
+        verify(mFragmentManager.beginTransaction(), never())
+                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 47faf92..2231c22 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -242,21 +242,19 @@
                 eq(StorageItemPreferenceController.FILES_KEY))).thenReturn(files);
         mController.displayPreference(screen);
 
-        mController.setSystemSize(KILOBYTE * 6);
+        mController.setUsedSize(KILOBYTE * 200); // There should 87kB attributed.
         StorageAsyncLoader.AppsStorageResult result = new StorageAsyncLoader.AppsStorageResult();
         result.gamesSize = KILOBYTE * 8;
         result.videoAppsSize = KILOBYTE * 16;
         result.musicAppsSize = KILOBYTE * 4;
         result.otherAppsSize = KILOBYTE * 9;
-        result.systemSize = KILOBYTE * 10;
+        result.systemSize = KILOBYTE * 10; // This value is ignored and overriden now.
         result.externalStats = new StorageStatsSource.ExternalStorageStats(
                 KILOBYTE * 50, // total
                 KILOBYTE * 10, // audio
                 KILOBYTE * 15, // video
                 KILOBYTE * 20); // image
 
-        result.gamesSize = KILOBYTE * 8;
-        result.otherAppsSize = KILOBYTE * 9;
         mController.onLoadFinished(result);
 
         assertThat(audio.getSummary().toString()).isEqualTo("14.00KB"); // 4KB apps + 10KB files
@@ -264,7 +262,7 @@
         assertThat(games.getSummary().toString()).isEqualTo("8.00KB");
         assertThat(movies.getSummary().toString()).isEqualTo("16.00KB");
         assertThat(apps.getSummary().toString()).isEqualTo("9.00KB");
-        assertThat(system.getSummary().toString()).isEqualTo("16.00KB");
+        assertThat(system.getSummary().toString()).isEqualTo("113KB");
         assertThat(files.getSummary().toString()).isEqualTo("5.00KB");
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 66d2c1a..41b1c96 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -140,13 +140,13 @@
     }
 
     @Test
-    public void testExtractUsageType_TypeService_ReturnService() {
+    public void testExtractUsageType_TypeService_ReturnSystem() {
         mNormalBatterySipper.drainType = DrainType.APP;
         when(mNormalBatterySipper.getUid()).thenReturn(FAKE_UID_1);
         when(mPowerUsageFeatureProvider.isTypeService(any())).thenReturn(true);
 
         assertThat(mPowerUsageAdvanced.extractUsageType(mNormalBatterySipper))
-                .isEqualTo(UsageType.SERVICE);
+                .isEqualTo(UsageType.SYSTEM);
     }
 
     @Test
@@ -210,8 +210,8 @@
         final int[] usageTypeSet = mPowerUsageAdvanced.mUsageTypes;
 
         assertThat(usageTypeSet).asList().containsExactly(UsageType.APP, UsageType.WIFI,
-                UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.SERVICE,
-                UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED);
+                UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.USER,
+                UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
index 3256950..1332445 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
@@ -18,6 +18,8 @@
 
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -26,6 +28,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.support.v4.text.BidiFormatter;
 import android.support.v7.preference.Preference;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -39,6 +42,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
@@ -96,4 +100,35 @@
 
         verify(mPreference).setSummary("label");
     }
+
+    @Test
+    public void updateState_multiImeWithMixedLocale_setImeLabelToSummary() {
+        final BidiFormatter formatter = BidiFormatter.getInstance();
+        final ComponentName componentName = new ComponentName("pkg", "cls");
+        final List<InputMethodInfo> imis = new ArrayList<>();
+        final String label1 = "label";
+        final String label2 = "Keyboard מִקְלֶדֶת";
+        imis.add(mock(InputMethodInfo.class));
+        imis.add(mock(InputMethodInfo.class));
+
+        when(mDpm.getPermittedInputMethodsForCurrentUser()).thenReturn(null);
+        when(mImm.getEnabledInputMethodList()).thenReturn(imis);
+        when(imis.get(0).getPackageName()).thenReturn(componentName.getPackageName());
+        when(imis.get(0).loadLabel(mPm)).thenReturn(label1);
+        when(imis.get(1).getPackageName()).thenReturn(componentName.getPackageName());
+        when(imis.get(1).loadLabel(mPm)).thenReturn(label2);
+        when(mContext.getString(eq(R.string.join_many_items_middle), anyString(), anyString()))
+                .thenAnswer(invocation -> {
+                    final Object[] args = invocation.getArguments();
+                    final String str1 = (String) args[1];
+                    final String str2 = (String) args[2];
+                    return RuntimeEnvironment.application.getString(R.string.join_many_items_middle,
+                            str1, str2);
+                });
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setSummary(
+                formatter.unicodeWrap(label1) + ", " + formatter.unicodeWrap(label2));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
index 4267ed1..4ee42e0 100644
--- a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java
@@ -16,16 +16,17 @@
 package com.android.settings.utils;
 
 
-import com.android.settings.TestConfig;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-@RunWith(RobolectricTestRunner.class)
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+
+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 ThreadUtilsTest {
 
diff --git a/tests/robotests/src/com/android/settings/wifi/LinkablePreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/LinkablePreferenceTest.java
new file mode 100644
index 0000000..96cb217
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/LinkablePreferenceTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.settings.LinkifyUtils;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+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 LinkablePreferenceTest {
+
+    private static final String TITLE = "Title";
+
+    private Context mContext = RuntimeEnvironment.application;
+
+    private LinkablePreference mPreference;
+    private PreferenceViewHolder mHolder;
+    private View mView;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mPreference = new LinkablePreference(mContext);
+        final CharSequence linkableDescription =
+                mContext.getResources().getText(R.string.wifi_scan_notify_text);
+        final LinkifyUtils.OnClickListener clickListener = () -> {/* Do nothing */ };
+        mPreference.setText(TITLE, linkableDescription, clickListener);
+
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        mView = inflater.inflate(
+                mPreference.getLayoutResource(), new LinearLayout(mContext), false);
+        mHolder = PreferenceViewHolder.createInstanceForTests(mView);
+
+        mPreference.onBindViewHolder(mHolder);
+    }
+
+    @Test
+    public void prefWithLinkShouldHaveAccessibilityMovementMethodSet() {
+        TextView textView = mView.findViewById(android.R.id.title);
+        assertThat(textView.getMovementMethod()).isNotNull();
+    }
+}
diff --git a/tests/unit/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java b/tests/unit/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
new file mode 100644
index 0000000..be36e43
--- /dev/null
+++ b/tests/unit/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.Intent;
+import android.content.Context;
+
+import android.os.storage.VolumeRecord;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.settings.Settings;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PrivateVolumeForgetTest {
+    @Rule
+    public ActivityTestRule<Settings.PrivateVolumeForgetActivity> mActivityRule =
+            new ActivityTestRule<>(Settings.PrivateVolumeForgetActivity.class, true, true);
+
+    @Test
+    public void test_invalidSetupDoesNotCrashSettings() {
+        Context targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        Intent intent = new Intent(targetContext, Settings.PrivateVolumeForgetActivity.class);
+        intent.putExtra(VolumeRecord.EXTRA_FS_UUID, "totally-fake-uuid-doesnt-even-fit-format");
+        mActivityRule.launchActivity(intent);
+
+        // Should exit gracefully without crashing.
+    }
+}
\ No newline at end of file
