Merge "Make summary text update after settings changes" into pi-dev
diff --git a/res/drawable/ic_battery_alert_24dp.xml b/res/drawable/ic_battery_alert_24dp.xml
index cadd882..5a512f7 100644
--- a/res/drawable/ic_battery_alert_24dp.xml
+++ b/res/drawable/ic_battery_alert_24dp.xml
@@ -21,5 +21,8 @@
         android:tint="?android:attr/colorError">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M15.67,4L14,4L14,2h-4v2L8.33,4C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33L17,5.33C17,4.6 16.4,4 15.67,4zM13,18h-2v-2h2v2zM13,14h-2L11,9h2v5z"/>
+        android:pathData="M13,17h-2v-2h2V17zM13,13h-2V8h2V13z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
 </vector>
diff --git a/res/drawable/ic_battery_charging_full.xml b/res/drawable/ic_battery_charging_full.xml
index c2a614e..8308532 100644
--- a/res/drawable/ic_battery_charging_full.xml
+++ b/res/drawable/ic_battery_charging_full.xml
@@ -19,6 +19,9 @@
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
-        android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4zM11,20v-5.5H9L13,7v5.5h2L11,20z"
-        android:fillColor="#000000"/>
+        android:fillColor="#FF000000"
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M11.17,18.42v-4.58H9.5l3.33,-6.25v4.58h1.67L11.17,18.42z"/>
 </vector>
diff --git a/res/drawable/ic_battery_saver_accent_24dp.xml b/res/drawable/ic_battery_saver_accent_24dp.xml
new file mode 100644
index 0000000..c8def54
--- /dev/null
+++ b/res/drawable/ic_battery_saver_accent_24dp.xml
@@ -0,0 +1,29 @@
+<!--
+  Copyright (C) 2018 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.
+  -->
+
+<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:tint="?android:attr/colorAccent">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M15,14l-2,0l0,2l-2,0l0,-2l-2,0l0,-2l2,0l0,-2l2,0l0,2l2,0z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
+</vector>
diff --git a/res/drawable/ic_battery_status_bad_24dp.xml b/res/drawable/ic_battery_status_bad_24dp.xml
index 167d2fe..d841f08 100644
--- a/res/drawable/ic_battery_status_bad_24dp.xml
+++ b/res/drawable/ic_battery_status_bad_24dp.xml
@@ -18,9 +18,10 @@
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
         android:fillColor="?attr/batteryBadColor"
-        android:pathData="M15.78,4h-1.72V2h-4.04v2H8.31C7.61,4,7,4.6,7,5.3v15.3C7,21.4,7.61,22,8.31,22h7.37c0.71,0,1.31-0.6,1.31-1.3V5.3
-		C17.09,4.6,16.48,4,15.78,4z M15,14h-2v2h-2v-2H9v-2h2v-2h2v2h2V14z"/>
+        android:pathData="M15,14l-2,0l0,2l-2,0l0,-2l-2,0l0,-2l2,0l0,-2l2,0l0,2l2,0z"/>
+    <path
+        android:fillColor="?attr/batteryBadColor"
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
 </vector>
diff --git a/res/drawable/ic_battery_status_good_24dp.xml b/res/drawable/ic_battery_status_good_24dp.xml
index 1f29023..4628ee5 100644
--- a/res/drawable/ic_battery_status_good_24dp.xml
+++ b/res/drawable/ic_battery_status_good_24dp.xml
@@ -18,9 +18,10 @@
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
         android:fillColor="?attr/batteryGoodColor"
-        android:pathData="M15.78,4h-1.72V2h-4.04v2H8.31C7.61,4,7,4.6,7,5.3v15.3C7,21.4,7.61,22,8.31,22h7.37c0.71,0,1.31-0.6,1.31-1.3V5.3
-		C17.09,4.6,16.48,4,15.78,4z M10.94,16.37l-3.18-3.18l1.42-1.42l1.77,1.76l3.9-3.9l1.42,1.42L10.94,16.37z"/>
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
+    <path
+        android:fillColor="?attr/batteryGoodColor"
+        android:pathData="M16.1,11.1l-1.4,-1.5l-3.9,3.9l-1.5,-1.4l-1.4,1.4l2.9,2.9z"/>
 </vector>
diff --git a/res/drawable/ic_battery_status_maybe_24dp.xml b/res/drawable/ic_battery_status_maybe_24dp.xml
index 0289c92..64451be 100644
--- a/res/drawable/ic_battery_status_maybe_24dp.xml
+++ b/res/drawable/ic_battery_status_maybe_24dp.xml
@@ -18,9 +18,10 @@
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
         android:fillColor="?attr/batteryMaybeColor"
-        android:pathData="M15.78,4h-1.72V2h-4.04v2H8.31C7.61,4,7,4.6,7,5.3v15.3C7,21.4,7.61,22,8.31,22h7.37c0.71,0,1.31-0.6,1.31-1.3V5.3
-		C17.09,4.6,16.48,4,15.78,4z M13,17.5h-2v-2h2V17.5z M13,13.5h-2v-5h2V13.5z"/>
+        android:pathData="M13,17h-2v-2h2V17zM13,13h-2V8h2V13z"/>
+    <path
+        android:fillColor="?attr/batteryMaybeColor"
+        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
 </vector>
diff --git a/res/drawable/ic_folder_vd_theme_24.xml b/res/drawable/ic_folder_vd_theme_24.xml
index 0d27773..34e301f 100644
--- a/res/drawable/ic_folder_vd_theme_24.xml
+++ b/res/drawable/ic_folder_vd_theme_24.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="@android:color/white"
-        android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z"/>
-</vector>
\ No newline at end of file
+        android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM20,18H4V8h16V18z"/>
+</vector>
diff --git a/res/drawable/ic_media_stream_off.xml b/res/drawable/ic_media_stream_off.xml
new file mode 100644
index 0000000..c8d5978
--- /dev/null
+++ b/res/drawable/ic_media_stream_off.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2018 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.
+-->
+<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:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M21.19,21.19L14,14l-2,-2l-9.2,-9.2L1.39,4.22l8.79,8.79c-0.06,0 -0.12,-0.01 -0.18,-0.01C7.79,13 6,14.79 6,17c0,2.21 1.79,4 4.01,4S14,19.21 14,17v-0.17l5.78,5.78L21.19,21.19zM10.01,19c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C12.01,18.1 11.11,19 10.01,19z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M14,11.17l0,-4.17l4,0l0,-4l-6,0l0,6.17z"/>
+</vector>
diff --git a/res/drawable/ic_settings_24dp.xml b/res/drawable/ic_settings_24dp.xml
index da34345..ac4c43b 100644
--- a/res/drawable/ic_settings_24dp.xml
+++ b/res/drawable/ic_settings_24dp.xml
@@ -21,6 +21,9 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M19.4,13.0c0.0,-0.3 0.1,-0.6 0.1,-1.0s0.0,-0.7 -0.1,-1.0l2.1,-1.7c0.2,-0.2 0.2,-0.4 0.1,-0.6l-2.0,-3.5C19.5,5.1 19.3,5.0 19.0,5.1l-2.5,1.0c-0.5,-0.4 -1.1,-0.7 -1.7,-1.0l-0.4,-2.6C14.5,2.2 14.2,2.0 14.0,2.0l-4.0,0.0C9.8,2.0 9.5,2.2 9.5,2.4L9.1,5.1C8.5,5.3 8.0,5.7 7.4,6.1L5.0,5.1C4.7,5.0 4.5,5.1 4.3,5.3l-2.0,3.5C2.2,8.9 2.3,9.2 2.5,9.4L4.6,11.0c0.0,0.3 -0.1,0.6 -0.1,1.0s0.0,0.7 0.1,1.0l-2.1,1.7c-0.2,0.2 -0.2,0.4 -0.1,0.6l2.0,3.5C4.5,18.9 4.7,19.0 5.0,18.9l2.5,-1.0c0.5,0.4 1.1,0.7 1.7,1.0l0.4,2.6c0.0,0.2 0.2,0.4 0.5,0.4l4.0,0.0c0.2,0.0 0.5,-0.2 0.5,-0.4l0.4,-2.6c0.6,-0.3 1.2,-0.6 1.7,-1.0l2.5,1.0c0.2,0.1 0.5,0.0 0.6,-0.2l2.0,-3.5c0.1,-0.2 0.1,-0.5 -0.1,-0.6L19.4,13.0zM12.0,15.5c-1.9,0.0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5s3.5,1.6 3.5,3.5S13.9,15.5 12.0,15.5z"
-        android:fillColor="#ffffffff" />
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M13.85,22.25h-3.7c-0.74,0 -1.36,-0.54 -1.45,-1.27l-0.27,-1.89c-0.27,-0.14 -0.53,-0.29 -0.79,-0.46l-1.8,0.72c-0.7,0.26 -1.47,-0.03 -1.81,-0.65L2.2,15.53c-0.35,-0.66 -0.2,-1.44 0.36,-1.88l1.53,-1.19c-0.01,-0.15 -0.02,-0.3 -0.02,-0.46c0,-0.15 0.01,-0.31 0.02,-0.46l-1.52,-1.19C1.98,9.9 1.83,9.09 2.2,8.47l1.85,-3.19c0.34,-0.62 1.11,-0.9 1.79,-0.63l1.81,0.73c0.26,-0.17 0.52,-0.32 0.78,-0.46l0.27,-1.91c0.09,-0.7 0.71,-1.25 1.44,-1.25h3.7c0.74,0 1.36,0.54 1.45,1.27l0.27,1.89c0.27,0.14 0.53,0.29 0.79,0.46l1.8,-0.72c0.71,-0.26 1.48,0.03 1.82,0.65l1.84,3.18c0.36,0.66 0.2,1.44 -0.36,1.88l-1.52,1.19c0.01,0.15 0.02,0.3 0.02,0.46s-0.01,0.31 -0.02,0.46l1.52,1.19c0.56,0.45 0.72,1.23 0.37,1.86l-1.86,3.22c-0.34,0.62 -1.11,0.9 -1.8,0.63l-1.8,-0.72c-0.26,0.17 -0.52,0.32 -0.78,0.46l-0.27,1.91C15.21,21.71 14.59,22.25 13.85,22.25zM13.32,20.72c0,0.01 0,0.01 0,0.02L13.32,20.72zM10.68,20.7l0,0.02C10.69,20.72 10.69,20.71 10.68,20.7zM10.62,20.25h2.76l0.37,-2.55l0.53,-0.22c0.44,-0.18 0.88,-0.44 1.34,-0.78l0.45,-0.34l2.38,0.96l1.38,-2.4l-2.03,-1.58l0.07,-0.56c0.03,-0.26 0.06,-0.51 0.06,-0.78c0,-0.27 -0.03,-0.53 -0.06,-0.78l-0.07,-0.56l2.03,-1.58l-1.39,-2.4l-2.39,0.96l-0.45,-0.35c-0.42,-0.32 -0.87,-0.58 -1.33,-0.77L13.75,6.3l-0.37,-2.55h-2.76L10.25,6.3L9.72,6.51C9.28,6.7 8.84,6.95 8.38,7.3L7.93,7.63L5.55,6.68L4.16,9.07l2.03,1.58l-0.07,0.56C6.09,11.47 6.06,11.74 6.06,12c0,0.26 0.02,0.53 0.06,0.78l0.07,0.56l-2.03,1.58l1.38,2.4l2.39,-0.96l0.45,0.35c0.43,0.33 0.86,0.58 1.33,0.77l0.53,0.22L10.62,20.25zM18.22,17.72c0,0.01 -0.01,0.02 -0.01,0.03L18.22,17.72zM5.77,17.71l0.01,0.02C5.78,17.72 5.77,17.71 5.77,17.71zM3.93,9.47L3.93,9.47C3.93,9.47 3.93,9.47 3.93,9.47zM18.22,6.27c0,0.01 0.01,0.02 0.01,0.02L18.22,6.27zM5.79,6.25L5.78,6.27C5.78,6.27 5.79,6.26 5.79,6.25zM13.31,3.28c0,0.01 0,0.01 0,0.02L13.31,3.28zM10.69,3.26l0,0.02C10.69,3.27 10.69,3.27 10.69,3.26z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12,12m-3.5,0a3.5,3.5 0,1 1,7 0a3.5,3.5 0,1 1,-7 0"/>
 </vector>
diff --git a/res/drawable/ic_settings_24dp_inverse.xml b/res/drawable/ic_settings_24dp_inverse.xml
deleted file mode 100644
index 6f70d21..0000000
--- a/res/drawable/ic_settings_24dp_inverse.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  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.
-  -->
-<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:tint="?android:attr/colorForegroundInverse">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66
-            -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3
-            -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2
-            14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59
-            -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49
-            0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66
-            0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3
-            0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42
-            0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25
-            1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49
-            -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57
-            -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings_accounts.xml b/res/drawable/ic_settings_accounts.xml
index d152b14..7f18286 100644
--- a/res/drawable/ic_settings_accounts.xml
+++ b/res/drawable/ic_settings_accounts.xml
@@ -14,15 +14,14 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
+        android:width="24dp"
+        android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M3.0,5.0
-        l0.0,14.0c0.0,1.0 0.89,2.0 2.0,2.0l14.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0
-        L21.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0
-        L5.0,3.0c-1.11,0.0 -2.0,0.9 -2.0,2.0zm12.0,4.0c0.0,1.66 -1.34,3.0 -3.0,3.0s-3.0,-1.34 -3.0,-3.0 1.34,-3.0 3.0,-3.0 3.0,1.34 3.0,3.0zm-9.0,8.0c0.0,-2.0 4.0,-3.1 6.0,-3.1s6.0,1.1 6.0,3.1l0.0,1.0
-        l-12.0,0l0.0,-1.0z"/>
+        android:pathData="M19,3H5C3.89,3 3,3.9 3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM19,5v10.79C16.52,14.37 13.23,14 12,14s-4.52,0.37 -7,1.79V5H19zM5,19v-0.77C6.74,16.66 10.32,16 12,16s5.26,0.66 7,2.23V19H5z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12,13c1.94,0 3.5,-1.56 3.5,-3.5C15.5,7.56 13.94,6 12,6c-1.94,0 -3.5,1.56 -3.5,3.5C8.5,11.44 10.06,13 12,13zM12,8c0.83,0 1.5,0.67 1.5,1.5c0,0.83 -0.67,1.5 -1.5,1.5c-0.83,0 -1.5,-0.67 -1.5,-1.5C10.5,8.67 11.17,8 12,8z"/>
 </vector>
diff --git a/res/drawable/ic_settings_backup.xml b/res/drawable/ic_settings_backup.xml
index 8a9997a..231eadd 100644
--- a/res/drawable/ic_settings_backup.xml
+++ b/res/drawable/ic_settings_backup.xml
@@ -14,12 +14,12 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
+        android:width="24dp"
+        android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M19.35,10.04C18.67,6.59 15.64,4.0 12.0,4.0 9.11,4.0 6.6,5.64 5.35,8.04 2.34,8.36 0.0,10.91 0.0,14.0c0.0,3.31 2.69,6.0 6.0,6.0l13.0,0.0c2.76,0.0 5.0,-2.24 5.0,-5.0 0.0,-2.64 -2.05,-4.78 -4.65,-4.96zM14.0,13.0l0.0,4.0l-4.0,0.0l0.0,-4.0L7.0,13.0l5.0,-5.0 5.0,5.0l-3.0,0.0z"/>
+        android:pathData="M17.92,10.02C17.45,7.18 14.97,5 12,5C9.82,5 7.83,6.18 6.78,8.06C4.09,8.41 2,10.74 2,13.5C2,16.53 4.47,19 7.5,19h10c2.48,0 4.5,-2.02 4.5,-4.5C22,12.16 20.21,10.23 17.92,10.02zM17.5,17h-10C5.57,17 4,15.43 4,13.5c0,-1.89 1.54,-3.46 3.44,-3.49L8.08,10l0.26,-0.59C8.97,7.94 10.41,7 12,7c2.21,0 4,1.79 4,4v1h1.5c1.38,0 2.5,1.12 2.5,2.5S18.88,17 17.5,17zM14.09,11.09l1.41,1.41l-2.79,2.79L12,16l-0.71,-0.71L8.5,12.5l1.41,-1.41L11,12.17V9.5h2v2.67L14.09,11.09z"/>
 </vector>
diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml
index de71508..7f0aacd 100644
--- a/res/drawable/ic_settings_display.xml
+++ b/res/drawable/ic_settings_display.xml
@@ -21,8 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M20,15.31l2.6-2.6c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0
-L8.69,4H5C4.45,4,4,4.45,4,5v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41l2.6,2.6V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6
-c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1V15.31z
-M12,18V6c3.31,0,6,2.69,6,6S15.31,18,12,18z"/>
+        android:pathData="M20,8.69V4h-4.69L12,0.69L8.69,4H4v4.69L0.69,12L4,15.31V20h4.69L12,23.31L15.31,20H20v-4.69L23.31,12L20,8.69zM18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48zM12,17c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5V17z"/>
 </vector>
diff --git a/res/drawable/ic_settings_display_white.xml b/res/drawable/ic_settings_display_white.xml
index 4a41691..62dc21f 100644
--- a/res/drawable/ic_settings_display_white.xml
+++ b/res/drawable/ic_settings_display_white.xml
@@ -20,8 +20,5 @@
         android:viewportHeight="24.0">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M20,15.31l2.6-2.6c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0
-L8.69,4H5C4.45,4,4,4.45,4,5v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41l2.6,2.6V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6
-c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1V15.31z
-M12,18V6c3.31,0,6,2.69,6,6S15.31,18,12,18z"/>
+        android:pathData="M20,8.69V4h-4.69L12,0.69L8.69,4H4v4.69L0.69,12L4,15.31V20h4.69L12,23.31L15.31,20H20v-4.69L23.31,12L20,8.69zM18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48zM12,17c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5V17z"/>
 </vector>
diff --git a/res/drawable/ic_settings_location.xml b/res/drawable/ic_settings_location.xml
index c774b2e..34bd4f0 100644
--- a/res/drawable/ic_settings_location.xml
+++ b/res/drawable/ic_settings_location.xml
@@ -21,5 +21,8 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M12.0,2.0C8.13,2.0 5.0,5.13 5.0,9.0c0.0,5.25 7.0,13.0 7.0,13.0s7.0,-7.75 7.0,-13.0c0.0,-3.87 -3.13,-7.0 -7.0,-7.0zm0.0,9.5c-1.38,0.0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z"/>
+        android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13C19,5.13 15.87,2 12,2zM7,9c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,2.88 -2.88,7.19 -5,9.88C9.92,16.21 7,11.85 7,9z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12,9m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
 </vector>
diff --git a/res/drawable/ic_settings_multiuser.xml b/res/drawable/ic_settings_multiuser.xml
index 4dd83a5..2d857c5 100644
--- a/res/drawable/ic_settings_multiuser.xml
+++ b/res/drawable/ic_settings_multiuser.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M12.0,12.0c2.21,0.0 4.0,-1.79 4.0,-4.0s-1.79,-4.0 -4.0,-4.0 -4.0,1.79 -4.0,4.0 1.79,4.0 4.0,4.0zm0.0,2.0c-2.67,0.0 -8.0,1.34 -8.0,4.0l0.0,2.0l16.0,0.0l0.0,-2.0c0.0,-2.66 -5.33,-4.0 -8.0,-4.0z"/>
+        android:pathData="M12,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S10.9,6 12,6M12,15c2.7,0 5.8,1.29 6,2v1H6l0,-0.99C6.2,16.29 9.3,15 12,15M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4s4,-1.79 4,-4S14.21,4 12,4L12,4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3C20,14.34 14.67,13 12,13L12,13z"/>
 </vector>
diff --git a/res/drawable/ic_settings_security.xml b/res/drawable/ic_settings_security.xml
index 34accd0..055babc 100644
--- a/res/drawable/ic_settings_security.xml
+++ b/res/drawable/ic_settings_security.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.76 -2.24,-5.0 -5.0,-5.0S7.0,3.24 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.0 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-6.0,9.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0 2.0,0.9 2.0,2.0 -0.9,2.0 -2.0,2.0zm3.1,-9.0L8.9,8.0L8.9,6.0c0.0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0.0 3.1,1.39 3.1,3.1l0.0,2.0z"/>
+        android:pathData="M18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10C20,8.9 19.1,8 18,8zM9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2H9V6zM18,20H6V10h12V20zM12,17c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2c-1.1,0 -2,0.9 -2,2C10,16.1 10.9,17 12,17z"/>
 </vector>
diff --git a/res/drawable/ic_settings_security_white.xml b/res/drawable/ic_settings_security_white.xml
index d6c5b64..544ebef 100644
--- a/res/drawable/ic_settings_security_white.xml
+++ b/res/drawable/ic_settings_security_white.xml
@@ -20,5 +20,5 @@
         android:viewportHeight="24.0">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.76 -2.24,-5.0 -5.0,-5.0S7.0,3.24 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.0 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-6.0,9.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0 2.0,0.9 2.0,2.0 -0.9,2.0 -2.0,2.0zm3.1,-9.0L8.9,8.0L8.9,6.0c0.0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0.0 3.1,1.39 3.1,3.1l0.0,2.0z"/>
+        android:pathData="M18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10C20,8.9 19.1,8 18,8zM9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2H9V6zM18,20H6V10h12V20zM12,17c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2c-1.1,0 -2,0.9 -2,2C10,16.1 10.9,17 12,17z"/>
 </vector>
diff --git a/res/drawable/ic_system_update.xml b/res/drawable/ic_system_update.xml
index ef8f991..3325fdd 100644
--- a/res/drawable/ic_system_update.xml
+++ b/res/drawable/ic_system_update.xml
@@ -20,6 +20,6 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"
-        android:fillColor="#FFFFFFFF"/>
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,21H7l0,-1h10V21zM17,18H7V6h10V18zM7,4V3h10v1H7zM16,12.5l-4,4l-4,-4l1.41,-1.41L11,12.67V8.5V8h2v0.5v4.17l1.59,-1.59L16,12.5z"/>
 </vector>
diff --git a/res/drawable/ic_system_update_vd_theme_24.xml b/res/drawable/ic_system_update_vd_theme_24.xml
index d68ea13..d1fc061 100644
--- a/res/drawable/ic_system_update_vd_theme_24.xml
+++ b/res/drawable/ic_system_update_vd_theme_24.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="@android:color/white"
-        android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"/>
-</vector>
\ No newline at end of file
+        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,21H7l0,-1h10V21zM17,18H7V6h10V18zM7,4V3h10v1H7zM16,12.5l-4,4l-4,-4l1.41,-1.41L11,12.67V8.5V8h2v0.5v4.17l1.59,-1.59L16,12.5z"/>
+</vector>
diff --git a/res/layout/apps_filter_spinner.xml b/res/layout/apps_filter_spinner.xml
index 3eebbb0..3faff50 100644
--- a/res/layout/apps_filter_spinner.xml
+++ b/res/layout/apps_filter_spinner.xml
@@ -39,7 +39,7 @@
         android:layout_height="56dp"
         android:contentDescription="@string/configure"
         android:scaleType="center"
-        android:src="@drawable/ic_settings_24dp_inverse"
+        android:src="@drawable/ic_settings_24dp"
         android:visibility="gone" />
 
 </LinearLayout>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 3c272fc..5f39738 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1120,6 +1120,20 @@
         <item>no</item>
     </string-array>
 
+    <!-- Titles for SystemUI theme preference. -->
+    <string-array name="systemui_theme_entries" >
+        <item>@string/systemui_theme_wallpaper</item>
+        <item>@string/systemui_theme_light</item>
+        <item>@string/systemui_theme_dark</item>
+    </string-array>
+
+    <!-- Values for SystemUI theme preference. -->
+    <string-array name="systemui_theme_values" translatable="false" >
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+    </string-array>
+
     <string-array name="gesture_prevent_ringing_entries" translatable="false">
         <item>@string/prevent_ringing_option_vibrate</item>
         <item>@string/prevent_ringing_option_mute</item>
diff --git a/res/values/config.xml b/res/values/config.xml
index 284b653..8e55ea9 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -38,9 +38,6 @@
     <!-- When true enable color temperature setting. -->
     <bool name="config_enableColorTemperature">false</bool>
 
-    <!-- Whether to show Connectivity Monitor switch in Developer Options -->
-    <bool name="config_show_connectivity_monitor">false</bool>
-
     <!-- Whether to show Camera laser sensor switch in Developer Options -->
     <bool name="config_show_camera_laser_sensor">false</bool>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3870fb6..2b4f49b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9112,15 +9112,6 @@
     <!-- Toast message letting the user know the color temperature setting is not immediate -->
     <string name="color_temperature_toast">To apply color change, turn off screen</string>
 
-    <!-- UI debug setting: title for ConnectivityMonitor switch [CHAR LIMIT=50] -->
-    <string name="connectivity_monitor_switch">Connectivity Monitor</string>
-
-    <!-- UI debug setting: summary for switch of ConnectivityMonitor [CHAR LIMIT=500] -->
-    <string name="connectivity_monitor_switch_summary">ConnectivityMonitor will collect logs when it detects a connectivity problem and prompt notification to user to file a bug</string>
-
-    <!-- Toast message letting the user know the how to apply connectivity monitor change -->
-    <string name="connectivity_monitor_toast">To apply connectivity monitor change, reboot device</string>
-
     <!-- Title for Camera laser sensor switch [CHAR LIMIT=NONE] -->
     <string name="camera_laser_sensor_switch">Camera Laser Sensor</string>
 
@@ -9883,12 +9874,21 @@
     </string>
 
     <!-- Name of setting for switching device theme [CHAR LIMIT=60] -->
-    <string name="device_theme">Device theme</string>
+    <string name="color_theme">Color theme</string>
     <!-- Name of default device theme [CHAR LIMIT=60] -->
     <string name="default_theme">Default</string>
     <!-- Temporary reboot string, will be removed -->
     <string name="change_theme_reboot" translatable="false">Changing the theme requires a restart.</string>
 
+    <!-- Name of setting for switching the SystemUI theme [CHAR LIMIT=60] -->
+    <string name="device_theme">Device theme</string>
+    <!-- When SystemUI theme is chosen based on the wallpaper color [CHAR LIMIT=60] -->
+    <string name="systemui_theme_wallpaper">Automatic (based on wallpaper)</string>
+    <!-- When SystemUI theme is light [CHAR LIMIT=60] -->
+    <string name="systemui_theme_light">Light</string>
+    <!-- When SystemUI theme is dark [CHAR LIMIT=60] -->
+    <string name="systemui_theme_dark">Dark</string>
+
     <!-- Switch label to show operator name in the status bar [CHAR LIMIT=60] -->
     <string name="show_operator_name_title">Network name</string>
     <!-- Switch summary to show operator name in the status bar [CHAR LIMIT=NONE] -->
diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml
index f81fd79..41d3e9b 100644
--- a/res/xml/connected_devices_advanced.xml
+++ b/res/xml/connected_devices_advanced.xml
@@ -32,12 +32,14 @@
         android:title="@string/nfc_quick_toggle_title"
         android:icon="@drawable/ic_nfc"
         android:summary="@string/nfc_quick_toggle_summary"
+        settings:controller="com.android.settings.nfc.NfcPreferenceController"
         android:order="-7"/>
 
     <com.android.settingslib.RestrictedPreference
         android:fragment="com.android.settings.nfc.AndroidBeam"
         android:key="android_beam_settings"
         android:title="@string/android_beam_settings_title"
+        settings:controller="com.android.settings.nfc.AndroidBeamPreferenceController"
         android:icon="@drawable/ic_android"
         android:order="-6"/>
 
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 872837e..3c56e91 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -184,11 +184,6 @@
             android:entryValues="@array/select_logpersist_values" />
 
         <SwitchPreference
-            android:key="connectivity_monitor_switch"
-            android:title="@string/connectivity_monitor_switch"
-            android:summary="@string/connectivity_monitor_switch_summary" />
-
-        <SwitchPreference
             android:key="camera_laser_sensor_switch"
             android:title="@string/camera_laser_sensor_switch" />
 
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 90198ae..c75b90c 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -131,9 +131,16 @@
 
     <ListPreference
         android:key="theme"
-        android:title="@string/device_theme"
+        android:title="@string/color_theme"
         android:summary="@string/summary_placeholder" />
 
+    <ListPreference
+        android:key="systemui_theme"
+        android:title="@string/device_theme"
+        android:entries="@array/systemui_theme_entries"
+        android:entryValues="@array/systemui_theme_values"
+        settings:controller="com.android.settings.display.SystemUiThemePreferenceController" />
+
     <Preference
         android:key="vr_display_pref"
         android:title="@string/display_vr_pref_title"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 353d1f1..4b160e1 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -25,7 +25,7 @@
     <!-- Media volume -->
     <com.android.settings.notification.VolumeSeekBarPreference
         android:key="media_volume"
-        android:icon="@*android:drawable/ic_audio_media"
+        android:icon="@drawable/ic_media_stream"
         android:title="@string/media_volume_option_title"
         android:order="-180"
         settings:controller="com.android.settings.notification.MediaVolumePreferenceController"/>
@@ -57,7 +57,7 @@
     <!-- Ring volume -->
     <com.android.settings.notification.VolumeSeekBarPreference
         android:key="ring_volume"
-        android:icon="@*android:drawable/ic_audio_ring_notif"
+        android:icon="@drawable/ic_notifications"
         android:title="@string/ring_volume_option_title"
         android:order="-160"
         settings:controller="com.android.settings.notification.RingVolumePreferenceController"/>
@@ -73,7 +73,7 @@
     <!-- Notification volume -->
     <com.android.settings.notification.VolumeSeekBarPreference
         android:key="notification_volume"
-        android:icon="@*android:drawable/ic_audio_ring_notif"
+        android:icon="@drawable/ic_notifications"
         android:title="@string/notification_volume_option_title"
         android:order="-140"
         settings:controller="com.android.settings.notification.NotificationVolumePreferenceController"/>
diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java
index a96a3b1..6cf64c3 100644
--- a/src/com/android/settings/applications/AppStateNotificationBridge.java
+++ b/src/com/android/settings/applications/AppStateNotificationBridge.java
@@ -15,9 +15,13 @@
  */
 package com.android.settings.applications;
 
+import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageEvents;
 import android.app.usage.UsageStatsManager;
 import android.content.Context;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
 import android.view.View;
@@ -25,6 +29,7 @@
 import android.widget.Switch;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -33,6 +38,7 @@
 
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -42,17 +48,24 @@
 public class AppStateNotificationBridge extends AppStateBaseBridge {
 
     private final Context mContext;
-    private UsageStatsManager mUsageStatsManager;
+    private IUsageStatsManager mUsageStatsManager;
+    protected List<Integer> mUserIds;
     private NotificationBackend mBackend;
     private static final int DAYS_TO_CHECK = 7;
 
     public AppStateNotificationBridge(Context context, ApplicationsState appState,
-            Callback callback, UsageStatsManager usageStatsManager,
-            NotificationBackend backend) {
+            Callback callback, IUsageStatsManager usageStatsManager,
+            UserManager userManager, NotificationBackend backend) {
         super(appState, callback);
         mContext = context;
         mUsageStatsManager = usageStatsManager;
         mBackend = backend;
+        mUserIds = new ArrayList<>();
+        mUserIds.add(mContext.getUserId());
+        int workUserId = Utils.getManagedProfileId(userManager, mContext.getUserId());
+        if (workUserId != UserHandle.USER_NULL) {
+            mUserIds.add(workUserId);
+        }
     }
 
     @Override
@@ -62,7 +75,8 @@
 
         final Map<String, NotificationsSentState> map = getAggregatedUsageEvents();
         for (AppEntry entry : apps) {
-            NotificationsSentState stats = map.get(entry.info.packageName);
+            NotificationsSentState stats =
+                    map.get(getKey(UserHandle.getUserId(entry.info.uid), entry.info.packageName));
             calculateAvgSentCounts(stats);
             addBlockStatus(entry, stats);
             entry.extraInfo = stats;
@@ -71,8 +85,8 @@
 
     @Override
     protected void updateExtraInfo(AppEntry entry, String pkg, int uid) {
-        Map<String, NotificationsSentState> map = getAggregatedUsageEvents();
-        NotificationsSentState stats = map.get(entry.info.packageName);
+        NotificationsSentState stats = getAggregatedUsageEvents(
+                UserHandle.getUserId(entry.info.uid), entry.info.packageName);
         calculateAvgSentCounts(stats);
         addBlockStatus(entry, stats);
         entry.extraInfo = stats;
@@ -116,18 +130,59 @@
 
         long now = System.currentTimeMillis();
         long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK);
-        UsageEvents events = mUsageStatsManager.queryEvents(startTime, now);
+        for (int userId : mUserIds) {
+            UsageEvents events = null;
+            try {
+                events = mUsageStatsManager.queryEventsForUser(
+                        startTime, now, userId, mContext.getPackageName());
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+            if (events != null) {
+                UsageEvents.Event event = new UsageEvents.Event();
+                while (events.hasNextEvent()) {
+                    events.getNextEvent(event);
+                    NotificationsSentState stats =
+                            aggregatedStats.get(getKey(userId, event.getPackageName()));
+                    if (stats == null) {
+                        stats = new NotificationsSentState();
+                        aggregatedStats.put(getKey(userId, event.getPackageName()), stats);
+                    }
+
+                    if (event.getEventType() == UsageEvents.Event.NOTIFICATION_INTERRUPTION) {
+                        if (event.getTimeStamp() > stats.lastSent) {
+                            stats.lastSent = event.getTimeStamp();
+                        }
+                        stats.sentCount++;
+                    }
+
+                }
+            }
+        }
+        return aggregatedStats;
+    }
+
+    protected NotificationsSentState getAggregatedUsageEvents(int userId, String pkg) {
+        NotificationsSentState stats = null;
+
+        long now = System.currentTimeMillis();
+        long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK);
+        UsageEvents events = null;
+        try {
+            events = mUsageStatsManager.queryEventsForPackageForUser(
+                    startTime, now, userId, pkg, mContext.getPackageName());
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
         if (events != null) {
             UsageEvents.Event event = new UsageEvents.Event();
             while (events.hasNextEvent()) {
                 events.getNextEvent(event);
-                NotificationsSentState stats = aggregatedStats.get(event.getPackageName());
-                if (stats == null) {
-                    stats = new NotificationsSentState();
-                    aggregatedStats.put(event.getPackageName(), stats);
-                }
 
                 if (event.getEventType() == UsageEvents.Event.NOTIFICATION_INTERRUPTION) {
+                    if (stats == null) {
+                        stats = new NotificationsSentState();
+                    }
                     if (event.getTimeStamp() > stats.lastSent) {
                         stats.lastSent = event.getTimeStamp();
                     }
@@ -136,7 +191,7 @@
 
             }
         }
-        return aggregatedStats;
+        return stats;
     }
 
     private static NotificationsSentState getNotificationsSentState(AppEntry entry) {
@@ -149,6 +204,10 @@
         return null;
     }
 
+    protected static String getKey(int userId, String pkg) {
+        return userId + "|" + pkg;
+    }
+
     public View.OnClickListener getSwitchOnClickListener(final AppEntry entry) {
         if (entry != null) {
             return v -> {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 328d4a2..a00ea8e 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -41,6 +41,7 @@
 import android.annotation.Nullable;
 import android.annotation.StringRes;
 import android.app.Activity;
+import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageStatsManager;
 import android.content.Context;
 import android.content.Intent;
@@ -48,6 +49,7 @@
 import android.content.pm.PackageItemInfo;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.PreferenceFrameLayout;
@@ -224,7 +226,8 @@
     private View mSpinnerHeader;
     private Spinner mFilterSpinner;
     private FilterSpinnerAdapter mFilterAdapter;
-    private UsageStatsManager mUsageStatsManager;
+    private IUsageStatsManager mUsageStatsManager;
+    private UserManager mUserManager;
     private NotificationBackend mNotificationBackend;
     private ResetAppsHelper mResetAppsHelper;
     private String mVolumeUuid;
@@ -293,8 +296,9 @@
             screenTitle = R.string.change_wifi_state_title;
         } else if (className.equals(Settings.NotificationAppListActivity.class.getName())) {
             mListType = LIST_TYPE_NOTIFICATION;
-            mUsageStatsManager =
-                    (UsageStatsManager) getContext().getSystemService(Context.USAGE_STATS_SERVICE);
+            mUsageStatsManager = IUsageStatsManager.Stub.asInterface(
+                    ServiceManager.getService(Context.USAGE_STATS_SERVICE));
+            mUserManager = UserManager.get(getContext());
             mNotificationBackend = new NotificationBackend();
             mSortOrder = R.id.sort_order_recent_notification;
             screenTitle = R.string.app_notifications_title;
@@ -875,6 +879,7 @@
             if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
                 mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
                         manageApplications.mUsageStatsManager,
+                        manageApplications.mUserManager,
                         manageApplications.mNotificationBackend);
             } else if (mManageApplications.mListType == LIST_TYPE_USAGE_ACCESS) {
                 mExtraInfoBridge = new AppStateUsageBridge(mContext, mState, this);
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
index eb93eb1..3976c92 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java
@@ -50,7 +50,7 @@
      */
     public static int getConnectedDevicesSummaryResourceId(Context context) {
         final NfcPreferenceController nfcPreferenceController =
-                new NfcPreferenceController(context);
+                new NfcPreferenceController(context, NfcPreferenceController.KEY_TOGGLE_NFC);
 
         return getConnectedDevicesSummaryResourceId(nfcPreferenceController,
                 isDrivingModeAvailable(context));
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
index a64a430..9795e9f 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
@@ -24,7 +24,6 @@
 import com.android.settings.bluetooth.BluetoothFilesPreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.nfc.AndroidBeamPreferenceController;
-import com.android.settings.nfc.NfcPreferenceController;
 import com.android.settings.print.PrintSettingPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -70,25 +69,15 @@
             Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
 
-        final AndroidBeamPreferenceController beamPreferenceController =
-                new AndroidBeamPreferenceController(context);
-        controllers.add(beamPreferenceController);
-
         controllers.add(new BluetoothFilesPreferenceController(context));
         controllers.add(new BluetoothOnWhileDrivingPreferenceController(context));
 
         final PrintSettingPreferenceController printerController =
                 new PrintSettingPreferenceController(context);
-        final NfcPreferenceController nfcPreferenceController =
-                new NfcPreferenceController(context);
 
         if (lifecycle != null) {
-            lifecycle.addObserver(beamPreferenceController);
             lifecycle.addObserver(printerController);
-            lifecycle.addObserver(nfcPreferenceController);
         }
-
-        controllers.add(nfcPreferenceController);
         controllers.add(printerController);
 
         return controllers;
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index c2d1cf5..efd9448 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -247,6 +247,16 @@
     }
 
     /**
+     * @return {@code true} if the setting update asynchronously.
+     * <p>
+     * For example, a Wifi controller would return true, because it needs to update the radio
+     * and wait for it to turn on.
+     */
+    public boolean hasAsyncUpdate() {
+        return false;
+    }
+
+    /**
      * Updates non-indexable keys for search provider.
      *
      * Called by SearchIndexProvider#getNonIndexableKeys
diff --git a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
index 728154d..fdd1508 100644
--- a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
+++ b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
@@ -47,7 +47,7 @@
 
     @Override
     public Drawable getIcon() {
-        return new BatterySaverDrawable(mManager.getContext(), 0);
+        return mManager.getContext().getDrawable(R.drawable.ic_battery_saver_accent_24dp);
     }
 
     @Override
diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
index 553a63e..01ec156 100644
--- a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
@@ -69,8 +69,15 @@
     @Override
     protected void onDeveloperOptionsSwitchDisabled() {
         super.onDeveloperOptionsSwitchDisabled();
-        ((SwitchPreference) mPreference).setChecked(true);
-        SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, "true");
+        final boolean offloadSupported =
+                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false);
+        if (offloadSupported) {
+            ((SwitchPreference) mPreference).setChecked(false);
+            SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, "false");
+        } else {
+            ((SwitchPreference) mPreference).setChecked(true);
+            SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, "true");
+        }
     }
 
     public void onA2dpHwDialogConfirmed() {
diff --git a/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java b/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java
deleted file mode 100644
index 85b562d..0000000
--- a/src/com/android/settings/development/ConnectivityMonitorPreferenceController.java
+++ /dev/null
@@ -1,100 +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.development;
-
-import android.content.Context;
-import android.os.SystemProperties;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.Preference;
-import android.text.TextUtils;
-import android.widget.Toast;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-public class ConnectivityMonitorPreferenceController extends DeveloperOptionsPreferenceController
-        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
-
-    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";
-
-    public ConnectivityMonitorPreferenceController(Context context) {
-        super(context);
-    }
-
-    @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();
-        ((SwitchPreference) mPreference).setChecked(enabled);
-    }
-
-    @Override
-    protected void onDeveloperOptionsSwitchDisabled() {
-        super.onDeveloperOptionsSwitchDisabled();
-        SystemProperties.set(PROPERTY_CONNECTIVITY_MONITOR, USER_DISABLED_STATUS);
-        ((SwitchPreference) mPreference).setChecked(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 bc749c1..eb1a2dd 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -403,7 +403,6 @@
         controllers.add(new VerifyAppsOverUsbPreferenceController(context));
         controllers.add(new LogdSizePreferenceController(context));
         controllers.add(new LogPersistPreferenceController(context, fragment, lifecycle));
-        controllers.add(new ConnectivityMonitorPreferenceController(context));
         controllers.add(new CameraLaserSensorPreferenceController(context));
         controllers.add(new LogicalCameraDefaultPreferenceController(context));
         controllers.add(new WifiDisplayCertificationPreferenceController(context));
diff --git a/src/com/android/settings/display/SystemUiThemePreferenceController.java b/src/com/android/settings/display/SystemUiThemePreferenceController.java
new file mode 100644
index 0000000..3cdc85c
--- /dev/null
+++ b/src/com/android/settings/display/SystemUiThemePreferenceController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 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.display;
+
+import static android.provider.Settings.Secure.THEME_MODE;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+/**
+ * Setting where user can pick if SystemUI will be light, dark or try to match
+ * the wallpaper colors.
+ */
+public class SystemUiThemePreferenceController extends BasePreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private ListPreference mSystemUiThemePref;
+
+    public SystemUiThemePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        boolean enabled = FeatureFlagUtils.isEnabled(mContext, "settings_systemui_theme");
+        return enabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mSystemUiThemePref = (ListPreference) screen.findPreference(getPreferenceKey());
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 0);
+        mSystemUiThemePref.setValue(Integer.toString(value));
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        int value = Integer.parseInt((String) newValue);
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, value);
+        refreshSummary(preference);
+        return true;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 0);
+        int index = mSystemUiThemePref.findIndexOfValue(Integer.toString(value));
+        return mSystemUiThemePref.getEntries()[index];
+    }
+}
diff --git a/src/com/android/settings/nfc/AndroidBeamEnabler.java b/src/com/android/settings/nfc/AndroidBeamEnabler.java
index 66e42b6..1808775 100644
--- a/src/com/android/settings/nfc/AndroidBeamEnabler.java
+++ b/src/com/android/settings/nfc/AndroidBeamEnabler.java
@@ -20,7 +20,6 @@
 import android.nfc.NfcAdapter;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.support.v7.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settingslib.RestrictedLockUtils;
@@ -36,18 +35,14 @@
 
     public AndroidBeamEnabler(Context context, RestrictedPreference preference) {
         super(context);
-
         mPreference = preference;
-
         mBeamDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(context,
                 UserManager.DISALLOW_OUTGOING_BEAM, UserHandle.myUserId());
-
         if (!isNfcAvailable()) {
             // NFC is not supported
             mPreference.setEnabled(false);
             return;
         }
-
         if (mBeamDisallowedBySystem) {
             mPreference.setEnabled(false);
         }
diff --git a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
index 6ae7fe5..b4026de 100644
--- a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
+++ b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
@@ -16,34 +16,75 @@
 package com.android.settings.nfc;
 
 import android.content.Context;
+import android.nfc.NfcAdapter;
+import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
-public class AndroidBeamPreferenceController extends BaseNfcPreferenceController {
+import java.util.List;
+
+public class AndroidBeamPreferenceController extends BasePreferenceController
+        implements LifecycleObserver, OnResume, OnPause {
 
     public static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings";
+    private final NfcAdapter mNfcAdapter;
+    private AndroidBeamEnabler mAndroidBeamEnabler;
+    private NfcAirplaneModeObserver mAirplaneModeObserver;
 
-    public AndroidBeamPreferenceController(Context context) {
-        super(context);
+    public AndroidBeamPreferenceController(Context context, String key) {
+        super(context, key);
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         if (!isAvailable()) {
+            mAndroidBeamEnabler = null;
             return;
         }
 
-        mNfcEnabler = new AndroidBeamEnabler(mContext, (RestrictedPreference) mPreference);
+        final RestrictedPreference restrictedPreference =
+                (RestrictedPreference) screen.findPreference(getPreferenceKey());
+        mAndroidBeamEnabler = new AndroidBeamEnabler(mContext, restrictedPreference);
+
+        // Manually set dependencies for NFC when not toggleable.
+        if (!NfcPreferenceController.isToggleableInAirplaneMode(mContext)) {
+            mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext, mNfcAdapter,
+                    (Preference) restrictedPreference);
+        }
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_ANDROID_BEAM_SETTINGS;
+    @AvailabilityStatus
+    public int getAvailabilityStatus() {
+        return mNfcAdapter != null
+                ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    public void onResume() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.register();
+        }
+        if (mAndroidBeamEnabler != null) {
+            mAndroidBeamEnabler.resume();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.unregister();
+        }
+        if (mAndroidBeamEnabler != null) {
+            mAndroidBeamEnabler.pause();
+        }
     }
 }
diff --git a/src/com/android/settings/nfc/BaseNfcPreferenceController.java b/src/com/android/settings/nfc/BaseNfcPreferenceController.java
deleted file mode 100644
index 33d75fa..0000000
--- a/src/com/android/settings/nfc/BaseNfcPreferenceController.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2018 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.nfc;
-
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcManager;
-import android.os.Handler;
-import android.provider.Settings;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-import java.util.List;
-
-public abstract class BaseNfcPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
-
-    protected BaseNfcEnabler mNfcEnabler;
-    private NfcAdapter mNfcAdapter;
-    private int mAirplaneMode;
-    private AirplaneModeObserver mAirplaneModeObserver;
-    protected Preference mPreference;
-
-    public BaseNfcPreferenceController(Context context) {
-        super(context);
-        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-
-        if (!isAvailable()) {
-            mNfcEnabler = null;
-            return;
-        }
-
-        mPreference = screen.findPreference(getPreferenceKey());
-
-        // Manually set dependencies for NFC when not toggleable.
-        if (!isToggleableInAirplaneMode(mContext)) {
-            mAirplaneModeObserver = new AirplaneModeObserver();
-            updateNfcPreference();
-        }
-    }
-
-    @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        if (!isAvailable()) {
-            keys.add(getPreferenceKey());
-        }
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return mNfcAdapter != null;
-    }
-
-    public abstract String getPreferenceKey();
-
-    @Override
-    public void onResume() {
-        if (mAirplaneModeObserver != null) {
-            mAirplaneModeObserver.register();
-        }
-        if (mNfcEnabler != null) {
-            mNfcEnabler.resume();
-        }
-    }
-
-    @Override
-    public void onPause() {
-        if (mAirplaneModeObserver != null) {
-            mAirplaneModeObserver.unregister();
-        }
-        if (mNfcEnabler != null) {
-            mNfcEnabler.pause();
-        }
-    }
-
-    private void updateNfcPreference() {
-        final int airplaneMode = Settings.Global.getInt(
-                mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, mAirplaneMode);
-        if (airplaneMode == mAirplaneMode) {
-            return;
-        }
-        mAirplaneMode = airplaneMode;
-        boolean toggleable = mAirplaneMode != 1;
-        if (toggleable) {
-            mNfcAdapter.enable();
-        } else {
-            mNfcAdapter.disable();
-        }
-        mPreference.setEnabled(toggleable);
-    }
-
-    public static boolean isToggleableInAirplaneMode(Context context) {
-        String toggleable = Settings.Global.getString(context.getContentResolver(),
-                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
-        return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC);
-    }
-
-    private final class AirplaneModeObserver extends ContentObserver {
-        private final Uri AIRPLANE_MODE_URI =
-                Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON);
-
-        private AirplaneModeObserver() {
-            super(new Handler());
-        }
-
-        public void register() {
-            mContext.getContentResolver().registerContentObserver(AIRPLANE_MODE_URI, false, this);
-        }
-
-        public void unregister() {
-            mContext.getContentResolver().unregisterContentObserver(this);
-        }
-
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            super.onChange(selfChange, uri);
-            updateNfcPreference();
-        }
-    }
-
-}
diff --git a/src/com/android/settings/nfc/NfcAirplaneModeObserver.java b/src/com/android/settings/nfc/NfcAirplaneModeObserver.java
new file mode 100644
index 0000000..723d814
--- /dev/null
+++ b/src/com/android/settings/nfc/NfcAirplaneModeObserver.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 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.nfc;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.nfc.NfcAdapter;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+
+/**
+ * NfcAirplaneModeObserver is a helper to manage the Nfc on/off when airplane mode status
+ * is changed.
+ */
+public class NfcAirplaneModeObserver extends ContentObserver {
+
+    private final Context mContext;
+    private final NfcAdapter mNfcAdapter;
+    private final Preference mPreference;
+    private int mAirplaneMode;
+
+    @VisibleForTesting
+    final static Uri AIRPLANE_MODE_URI =
+            Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON);
+
+    public NfcAirplaneModeObserver(Context context, NfcAdapter nfcAdapter, Preference preference) {
+        super(new Handler(Looper.getMainLooper()));
+        mContext = context;
+        mNfcAdapter = nfcAdapter;
+        mPreference = preference;
+        updateNfcPreference();
+    }
+
+    public void register() {
+        mContext.getContentResolver().registerContentObserver(AIRPLANE_MODE_URI, false, this);
+    }
+
+    public void unregister() {
+        mContext.getContentResolver().unregisterContentObserver(this);
+    }
+
+    @Override
+    public void onChange(boolean selfChange, Uri uri) {
+        super.onChange(selfChange, uri);
+        updateNfcPreference();
+    }
+
+    private void updateNfcPreference() {
+        final int airplaneMode = Settings.Global.getInt(
+                mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, mAirplaneMode);
+        if (airplaneMode == mAirplaneMode) {
+            return;
+        }
+
+        mAirplaneMode = airplaneMode;
+        boolean toggleable = mAirplaneMode != 1;
+        if (toggleable) {
+            mNfcAdapter.enable();
+        } else {
+            mNfcAdapter.disable();
+        }
+        mPreference.setEnabled(toggleable);
+    }
+}
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index 29cef99..f39a0a1 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -18,52 +18,20 @@
 
 import android.content.Context;
 import android.nfc.NfcAdapter;
-import android.support.v7.preference.Preference;
 import android.support.v14.preference.SwitchPreference;
 
 /**
  * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It turns on/off Nfc
  * and ensures the summary of the preference reflects the current state.
  */
-public class NfcEnabler extends BaseNfcEnabler implements Preference.OnPreferenceChangeListener {
+public class NfcEnabler extends BaseNfcEnabler {
     private final SwitchPreference mPreference;
 
     public NfcEnabler(Context context, SwitchPreference preference) {
         super(context);
-
         mPreference = preference;
     }
 
-    public void resume() {
-        super.resume();
-        if (isNfcAvailable()) {
-            mPreference.setOnPreferenceChangeListener(this);
-        }
-    }
-
-    public void pause() {
-        super.pause();
-        if (isNfcAvailable()) {
-            mPreference.setOnPreferenceChangeListener(null);
-        }
-    }
-
-    public boolean onPreferenceChange(Preference preference, Object value) {
-        // Turn NFC on/off
-
-        final boolean desiredState = (Boolean) value;
-        mPreference.setChecked(desiredState);
-        mPreference.setEnabled(false);
-
-        if (desiredState) {
-            mNfcAdapter.enable();
-        } else {
-            mNfcAdapter.disable();
-        }
-
-        return false;
-    }
-
     @Override
     protected void handleNfcStateChanged(int newState) {
         switch (newState) {
diff --git a/src/com/android/settings/nfc/NfcPreferenceController.java b/src/com/android/settings/nfc/NfcPreferenceController.java
index a0678e0..a5d7c76 100644
--- a/src/com/android/settings/nfc/NfcPreferenceController.java
+++ b/src/com/android/settings/nfc/NfcPreferenceController.java
@@ -16,35 +16,119 @@
 package com.android.settings.nfc;
 
 import android.content.Context;
+import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v14.preference.SwitchPreference;
 
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
+import java.util.List;
 
-public class NfcPreferenceController extends BaseNfcPreferenceController {
+public class NfcPreferenceController extends TogglePreferenceController
+        implements LifecycleObserver, OnResume, OnPause {
 
     public static final String KEY_TOGGLE_NFC = "toggle_nfc";
+    private final NfcAdapter mNfcAdapter;
+    private NfcEnabler mNfcEnabler;
+    private NfcAirplaneModeObserver mAirplaneModeObserver;
 
-    public NfcPreferenceController(Context context) {
-        super(context);
+    public NfcPreferenceController(Context context, String key) {
+        super(context, key);
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         if (!isAvailable()) {
+            mNfcEnabler = null;
             return;
         }
 
-        mNfcEnabler = new NfcEnabler(mContext, (SwitchPreference) mPreference);
+        final SwitchPreference switchPreference =
+                (SwitchPreference) screen.findPreference(getPreferenceKey());
+
+        mNfcEnabler = new NfcEnabler(mContext, switchPreference);
+
+        // Manually set dependencies for NFC when not toggleable.
+        if (!isToggleableInAirplaneMode(mContext)) {
+            mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext,
+                    mNfcAdapter, (Preference) switchPreference);
+        }
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_TOGGLE_NFC;
+    public boolean isChecked() {
+        return mNfcAdapter.isEnabled();
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        if (isChecked) {
+            mNfcAdapter.enable();
+        } else {
+            mNfcAdapter.disable();
+        }
+        return true;
+    }
+
+    @Override
+    @AvailabilityStatus
+    public int getAvailabilityStatus() {
+        return mNfcAdapter != null
+                ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    public IntentFilter getIntentFilter() {
+        final IntentFilter filter = new IntentFilter();
+        filter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
+        filter.addAction(NfcAdapter.EXTRA_ADAPTER_STATE);
+        return filter;
+    }
+
+    @Override
+    public boolean hasAsyncUpdate() {
+        return true;
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return TextUtils.equals(getPreferenceKey(), KEY_TOGGLE_NFC);
+    }
+
+    @Override
+    public void onResume() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.register();
+        }
+        if (mNfcEnabler != null) {
+            mNfcEnabler.resume();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.unregister();
+        }
+        if (mNfcEnabler != null) {
+            mNfcEnabler.pause();
+        }
+    }
+
+    public static boolean isToggleableInAirplaneMode(Context context) {
+        final String toggleable = Settings.Global.getString(context.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+        return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC);
     }
 }
diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java
index 46f5729..74ce769 100644
--- a/src/com/android/settings/notification/MediaVolumePreferenceController.java
+++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java
@@ -55,6 +55,6 @@
 
     @Override
     public int getMuteIcon() {
-        return com.android.internal.R.drawable.ic_audio_media_mute;
+        return R.drawable.ic_media_stream_off;
     }
 }
diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
index 5995462..c82d04b 100644
--- a/src/com/android/settings/notification/NotificationVolumePreferenceController.java
+++ b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
@@ -56,7 +56,7 @@
 
     @Override
     public int getMuteIcon() {
-        return com.android.internal.R.drawable.ic_audio_ring_notif_mute;
+        return R.drawable.ic_notifications_off_24dp;
     }
 
 }
diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java
index d58eabd..47bb56f 100644
--- a/src/com/android/settings/notification/RingVolumePreferenceController.java
+++ b/src/com/android/settings/notification/RingVolumePreferenceController.java
@@ -126,12 +126,12 @@
         if (mPreference != null) {
             if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
                 mMuteIcon = R.drawable.ic_volume_ringer_vibrate;
-                mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif_vibrate);
+                mPreference.showIcon(R.drawable.ic_volume_ringer_vibrate);
             } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) {
                 mMuteIcon = R.drawable.ic_notifications_off_24dp;
-                mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif_mute);
+                mPreference.showIcon(R.drawable.ic_notifications_off_24dp);
             } else {
-                mPreference.showIcon(com.android.internal.R.drawable.ic_audio_ring_notif);
+                mPreference.showIcon(R.drawable.ic_notifications);
             }
         }
     }
diff --git a/src/com/android/settings/search/DeviceIndexUpdateJobService.java b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
index 97b0a61..3eb9041 100644
--- a/src/com/android/settings/search/DeviceIndexUpdateJobService.java
+++ b/src/com/android/settings/search/DeviceIndexUpdateJobService.java
@@ -38,8 +38,8 @@
 
 import androidx.slice.Slice;
 import androidx.slice.SliceItem;
-import androidx.slice.SliceManager;
-import androidx.slice.SliceManager.SliceCallback;
+import androidx.slice.SliceViewManager;
+import androidx.slice.SliceViewManager.SliceCallback;
 import androidx.slice.SliceMetadata;
 import androidx.slice.core.SliceQuery;
 import androidx.slice.widget.ListContent;
@@ -80,7 +80,7 @@
         }
         final DeviceIndexFeatureProvider indexProvider = FeatureFactory.getFactory(this)
                 .getDeviceIndexFeatureProvider();
-        final SliceManager manager = getSliceManager();
+        final SliceViewManager manager = getSliceViewManager();
         final Uri baseUri = new Builder()
                 .scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(SettingsSliceProvider.SLICE_AUTHORITY)
@@ -124,8 +124,8 @@
         jobFinished(params, false);
     }
 
-    protected SliceManager getSliceManager() {
-        return SliceManager.getInstance(this);
+    protected SliceViewManager getSliceViewManager() {
+        return SliceViewManager.getInstance(this);
     }
 
     protected SliceMetadata getMetadata(Slice loadedSlice) {
@@ -158,7 +158,7 @@
         return null;
     }
 
-    protected Slice bindSliceSynchronous(SliceManager manager, Uri slice) {
+    protected Slice bindSliceSynchronous(SliceViewManager manager, Uri slice) {
         final Slice[] returnSlice = new Slice[1];
         CountDownLatch latch = new CountDownLatch(1);
         SliceCallback callback = new SliceCallback() {
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 557ecad..47736df 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -176,6 +176,13 @@
 
     @Override
     public Slice onBindSlice(Uri sliceUri) {
+        final Set<String> blockedKeys = getBlockedKeys();
+        final String key = sliceUri.getLastPathSegment();
+        if (blockedKeys.contains(key)) {
+            Log.e(TAG, "Requested blocked slice with Uri: " + sliceUri);
+            return null;
+        }
+
         // If adding a new Slice, do not directly match Slice URIs.
         // Use {@link SlicesDatabaseAccessor}.
         if (WifiCallingSliceHelper.WIFI_CALLING_URI.equals(sliceUri)) {
diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index 1e41393..d81734a 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -107,7 +107,9 @@
 
         if (!controller.isAvailable()) {
             Log.w(TAG, "Can't update " + key + " since the setting is unavailable");
-            updateUri(context, key, isPlatformSlice);
+            if (!controller.hasAsyncUpdate()) {
+                updateUri(context, key, isPlatformSlice);
+            }
             return;
         }
 
@@ -116,7 +118,9 @@
         final TogglePreferenceController toggleController = (TogglePreferenceController) controller;
         toggleController.setChecked(isChecked);
         logSliceValueChange(context, key, isChecked ? 1 : 0);
-        updateUri(context, key, isPlatformSlice);
+        if (!controller.hasAsyncUpdate()) {
+            updateUri(context, key, isPlatformSlice);
+        }
     }
 
     private void handleSliderAction(Context context, String key, int newPosition,
diff --git a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java
index 9437a00..8e3bb42 100644
--- a/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppStateNotificationBridgeTest.java
@@ -36,17 +36,21 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageEvents;
 import android.app.usage.UsageEvents.Event;
-import android.app.usage.UsageStatsManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.os.Looper;
 import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.view.ViewGroup;
 import android.widget.Switch;
 
@@ -79,7 +83,9 @@
     @Mock
     private ApplicationsState mState;
     @Mock
-    private UsageStatsManager mUsageStats;
+    private IUsageStatsManager mUsageStats;
+    @Mock
+    private UserManager mUserManager;
     @Mock
     private NotificationBackend mBackend;
     private Context mContext;
@@ -92,10 +98,12 @@
         when(mState.getBackgroundLooper()).thenReturn(mock(Looper.class));
         when(mBackend.getNotificationsBanned(anyString(), anyInt())).thenReturn(true);
         when(mBackend.isSystemApp(any(), any())).thenReturn(true);
+        // most tests assume no work profile
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
         mContext = RuntimeEnvironment.application.getApplicationContext();
 
         mBridge = new AppStateNotificationBridge(mContext, mState,
-                mock(AppStateBaseBridge.Callback.class), mUsageStats, mBackend);
+                mock(AppStateBaseBridge.Callback.class), mUsageStats, mUserManager, mBackend);
     }
 
     private AppEntry getMockAppEntry(String pkg) {
@@ -115,14 +123,15 @@
     }
 
     @Test
-    public void testGetAggregatedUsageEvents_noEvents() {
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(mock(UsageEvents.class));
+    public void testGetAggregatedUsageEvents_noEvents() throws Exception {
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(mock(UsageEvents.class));
 
         assertThat(mBridge.getAggregatedUsageEvents()).isEmpty();
     }
 
     @Test
-    public void testGetAggregatedUsageEvents_onlyNotificationEvents() {
+    public void testGetAggregatedUsageEvents_onlyNotificationEvents() throws Exception {
         List<Event> events = new ArrayList<>();
         Event good = new Event();
         good.mEventType = Event.NOTIFICATION_INTERRUPTION;
@@ -136,14 +145,15 @@
         events.add(bad);
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(usageEvents);
 
         Map<String, NotificationsSentState> map = mBridge.getAggregatedUsageEvents();
-        assertThat(map.get(PKG1).sentCount).isEqualTo(1);
+        assertThat(map.get(mBridge.getKey(0, PKG1)).sentCount).isEqualTo(1);
     }
 
     @Test
-    public void testGetAggregatedUsageEvents_multipleEventsAgg() {
+    public void testGetAggregatedUsageEvents_multipleEventsAgg() throws Exception {
         List<Event> events = new ArrayList<>();
         Event good = new Event();
         good.mEventType = Event.NOTIFICATION_INTERRUPTION;
@@ -157,15 +167,16 @@
         events.add(good1);
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(usageEvents);
 
         Map<String, NotificationsSentState> map  = mBridge.getAggregatedUsageEvents();
-        assertThat(map.get(PKG1).sentCount).isEqualTo(2);
-        assertThat(map.get(PKG1).lastSent).isEqualTo(6);
+        assertThat(map.get(mBridge.getKey(0, PKG1)).sentCount).isEqualTo(2);
+        assertThat(map.get(mBridge.getKey(0, PKG1)).lastSent).isEqualTo(6);
     }
 
     @Test
-    public void testGetAggregatedUsageEvents_multiplePkgs() {
+    public void testGetAggregatedUsageEvents_multiplePkgs() throws Exception {
         List<Event> events = new ArrayList<>();
         Event good = new Event();
         good.mEventType = Event.NOTIFICATION_INTERRUPTION;
@@ -179,19 +190,21 @@
         events.add(good1);
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(usageEvents);
 
         Map<String, NotificationsSentState> map
                 = mBridge.getAggregatedUsageEvents();
-        assertThat(map.get(PKG1).sentCount).isEqualTo(1);
-        assertThat(map.get(PKG2).sentCount).isEqualTo(1);
-        assertThat(map.get(PKG1).lastSent).isEqualTo(6);
-        assertThat(map.get(PKG2).lastSent).isEqualTo(1);
+        assertThat(map.get(mBridge.getKey(0, PKG1)).sentCount).isEqualTo(1);
+        assertThat(map.get(mBridge.getKey(0, PKG2)).sentCount).isEqualTo(1);
+        assertThat(map.get(mBridge.getKey(0, PKG1)).lastSent).isEqualTo(6);
+        assertThat(map.get(mBridge.getKey(0, PKG2)).lastSent).isEqualTo(1);
     }
 
     @Test
-    public void testLoadAllExtraInfo_noEvents() {
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(mock(UsageEvents.class));
+    public void testLoadAllExtraInfo_noEvents() throws RemoteException {
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(mock(UsageEvents.class));
         ArrayList<AppEntry> apps = new ArrayList<>();
         apps.add(getMockAppEntry(PKG1));
         when(mSession.getAllApps()).thenReturn(apps);
@@ -201,7 +214,7 @@
     }
 
     @Test
-    public void testLoadAllExtraInfo_multipleEventsAgg() {
+    public void testLoadAllExtraInfo_multipleEventsAgg() throws RemoteException {
         List<Event> events = new ArrayList<>();
         for (int i = 0; i < 7; i++) {
             Event good = new Event();
@@ -212,7 +225,8 @@
         }
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(usageEvents);
 
         ArrayList<AppEntry> apps = new ArrayList<>();
         apps.add(getMockAppEntry(PKG1));
@@ -229,7 +243,7 @@
     }
 
     @Test
-    public void testLoadAllExtraInfo_multiplePkgs() {
+    public void testLoadAllExtraInfo_multiplePkgs() throws RemoteException {
         List<Event> events = new ArrayList<>();
         for (int i = 0; i < 8; i++) {
             Event good = new Event();
@@ -245,7 +259,8 @@
         events.add(good1);
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()))
+                .thenReturn(usageEvents);
 
         ArrayList<AppEntry> apps = new ArrayList<>();
         apps.add(getMockAppEntry(PKG1));
@@ -265,8 +280,66 @@
     }
 
     @Test
-    public void testUpdateExtraInfo_noEvents() {
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(mock(UsageEvents.class));
+    public void testLoadAllExtraInfo_multipleUsers() throws RemoteException {
+        // has work profile
+        when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{1});
+        mBridge = new AppStateNotificationBridge(mContext, mState,
+                mock(AppStateBaseBridge.Callback.class), mUsageStats, mUserManager, mBackend);
+
+        List<Event> eventsProfileOwner = new ArrayList<>();
+        for (int i = 0; i < 8; i++) {
+            Event good = new Event();
+            good.mEventType = Event.NOTIFICATION_INTERRUPTION;
+            good.mPackage = PKG1;
+            good.mTimeStamp = i;
+            eventsProfileOwner.add(good);
+        }
+
+        List<Event> eventsProfile = new ArrayList<>();
+        for (int i = 0; i < 4; i++) {
+            Event good = new Event();
+            good.mEventType = Event.NOTIFICATION_INTERRUPTION;
+            good.mPackage = PKG1;
+            good.mTimeStamp = i;
+            eventsProfile.add(good);
+        }
+
+        UsageEvents usageEventsOwner = getUsageEvents(eventsProfileOwner);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), eq(0), anyString()))
+                .thenReturn(usageEventsOwner);
+
+        UsageEvents usageEventsProfile = getUsageEvents(eventsProfile);
+        when(mUsageStats.queryEventsForUser(anyLong(), anyLong(), eq(1), anyString()))
+                .thenReturn(usageEventsProfile);
+
+        ArrayList<AppEntry> apps = new ArrayList<>();
+        AppEntry owner = getMockAppEntry(PKG1);
+        owner.info.uid = 1;
+        apps.add(owner);
+
+        AppEntry profile = getMockAppEntry(PKG1);
+        profile.info.uid = UserHandle.PER_USER_RANGE + 1;
+        apps.add(profile);
+        when(mSession.getAllApps()).thenReturn(apps);
+
+        mBridge.loadAllExtraInfo();
+
+        assertThat(((NotificationsSentState) apps.get(0).extraInfo).sentCount).isEqualTo(8);
+        assertThat(((NotificationsSentState) apps.get(0).extraInfo).lastSent).isEqualTo(7);
+        assertThat(((NotificationsSentState) apps.get(0).extraInfo).avgSentWeekly).isEqualTo(0);
+        assertThat(((NotificationsSentState) apps.get(0).extraInfo).avgSentDaily).isEqualTo(1);
+
+        assertThat(((NotificationsSentState) apps.get(1).extraInfo).sentCount).isEqualTo(4);
+        assertThat(((NotificationsSentState) apps.get(1).extraInfo).lastSent).isEqualTo(3);
+        assertThat(((NotificationsSentState) apps.get(1).extraInfo).avgSentWeekly).isEqualTo(4);
+        assertThat(((NotificationsSentState) apps.get(1).extraInfo).avgSentDaily).isEqualTo(1);
+    }
+
+    @Test
+    public void testUpdateExtraInfo_noEvents() throws RemoteException {
+        when(mUsageStats.queryEventsForPackageForUser(
+                anyLong(), anyLong(), anyInt(), anyString(), anyString()))
+                .thenReturn(mock(UsageEvents.class));
         AppEntry entry = getMockAppEntry(PKG1);
 
         mBridge.updateExtraInfo(entry, "", 0);
@@ -274,7 +347,7 @@
     }
 
     @Test
-    public void testUpdateExtraInfo_multipleEventsAgg() {
+    public void testUpdateExtraInfo_multipleEventsAgg() throws RemoteException {
         List<Event> events = new ArrayList<>();
         for (int i = 0; i < 13; i++) {
             Event good = new Event();
@@ -285,7 +358,8 @@
         }
 
         UsageEvents usageEvents = getUsageEvents(events);
-        when(mUsageStats.queryEvents(anyLong(), anyLong())).thenReturn(usageEvents);
+        when(mUsageStats.queryEventsForPackageForUser(
+                anyLong(), anyLong(), anyInt(), anyString(), anyString())).thenReturn(usageEvents);
 
         AppEntry entry = getMockAppEntry(PKG1);
         mBridge.updateExtraInfo(entry, "", 0);
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index 66fa212..89b7d5e 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -40,6 +40,7 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Looper;
+import android.os.UserManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -272,6 +273,10 @@
     @Test
     public void applicationsAdapter_onBindViewHolder_updateSwitch_notifications() {
         ManageApplications manageApplications = mock(ManageApplications.class);
+        when(manageApplications.getActivity()).thenReturn(mock(Activity.class));
+        UserManager um = mock(UserManager.class);
+        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
         manageApplications.mListType = LIST_TYPE_NOTIFICATION;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
@@ -293,6 +298,9 @@
         manageApplications.mListType = LIST_TYPE_MAIN;
         ApplicationViewHolder holder = mock(ApplicationViewHolder.class);
         ReflectionHelpers.setField(holder, "itemView", mock(View.class));
+        UserManager um = mock(UserManager.class);
+        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
         ManageApplications.ApplicationsAdapter adapter =
                 new ManageApplications.ApplicationsAdapter(mState,
                         manageApplications, mock(AppFilterItem.class),
@@ -308,6 +316,10 @@
     @Test
     public void sortOrderSavedOnRebuild() {
         ManageApplications manageApplications = mock(ManageApplications.class);
+        when(manageApplications.getActivity()).thenReturn(mock(Activity.class));
+        UserManager um = mock(UserManager.class);
+        when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
+        ReflectionHelpers.setField(manageApplications, "mUserManager", um);
         manageApplications.mListType = LIST_TYPE_NOTIFICATION;
         manageApplications.mSortOrder = -1;
         ManageApplications.ApplicationsAdapter adapter =
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
index ceea81e..ce55802 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java
@@ -55,7 +55,8 @@
 
         mContext = spy(RuntimeEnvironment.application);
         mContentResolver = mContext.getContentResolver();
-        mNfcController = new NfcPreferenceController(mContext);
+        mNfcController = new NfcPreferenceController(mContext,
+                NfcPreferenceController.KEY_TOGGLE_NFC);
         mShadowNfcAdapter = shadowOf(ShadowNfcAdapter.getNfcAdapter(mContext));
     }
 
diff --git a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
index eec4e37..ad2dabb 100644
--- a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
@@ -135,6 +135,11 @@
     }
 
     @Test
+    public void hasAsyncUpdate_shouldReturnFalse() {
+        assertThat(mPreferenceController.hasAsyncUpdate()).isFalse();
+    }
+
+    @Test
     public void settingAvailable_disabledOnDisplayPreference_preferenceEnabled() {
         final PreferenceScreen screen = mock(PreferenceScreen.class);
         final Preference preference = new Preference(mContext);
diff --git a/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java
deleted file mode 100644
index 9a02936..0000000
--- a/tests/robotests/src/com/android/settings/development/ConnectivityMonitorPreferenceControllerTest.java
+++ /dev/null
@@ -1,191 +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.development;
-
-import static com.android.settings.development.ConnectivityMonitorPreferenceController.ENG_BUILD;
-import static com.android.settings.development.ConnectivityMonitorPreferenceController.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.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)
-public class ConnectivityMonitorPreferenceControllerTest {
-
-    private static final String USER_BUILD = "user";
-
-    @Mock
-    private PreferenceScreen mScreen;
-    @Mock
-    private SwitchPreference mPreference;
-
-    private Context mContext;
-    private ConnectivityMonitorPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        mController = new ConnectivityMonitorPreferenceController(mContext);
-        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
-        mController.displayPreference(mScreen);
-    }
-
-    @Test
-    public void isAvailable_trueShowFlagWithUserdebugBuild_shouldReturnTrue() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_trueShowFlagWithEngBuild_shouldReturnTrue() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, ENG_BUILD);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_trueShowFlagWithUserBuild_shouldReturnFalse() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USER_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void isAvailable_falseShowFlagWithUserdebugBuild_shouldReturnFalse() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void isAvailable_falseShowFlagWithEngBuild_shouldReturnFalse() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, ENG_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void isAvailable_falseShowFlagWithUserBuild_shouldReturnFalse() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USER_BUILD);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    public void updateState_connectivityMonitorEnabled_shouldCheckedPreference() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.ENABLED_STATUS);
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(true);
-    }
-
-    @Test
-    public void updateState_connectivityMonitorUserEnabled_shouldCheckedPreference() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.USER_ENABLED_STATUS);
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(true);
-    }
-
-    @Test
-    public void updateState_connectivityMonitorDisabled_shouldUncheckedPreference() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.DISABLED_STATUS);
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(false);
-    }
-
-    @Test
-    public void updateState_connectivityMonitorUserDisabled_shouldUncheckedPreference() {
-        SystemProperties.set(ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.USER_DISABLED_STATUS);
-        SystemProperties.set(ConnectivityMonitorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
-
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(false);
-    }
-
-    @Test
-    public void onPreferenceChange_preferenceChecked_shouldEnableConnectivityMonitor() {
-        SystemProperties.set(
-                ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.USER_ENABLED_STATUS);
-
-        mController.handlePreferenceTreeClick(mPreference);
-
-        assertThat(ConnectivityMonitorPreferenceController.USER_ENABLED_STATUS).isEqualTo(
-                SystemProperties.get(
-                        ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                        ConnectivityMonitorPreferenceController.DISABLED_STATUS));
-    }
-
-    @Test
-    public void onPreferenceChange_preferenceUnchecked_shouldDisableConnectivityMonitor() {
-        SystemProperties.set(
-                ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                ConnectivityMonitorPreferenceController.USER_DISABLED_STATUS);
-
-        mController.handlePreferenceTreeClick(mPreference);
-
-        assertThat(ConnectivityMonitorPreferenceController.USER_DISABLED_STATUS).isEqualTo(
-                SystemProperties.get(
-                        ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                        ConnectivityMonitorPreferenceController.DISABLED_STATUS));
-    }
-
-    @Test
-    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
-        mController.onDeveloperOptionsSwitchDisabled();
-
-        String mode = SystemProperties.get(
-                ConnectivityMonitorPreferenceController.PROPERTY_CONNECTIVITY_MONITOR,
-                null /* default */);
-
-        assertThat(mode).isEqualTo(ConnectivityMonitorPreferenceController.USER_DISABLED_STATUS);
-        verify(mPreference).setEnabled(false);
-        verify(mPreference).setChecked(false);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java
new file mode 100644
index 0000000..83fb3eb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/SystemUiThemePreferenceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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.display;
+
+import static android.provider.Settings.Secure.THEME_MODE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+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;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SystemUiThemePreferenceControllerTest {
+
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
+    @Mock
+    private ListPreference mListPreference;
+    private Context mContext;
+    private SystemUiThemePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mListPreference);
+        CharSequence[] entries = mContext.getResources().getStringArray(
+                R.array.systemui_theme_entries);
+        when(mListPreference.getEntries()).thenReturn(entries);
+        mController = spy(new SystemUiThemePreferenceController(mContext, "systemui_theme"));
+    }
+
+    @Test
+    public void displayPreference_readsSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, 2);
+        mController.displayPreference(mPreferenceScreen);
+        verify(mListPreference).setValue(eq("2"));
+    }
+
+    @Test
+    public void onPreferenceChange_writesSetting() {
+        Settings.Secure.putInt(mContext.getContentResolver(), THEME_MODE, 2);
+        mController.displayPreference(mPreferenceScreen);
+        mController.onPreferenceChange(mListPreference, "0");
+        int value = Settings.Secure.getInt(mContext.getContentResolver(), THEME_MODE, 2);
+        assertThat(value).isEqualTo(0);
+    }
+
+    @Test
+    public void onPreferenceChange_updatesSummary() {
+        mController.displayPreference(mPreferenceScreen);
+        mController.onPreferenceChange(mListPreference, "0");
+        verify(mController).getSummary();
+    }
+
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
index df5bb64..8232afe 100644
--- a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
@@ -72,7 +72,8 @@
                 UserManager.DISALLOW_OUTGOING_BEAM, UserHandle.myUserId())).thenReturn(false);
         when(NfcAdapter.getDefaultAdapter(mContext)).thenReturn(mNfcAdapter);
 
-        mAndroidBeamController = new AndroidBeamPreferenceController(mContext);
+        mAndroidBeamController = new AndroidBeamPreferenceController(mContext,
+                AndroidBeamPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
         mAndroidBeamPreference = new RestrictedPreference(RuntimeEnvironment.application);
         when(mScreen.findPreference(mAndroidBeamController.getPreferenceKey())).thenReturn(
                 mAndroidBeamPreference);
diff --git a/tests/robotests/src/com/android/settings/nfc/NfcAirplaneModeObserverTest.java b/tests/robotests/src/com/android/settings/nfc/NfcAirplaneModeObserverTest.java
new file mode 100644
index 0000000..b6d28d1
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/nfc/NfcAirplaneModeObserverTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.nfc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.nfc.NfcAdapter;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v14.preference.SwitchPreference;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowNfcAdapter;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowNfcAdapter.class})
+public class NfcAirplaneModeObserverTest {
+
+    Context mContext;
+    private NfcAdapter mNfcAdapter;
+    private SwitchPreference mNfcPreference;
+    private NfcAirplaneModeObserver mNfcAirplaneModeObserver;
+
+    @Before
+    public void setUp() {
+        mContext = ShadowApplication.getInstance().getApplicationContext();
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
+
+        mNfcPreference = new SwitchPreference(RuntimeEnvironment.application);
+
+        mNfcAirplaneModeObserver = new NfcAirplaneModeObserver(mContext, mNfcAdapter,
+                (Preference) mNfcPreference);
+    }
+
+    @Test
+    public void NfcAirplaneModeObserver_airplaneOn_shouldDisableNfc() {
+        ReflectionHelpers.setField(mNfcAirplaneModeObserver,
+                "mAirplaneMode", 0);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_ON, 1);
+
+        mNfcAirplaneModeObserver.onChange(false,
+                NfcAirplaneModeObserver.AIRPLANE_MODE_URI);
+
+        assertThat(mNfcAdapter.isEnabled()).isFalse();
+        assertThat(mNfcPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void NfcAirplaneModeObserver_airplaneOff_shouldEnableNfc() {
+        ReflectionHelpers.setField(mNfcAirplaneModeObserver,
+                "mAirplaneMode", 1);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_ON, 0);
+
+        mNfcAirplaneModeObserver.onChange(false,
+                NfcAirplaneModeObserver.AIRPLANE_MODE_URI);
+
+        assertThat(mNfcAdapter.isEnabled()).isTrue();
+        assertThat(mNfcPreference.isEnabled()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java
index 802e199..008d158 100644
--- a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -26,8 +27,8 @@
 import android.nfc.NfcManager;
 import android.os.UserManager;
 import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.PreferenceScreen;
+import android.support.v14.preference.SwitchPreference;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -68,8 +69,10 @@
         when(mContext.getSystemService(Context.NFC_SERVICE)).thenReturn(mManager);
         when(NfcAdapter.getDefaultAdapter(mContext)).thenReturn(mNfcAdapter);
 
-        mNfcController = new NfcPreferenceController(mContext);
+        mNfcController = new NfcPreferenceController(mContext,
+                NfcPreferenceController.KEY_TOGGLE_NFC);
         mNfcPreference = new SwitchPreference(RuntimeEnvironment.application);
+
         when(mScreen.findPreference(mNfcController.getPreferenceKey())).thenReturn(mNfcPreference);
 
         Settings.Global.putString(mContext.getContentResolver(),
@@ -83,15 +86,17 @@
     }
 
     @Test
-    public void isAvailable_hasNfc_shouldReturnTrue() {
+    public void getAvailabilityStatus_hasNfc_shouldReturnAvailable() {
         when(mNfcAdapter.isEnabled()).thenReturn(true);
-        assertThat(mNfcController.isAvailable()).isTrue();
+        assertThat(mNfcController.getAvailabilityStatus())
+                .isEqualTo(NfcPreferenceController.AVAILABLE);
     }
 
     @Test
-    public void isAvailable_noNfcAdapter_shouldReturnFalse() {
+    public void getAvailabilityStatus_noNfcAdapter_shouldReturnDisabledUnsupported() {
         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
-        assertThat(mNfcController.isAvailable()).isFalse();
+        assertThat(mNfcController.getAvailabilityStatus())
+                .isEqualTo(NfcPreferenceController.UNSUPPORTED_ON_DEVICE);
     }
 
     @Test
@@ -157,4 +162,46 @@
 
         assertThat(keys).hasSize(1);
     }
+    @Test
+    public void setChecked_True_nfcShouldEnable() {
+        mNfcController.setChecked(true);
+        mNfcController.onResume();
+
+        verify(mNfcAdapter).enable();
+    }
+
+    @Test
+    public void setChecked_False_nfcShouldDisable() {
+        mNfcController.setChecked(false);
+        mNfcController.onResume();
+
+        verify(mNfcAdapter).disable();
+    }
+
+    @Test
+    public void hasAsyncUpdate_shouldReturnTrue() {
+        assertThat(mNfcController.hasAsyncUpdate()).isTrue();
+    }
+
+    @Test
+    public void isToggleableInAirplaneMode_containNfc_shouldReturnTrue() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
+                Settings.Global.RADIO_NFC);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_ON, 1);
+
+        assertThat(NfcPreferenceController.isToggleableInAirplaneMode(mContext)).isTrue();
+    }
+
+    @Test
+    public void isToggleableInAirplaneMode_withoutNfc_shouldReturnFalse() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
+                "null");
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_ON, 1);
+
+        assertThat(NfcPreferenceController.isToggleableInAirplaneMode(mContext)).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java b/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
index b5de973..1c02b99 100644
--- a/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/search/DeviceIndexUpdateJobServiceTest.java
@@ -45,7 +45,7 @@
 import java.util.List;
 
 import androidx.slice.Slice;
-import androidx.slice.SliceManager;
+import androidx.slice.SliceViewManager;
 import androidx.slice.SliceMetadata;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -57,17 +57,17 @@
 
     private Activity mActivity;
     private DeviceIndexUpdateJobService mJob;
-    private SliceManager mSliceManager;
+    private SliceViewManager mSliceManager;
 
     @Before
     public void setup() {
         FakeFeatureFactory.setupForTest();
         mActivity = spy(Robolectric.buildActivity(Activity.class).create().visible().get());
         mJob = spy(new DeviceIndexUpdateJobService());
-        mSliceManager = mock(SliceManager.class);
+        mSliceManager = mock(SliceViewManager.class);
 
         doReturn(mActivity.getPackageName()).when(mJob).getPackageName();
-        doReturn(mSliceManager).when(mJob).getSliceManager();
+        doReturn(mSliceManager).when(mJob).getSliceViewManager();
         doNothing().when(mJob).jobFinished(null, false);
     }
 
@@ -144,4 +144,4 @@
         when(mSliceManager.getSliceDescendants(BASE_URI)).thenReturn(mUris);
     }
 
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index bb064d1..df960d8 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -22,6 +22,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -35,6 +36,7 @@
 import android.net.Uri;
 import android.os.StrictMode;
 import android.provider.SettingsSlicesContract;
+import android.util.ArraySet;
 
 import com.android.settings.location.LocationSliceBuilder;
 import com.android.settings.wifi.WifiSliceBuilder;
@@ -56,6 +58,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import androidx.slice.Slice;
 
@@ -193,6 +196,24 @@
     }
 
     @Test
+    public void onBindSlice_requestsBlockedSlice_retunsNull() {
+        final String blockedKey = "blocked_key";
+        final Set<String> blockedSet = new ArraySet<>();
+        blockedSet.add(blockedKey);
+        doReturn(blockedSet).when(mProvider).getBlockedKeys();
+        final Uri blockedUri = new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(SettingsSliceProvider.SLICE_AUTHORITY)
+                .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+                .appendPath(blockedKey)
+                .build();
+
+        final Slice slice = mProvider.onBindSlice(blockedUri);
+
+        assertThat(slice).isNull();
+    }
+
+    @Test
     public void testLoadSlice_cachedEntryRemovedOnUnpin() {
         SliceData data = getDummyData();
         mProvider.mSliceDataCache.put(data.getUri(), data);
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index 21a0206..25f0d0c 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -23,6 +23,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
@@ -135,6 +136,60 @@
     }
 
     @Test
+    public void toggleUpdate_synchronously_notifyChange_should_be_called() {
+        // Monitor the ContentResolver
+        final ContentResolver resolver = spy(mContext.getContentResolver());
+        doReturn(resolver).when(mContext).getContentResolver();
+
+        final String key = "key";
+        mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
+        insertSpecialCase(key);
+
+        FakeToggleController fakeToggleController = new FakeToggleController(mContext, key);
+        fakeToggleController.setChecked(true);
+        // Set the toggle setting update synchronously.
+        fakeToggleController.setAsyncUpdate(false);
+        Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
+        intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
+
+        assertThat(fakeToggleController.isChecked()).isTrue();
+
+        // Toggle setting
+        mReceiver.onReceive(mContext, intent);
+
+        assertThat(fakeToggleController.isChecked()).isFalse();
+
+        final Uri expectedUri = SliceBuilderUtils.getUri(
+                SettingsSlicesContract.PATH_SETTING_ACTION + "/" + key, false);
+        verify(resolver).notifyChange(eq(expectedUri), eq(null));
+    }
+
+    @Test
+    public void toggleUpdate_asynchronously_notifyChange_should_not_be_called() {
+        // Monitor the ContentResolver
+        final ContentResolver resolver = spy(mContext.getContentResolver());
+        doReturn(resolver).when(mContext).getContentResolver();
+
+        final String key = "key";
+        mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
+        insertSpecialCase(key);
+
+        FakeToggleController fakeToggleController = new FakeToggleController(mContext, key);
+        fakeToggleController.setChecked(true);
+        // Set the toggle setting update asynchronously.
+        fakeToggleController.setAsyncUpdate(true);
+        Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
+        intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
+
+        assertThat(fakeToggleController.isChecked()).isTrue();
+
+        // Toggle setting
+        mReceiver.onReceive(mContext, intent);
+
+        verify(resolver, never()).notifyChange(null, null);
+    }
+
+    @Test
     public void onReceive_sliderChanged() {
         final String key = "key";
         final Uri uri = new Uri.Builder()
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
index 680a04d..8e408f0 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeToggleController.java
@@ -36,6 +36,8 @@
     private final int ON = 1;
     private final int OFF = 0;
 
+    private boolean mIsAsyncUpdate = false;
+
     public FakeToggleController(Context context, String preferenceKey) {
         super(context, preferenceKey);
     }
@@ -67,4 +69,13 @@
     public boolean isSliceable() {
         return true;
     }
+
+    @Override
+    public boolean hasAsyncUpdate() {
+        return mIsAsyncUpdate;
+    }
+
+    public void setAsyncUpdate(boolean isAsyncUpdate) {
+        mIsAsyncUpdate = isAsyncUpdate;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowNfcAdapter.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowNfcAdapter.java
index e4421ee..07c8e54 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowNfcAdapter.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowNfcAdapter.java
@@ -33,6 +33,7 @@
 @Implements(NfcAdapter.class)
 public class ShadowNfcAdapter {
     private static boolean sReaderModeEnabled;
+    private boolean mIsNfcEnabled = false;
 
     @Implementation
     public void enableReaderMode(Activity activity, NfcAdapter.ReaderCallback callback, int flags,
@@ -46,6 +47,23 @@
                 NfcAdapter.class, ClassParameter.from(Context.class, context));
     }
 
+    @Implementation
+    public boolean isEnabled() {
+        return mIsNfcEnabled;
+    }
+
+    @Implementation
+    public boolean enable() {
+        mIsNfcEnabled = true;
+        return true;
+    }
+
+    @Implementation
+    public boolean disable() {
+        mIsNfcEnabled = false;
+        return true;
+    }
+
     public static boolean isReaderModeEnabled() {
         return sReaderModeEnabled;
     }