Merge "Add settings page for notification channel groups"
diff --git a/res/drawable/ic_airplanemode_active.xml b/res/drawable/ic_airplanemode_active.xml
index 5759341..10dd7ed 100644
--- a/res/drawable/ic_airplanemode_active.xml
+++ b/res/drawable/ic_airplanemode_active.xml
@@ -20,9 +20,9 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M10.18,9"
-        android:fillColor="#FFFFFFFF"/>
-    <path
-        android:pathData="M21,16v-2l-8,-5V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5V9l-8,5v2l8,-2.5V19l-2,1.5V22l3.5,-1 3.5,1v-1.5L13,19v-5.5l8,2.5z"
+        android:pathData="M20.8,13.56L13.5,9V3.5C13.5,2.67,12.83,2,12,2s-1.5,0.67-1.5,1.5V9l-7.3,4.56c-0.43,0.27-0.7,0.75-0.7,1.27v0.49
+c0,0.34,0.33,0.58,0.65,0.48l7.35-2.3V19l-1.6,1.2c-0.25,0.19-0.4,0.49-0.4,0.8v0.67c0,0.17,0.14,0.28,0.31,0.24
+c1.94-0.55,1.3-0.37,3.19-0.91c1.21,0.35,1.99,0.57,3.19,0.91c0.17,0.04,0.31-0.07,0.31-0.24V21c0-0.31-0.15-0.61-0.4-0.8L13.5,19
+v-5.5l7.35,2.3c0.32,0.1,0.65-0.14,0.65-0.48v-0.49C21.5,14.31,21.23,13.83,20.8,13.56z"
         android:fillColor="#FFFFFFFF"/>
 </vector>
diff --git a/res/drawable/ic_apps.xml b/res/drawable/ic_apps.xml
index 784a818..9f00141 100644
--- a/res/drawable/ic_apps.xml
+++ b/res/drawable/ic_apps.xml
@@ -20,6 +20,11 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
+        android:pathData="M6 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 12c1.1 0 2-.9 2-2s-.9-2-2-2-2
+.9-2 2 .9 2 2 2zm-6 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0-6c1.1 0 2-.9
+2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2
+2zm4-8c0 1.1 .9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zm-4 2c1.1 0 2-.9
+2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2
+2zm0 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"
         android:fillColor="#FFFFFFFF"/>
 </vector>
diff --git a/res/drawable/ic_arrow_down_24dp.xml b/res/drawable/ic_arrow_down_24dp.xml
index 7c5866d..f334902 100644
--- a/res/drawable/ic_arrow_down_24dp.xml
+++ b/res/drawable/ic_arrow_down_24dp.xml
@@ -22,5 +22,6 @@
         android:tint="?android:attr/colorAccent">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
+        android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0
+1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z"/>
 </vector>
diff --git a/res/drawable/ic_cast_24dp.xml b/res/drawable/ic_cast_24dp.xml
index 7dc895e..948deca 100644
--- a/res/drawable/ic_cast_24dp.xml
+++ b/res/drawable/ic_cast_24dp.xml
@@ -22,5 +22,10 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z"/>
+        android:pathData="M1 18v2c0 .55 .45 1 1 1h2c0-1.66-1.34-3-3-3zm0-2.94c-.01 .51 .32 .93 .82 1.02
+2.08 .36 3.74 2 4.1 4.08 .09 .48 .5 .84 .99 .84 .61 0 1.09-.54 1-1.14a6.996
+6.996 0 0 0-5.8-5.78c-.59-.09-1.09 .38 -1.11 .98 zm0-4.03c-.01 .52 .34 .96 .85
+1.01 4.26 .43 7.68 3.82 8.1 8.08 .05 .5 .48 .88 .99 .88 .59 0 1.06-.51
+1-1.1-.52-5.21-4.66-9.34-9.87-9.85-.57-.05-1.05 .4 -1.07 .98 zM21 3H3c-1.1 0-2
+.9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/>
 </vector>
diff --git a/res/drawable/ic_chevron_right_24dp.xml b/res/drawable/ic_chevron_right_24dp.xml
index 63532cb..ba62187 100644
--- a/res/drawable/ic_chevron_right_24dp.xml
+++ b/res/drawable/ic_chevron_right_24dp.xml
@@ -23,5 +23,6 @@
     android:viewportWidth="24.0"
     android:tint="?android:attr/colorControlNormal">
     <path android:fillColor="#FF000000"
-          android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z" />
+          android:pathData="M9.29,15.63l3.88-3.88L9.29,7.87c-0.39-0.39-0.39-1.02,0-1.41l0,0c0.39-0.39,1.02-0.39,1.41,0l4.59,4.59
+c0.39,0.39,0.39,1.02,0,1.41l-4.59,4.59c-0.39,0.39-1.02,0.39-1.41,0l0,0C8.91,16.66,8.9,16.02,9.29,15.63z" />
 </vector>
diff --git a/res/drawable/ic_devices_other.xml b/res/drawable/ic_devices_other.xml
index 20639a3..b22e483 100644
--- a/res/drawable/ic_devices_other.xml
+++ b/res/drawable/ic_devices_other.xml
@@ -20,6 +20,13 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M3,6h18L21,4L3,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h4v-2L3,18L3,6zM13,12L9,12v1.78c-0.61,0.55 -1,1.33 -1,2.22s0.39,1.67 1,2.22L9,20h4v-1.78c0.61,-0.55 1,-1.34 1,-2.22s-0.39,-1.67 -1,-2.22L13,12zM11,17.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM22,8h-6c-0.5,0 -1,0.5 -1,1v10c0,0.5 0.5,1 1,1h6c0.5,0 1,-0.5 1,-1L23,9c0,-0.5 -0.5,-1 -1,-1zM21,18h-4v-8h4v8z"
-        android:fillColor="#FFFFFFFF"/>
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M3,6h17c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H3C1.9,4,1,4.9,1,6v12c0,1.1,0.9,2,2,2h3c0.55,0,1-0.45,1-1v0
+        c0-0.55-0.45-1-1-1H3V6z
+        M13,12H9v1.78C8.39,14.33,8,15.11,8,16c0,0.89,0.39,1.67,1,2.22V20h4v-1.78c0.61-0.55,1-1.34,1-2.22
+        s-0.39-1.67-1-2.22V12z
+        M11,17.5c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5S11.83,17.5,11,17.5z
+        M22,8h-6
+        c-0.5,0-1,0.5-1,1v10c0,0.5,0.5,1,1,1h6c0.5,0,1-0.5,1-1V9C23,8.5,22.5,8,22,8z
+        M21,18h-4v-8h4V18z" />
 </vector>
diff --git a/res/drawable/ic_expand_more.xml b/res/drawable/ic_expand_more.xml
index 609cf36..edffde3 100644
--- a/res/drawable/ic_expand_more.xml
+++ b/res/drawable/ic_expand_more.xml
@@ -23,7 +23,8 @@
     android:tint="?android:attr/colorControlNormal">
 
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="M16.59,8.59L12.0,13.17 7.41,8.59 6.0,10.0l6.0,6.0 6.0,-6.0z"/>
+        android:fillColor="#000000"
+        android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0
+1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z" />
 
 </vector>
diff --git a/res/drawable/ic_help.xml b/res/drawable/ic_help.xml
index 7a225e5..6add484 100644
--- a/res/drawable/ic_help.xml
+++ b/res/drawable/ic_help.xml
@@ -20,6 +20,11 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"
+        android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16.81c-.72
+0-1.3-.58-1.3-1.3s.58-1.3 1.3-1.3 1.3 .58 1.3 1.3-.58 1.3-1.3
+1.3zm1.07-4.62c-.09 .52 -.59 .87 -1.13 .79 -.57-.08-.94-.66-.83-1.23 .52 -2.61
+2.66-2.84 2.87-4.5 .12 -.96-.42-1.87-1.34-2.17-1.04-.33-2.21 .16 -2.55 1.37-.12
+.45 -.52 .74 -.97 .74 -.66 0-1.13-.63-.96-1.27 .63 -2.25 2.91-3.38 5.05-2.74
+1.71 .51 2.84 2.16 2.78 3.95-.07 2.44-2.49 2.61-2.92 5.06z"
         android:fillColor="#FFFFFFFF"/>
 </vector>
diff --git a/res/drawable/ic_info_outline_24dp.xml b/res/drawable/ic_info_outline_24dp.xml
deleted file mode 100644
index 3fe1e9e..0000000
--- a/res/drawable/ic_info_outline_24dp.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 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/textColorSecondary">
-    <path
-        android:fillColor="#000000"
-        android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
-</vector>
diff --git a/res/drawable/ic_menu_add.xml b/res/drawable/ic_menu_add.xml
index 3387f29..9e2175b 100644
--- a/res/drawable/ic_menu_add.xml
+++ b/res/drawable/ic_menu_add.xml
@@ -23,5 +23,6 @@
     android:tint="?android:attr/colorAccent">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+        android:pathData="M18,13h-5v5c0,0.55-0.45,1-1,1h0c-0.55,0-1-0.45-1-1v-5H6c-0.55,0-1-0.45-1-1v0c0-0.55,0.45-1,1-1h5V6c0-0.55,0.45-1,1-1h0
+c0.55,0,1,0.45,1,1v5h5c0.55,0,1,0.45,1,1v0C19,12.55,18.55,13,18,13z"/>
 </vector>
diff --git a/res/drawable/ic_restore.xml b/res/drawable/ic_restore.xml
index 737f811..201b1df 100644
--- a/res/drawable/ic_restore.xml
+++ b/res/drawable/ic_restore.xml
@@ -22,7 +22,11 @@
     android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89 .07 .14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7
-7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13
-21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54 .72 -1.21-3.5-2.08V8H12z" />
+        android:pathData="M13.5 7.75v4.5l3.37 2c.34 .2 .46 .65 .25 .99 s-.64 .45 -.98 .24 L12
+13V7.75c0-.41 .34 -.75 .75 -.75s.75 .34 .75 .75 zM13.05 3C8.11 3 4.1 7.02 4.1
+11.95c0 .02 .01 .03 .01 .05H2.05c-.47 0-.71 .57 -.37 .9 l2.95 2.94c.21 .21 .54
+.21 .75 0l2.95-2.94c.33-.33 .1 -.9-.37-.9H5.99c0-.02 .01 -.03 .01 -.05C6 8.06
+9.16 4.9 13.05 4.9S20.1 8.11 20.1 12s-3.16 7.1-7.05 7.1c-1.58
+0-3.08-.51-4.32-1.48a.94 .94 0 0 0-1.32 .16 l-.01 .01 a.94 .94 0 0 0 .16
+1.32l.01 .01 A8.77 8.77 0 0 0 13.05 21c4.94 0 8.95-4.07 8.95-9s-4.02-9-8.95-9z" />
 </vector>
\ No newline at end of file
diff --git a/res/drawable/ic_search_24dp.xml b/res/drawable/ic_search_24dp.xml
index 4693dd7..8f14e88 100644
--- a/res/drawable/ic_search_24dp.xml
+++ b/res/drawable/ic_search_24dp.xml
@@ -16,12 +16,15 @@
   -->
 
 <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">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+
     <path
-        android:pathData="M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z"
-        android:fillColor="#ffffff"/>
-</vector>
+        android:fillColor="#000000"
+        android:pathData="M15.5,14h-0.79l-0.28-0.27c1.2-1.4,1.82-3.31,1.48-5.34c-0.47-2.78-2.79-5-5.59-5.34c-4.23-0.52-7.79,3.04-7.27,7.27
+c0.34,2.8,2.56,5.12,5.34,5.59c2.03,0.34,3.94-0.28,5.34-1.48L14,14.71v0.79l5.2,5.19c0.41,0.41,1.07,0.41,1.48,0l0.01-0.01
+c0.41-0.41,0.41-1.07,0-1.48L15.5,14z M9.5,14C7.01,14,5,11.99,5,9.5S7.01,5,9.5,5S14,7.01,14,9.5S11.99,14,9.5,14z" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings.xml b/res/drawable/ic_settings.xml
index 439c1a7..3d8563d 100644
--- a/res/drawable/ic_settings.xml
+++ b/res/drawable/ic_settings.xml
@@ -21,16 +21,14 @@
     android:tint="?android:attr/colorAccent">
     <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"/>
+        android:pathData="M21.4 14.2l-1.94-1.45c.03-.25 .04 -.5 .04 -.76s-.01-.51-.04-.76L21.4 9.8c.42-.31
+.52 -.94 .24 -1.41l-1.6-2.76c-.28-.48-.88-.7-1.36-.5l-2.14 .91
+c-.48-.37-1.01-.68-1.57-.92l-.27-2.2c-.06-.52-.56-.92-1.11-.92h-3.18c-.55 0-1.05
+.4 -1.11 .92 l-.26 2.19c-.57 .24 -1.1 .55 -1.58 .92 l-2.14-.91c-.48-.2-1.08 .02
+-1.36 .5 l-1.6 2.76c-.28 .48 -.18 1.1 .24 1.42l1.94 1.45c-.03 .24 -.04 .49 -.04
+.75 s.01 .51 .04 .76 L2.6 14.2c-.42 .31 -.52 .94 -.24 1.41l1.6 2.76c.28 .48 .88
+.7 1.36 .5 l2.14-.91c.48 .37 1.01 .68 1.57 .92 l.27 2.19c.06 .53 .56 .93 1.11
+.93 h3.18c.55 0 1.04-.4 1.11-.92l.27-2.19c.56-.24 1.09-.55 1.57-.92l2.14 .91
+c.48 .2 1.08-.02 1.36-.5l1.6-2.76c.28-.48 .18 -1.1-.24-1.42zM12 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>
diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml
index cdf8275..887fca6 100644
--- a/res/drawable/ic_settings_about.xml
+++ b/res/drawable/ic_settings_about.xml
@@ -20,6 +20,12 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M11.0,17.0l2.0,0.0l0.0,-6.0l-2.0,0.0l0.0,6.0zm1.0,-15.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0zM11.0,9.0l2.0,0.0L13.0,7.0l-2.0,0.0l0.0,2.0z"/>
+        android:fillColor="#FF000000"
+        android:pathData="M12,17L12,17c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1l0,0c-0.55,0 -1,0.45 -1,1v4C11,16.55 11.45,17 12,17z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M12,2c-5.52,0 -10,4.48 -10,10s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M12,9.1L12,9.1c0.61,0 1.1,-0.49 1.1,-1.1l0,0c0,-0.61 -0.49,-1.1 -1.1,-1.1l0,0c-0.61,0 -1.1,0.49 -1.1,1.1l0,0C10.9,8.61 11.39,9.1 12,9.1z"/>
 </vector>
diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml
index 1570312..4cf5182 100644
--- a/res/drawable/ic_settings_accessibility.xml
+++ b/res/drawable/ic_settings_accessibility.xml
@@ -21,5 +21,5 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M20.5 6c-2.61.7-5.67 1-8.5 1s-5.89-.3-8.5-1L3 8c1.86.5 4 .83 6 1v13h2v-6h2v6h2V9c2-.17 4.14-.5 6-1l-.5-2zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"/>
+        android:pathData="M20.75,6.99c-0.14,-0.55 -0.69,-0.87 -1.24,-0.75C17.13,6.77 14.48,7 12,7S6.87,6.77 4.49,6.24c-0.55,-0.12 -1.1,0.2 -1.24,0.75l0,0C3.11,7.55 3.45,8.12 4,8.25C5.61,8.61 7.35,8.86 9,9v12c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1v-5h2v5c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1V9c1.65,-0.14 3.39,-0.39 5,-0.75C20.55,8.12 20.89,7.55 20.75,6.99L20.75,6.99zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"/>
 </vector>
diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml
index 31ea994..0e0b447 100644
--- a/res/drawable/ic_settings_data_usage.xml
+++ b/res/drawable/ic_settings_data_usage.xml
@@ -16,23 +16,16 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
         android:height="24.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M26.0,4.1
-        l0.0,6.06
-        c6.7,0.97 12.0,6.79 12.0,13.84
-        0.0,1.79 -0.35,3.5 -0.96,5.07
-        l5.2,3.07
-        C43.35,29.65 44.0,26.91 44.0,24.0
-        c0.0,-10.37 -7.89,-18.89 -18.0,-19.9z
-        M24.0,38.0
-        c-7.73,0.0 -14.0,-6.27 -14.0,-14.0 0.0,-7.05 5.22,-12.87 12.0,-13.84
-        l0.0,-6
-        C11.88,5.1 4.0,13.63 4.0,24.0
-        c0.0,11.05 8.94,20.0 19.99,20.0 6.62,0.0 12.47,-3.23 16.11,-8.18
-        l-5.19,-3.06
-        C32.35,35.95 28.42,38.0 24.0,38.0z"/>
+        android:pathData="M18.32 16.75l1.32 .76 c.26 .15 .34 .51 .15 .74 -2.09 2.6-5.44 4.14-9.14
+3.65-4.4-.58-7.96-4.12-8.56-8.52C1.34 7.8 5.21 2.95 10.43 2.12c.3-.05 .57 .2 .57
+.5v1.53c0 .24-.18 .44 -.41 .49 -3.6 .69 -6.29 3.95-6.07 7.79 .21 3.82 3.43 6.95
+7.25 7.07 2.37 .08 4.51-.96 5.93-2.63a.48 .48 0 0 1 .62-.12zM19.5 12c0 .83-.14
+1.63-.39 2.38-.08 .23 .01 .47 .21 .59 l1.33 .77 c.26 .15 .61 .04 .72-.24 .4
+-1.09 .63 -2.27 .63 -3.5 0-4.99-3.65-9.12-8.43-9.88-.3-.04-.57 .2 -.57 .5
+v1.53c0 .24 .18 .44 .41 .48 3.46 .68 6.09 3.72 6.09 7.37z"/>
 </vector>
diff --git a/res/drawable/ic_settings_date_time.xml b/res/drawable/ic_settings_date_time.xml
index b965878..1d2f3d3 100644
--- a/res/drawable/ic_settings_date_time.xml
+++ b/res/drawable/ic_settings_date_time.xml
@@ -1,28 +1,25 @@
 <!--
-    Copyright (C) 2016 The Android Open Source Project
+     Copyright (C) 2015 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
+     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
+          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.
+     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="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="M11.99,2.0C6.47,2.0 2.0,6.48 2.0,12.0s4.47,10.0 9.99,10.0C17.52,22.0 22.0,17.52 22.0,12.0S17.52,2.0 11.99,2.0zM12.0,20.0c-4.42,0.0 -8.0,-3.58 -8.0,-8.0s3.58,-8.0 8.0,-8.0 8.0,3.58 8.0,8.0 -3.58,8.0 -8.0,8.0z"/>
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12.5,7.0L11.0,7.0l0.0,6.0l5.25,3.1 0.75,-1.23 -4.5,-2.67z"/>
+        android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM11.75,6.1c-0.5,0 -0.75,0.32 -0.75,0.72L11,13l4.64,2.78c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.87,-2.3L12.5,6.82c0,-0.4 -0.25,-0.72 -0.75,-0.72z"/>
 </vector>
diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml
index ff763f0..de71508 100644
--- a/res/drawable/ic_settings_display.xml
+++ b/res/drawable/ic_settings_display.xml
@@ -21,5 +21,8 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M20.0,15.31L23.31,12.0 20.0,8.69L20.0,4.0l-4.69,0.0L12.0,0.69 8.69,4.0L4.0,4.0l0.0,4.69L0.69,12.0 4.0,15.31L4.0,20.0l4.69,0.0L12.0,23.31 15.31,20.0L20.0,20.0l0.0,-4.69zM12.0,18.0L12.0,6.0c3.31,0.0 6.0,2.69 6.0,6.0s-2.69,6.0 -6.0,6.0z"/>
+        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"/>
 </vector>
diff --git a/res/drawable/ic_settings_print.xml b/res/drawable/ic_settings_print.xml
index 7470014..0eab402 100644
--- a/res/drawable/ic_settings_print.xml
+++ b/res/drawable/ic_settings_print.xml
@@ -21,5 +21,8 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M19.0,8.0L5.0,8.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,6.0l4.0,0.0l0.0,4.0l12.0,0.0l0.0,-4.0l4.0,0.0l0.0,-6.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zm-3.0,11.0L8.0,19.0l0.0,-5.0l8.0,0.0l0.0,5.0zm3.0,-7.0c-0.55,0.0 -1.0,-0.45 -1.0,-1.0s0.45,-1.0 1.0,-1.0 1.0,0.45 1.0,1.0 -0.45,1.0 -1.0,1.0zm-1.0,-9.0L6.0,3.0l0.0,4.0l12.0,0.0L18.0,3.0z"/>
+        android:pathData="M19,8H5c-1.66,0-3,1.34-3,3v5c0,0.55,0.45,1,1,1h3v3c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1v-3h3c0.55,0,1-0.45,1-1v-5
+C22,9.34,20.66,8,19,8z M16,19H8v-5h8V19z
+M19,12c-0.55,0-1-0.45-1-1s0.45-1,1-1s1,0.45,1,1S19.55,12,19,12z M17,3H7
+C6.45,3,6,3.45,6,4v3h12V4C18,3.45,17.55,3,17,3z"/>
 </vector>
diff --git a/res/drawable/ic_settings_sound.xml b/res/drawable/ic_settings_sound.xml
index 598a02a..7054d78 100644
--- a/res/drawable/ic_settings_sound.xml
+++ b/res/drawable/ic_settings_sound.xml
@@ -21,5 +21,10 @@
         android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M3.0,9.0l0.0,6.0l4.0,0.0l5.0,5.0L12.0,4.0L7.0,9.0L3.0,9.0zm13.5,3.0c0.0,-1.77 -1.02,-3.29 -2.5,-4.03l0.0,8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14.0,3.23l0.0,2.06c2.8,0.86 5.0,3.54 5.0,6.71s-2.11,5.85 -5.0,6.71l0.0,2.06c4.01,-0.91 7.0,-4.49 7.0,-8.77s-2.99,-7.86 -7.0,-8.77z"/>
+        android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18
+1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0
+0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61
+.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85
+v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22
+.86 z"/>
 </vector>
diff --git a/res/drawable/ic_vpn_key.xml b/res/drawable/ic_vpn_key.xml
index aad1096..71b29d6 100644
--- a/res/drawable/ic_vpn_key.xml
+++ b/res/drawable/ic_vpn_key.xml
@@ -20,6 +20,7 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"
+        android:pathData="M12.65,10C11.7,7.31,8.9,5.5,5.78,6.12C3.49,6.58,1.62,8.41,1.14,10.7C0.32,14.57,3.26,18,7,18c2.61,0,4.83-1.67,5.65-4H16
+v2c0,1.1,0.9,2,2,2h0c1.1,0,2-0.9,2-2v-2h1c1.1,0,2-0.9,2-2v0c0-1.1-0.9-2-2-2H12.65z M7,14c-1.1,0-2-0.9-2-2s0.9-2,2-2s2,0.9,2,2 S8.1,14,7,14z"
         android:fillColor="#FFFFFFFF"/>
 </vector>
diff --git a/res/drawable/ic_zen.xml b/res/drawable/ic_zen.xml
index 17ecf21..8c50d5d 100644
--- a/res/drawable/ic_zen.xml
+++ b/res/drawable/ic_zen.xml
@@ -14,13 +14,13 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0"
     android:height="24dp"
-    android:viewportHeight="48.0"
-    android:viewportWidth="48.0"
     android:width="24dp" >
 
     <path
         android:fillColor="#FFFFFFFF"
-        android:pathData="M24.0,4.0C12.95,4.0 4.0,12.95 4.0,24.0s8.95,20.0 20.0,20.0 20.0,-8.95 20.0,-20.0S35.05,4.0 24.0,4.0zm10.0,22.0L14.0,26.0l0.0,-4.0l20.0,0.0l0.0,4.0z" />
+        android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 11H8c-.55 0-1-.45-1-1s.45-1 1-1h8c.55 0 1 .45 1 1s-.45 1-1 1z" />
 
 </vector>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0edb017..6241850 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5218,9 +5218,10 @@
     <string name="credentials_not_erased">Credential storage couldn\u2019t be erased.</string>
     <!-- Toast message [CHAR LIMIT=30] -->
     <string name="credentials_enabled">Credential storage is enabled.</string>
-    <!-- Description of dialog to explain that a lock screen password is required to use credential storage [CHAR LIMIT=NONE] -->
-    <string name="credentials_configure_lock_screen_hint">You need to set a lock screen PIN or password before you can use credential storage.</string>
-
+    <!-- This string is in a dialog, and the dialog shows up on a device that's managed by a user's company. It lets the user know that they need to have a secure lock screen (PIN, password, or pattern) before they can use credential storage [CHAR LIMIT=NONE] -->
+    <string name="credentials_configure_lock_screen_hint">Before you can use credential storage, your device need to have a secure lock screen</string>
+    <!-- This string is for the content of the button that leads user to lock screen settings  [CHAR LIMIT=20] -->
+    <string name="credentials_configure_lock_screen_button">SET LOCK</string>
     <!-- Title of Usage Access preference item [CHAR LIMIT=30] -->
     <string name="usage_access_title">Apps with usage access</string>
 
@@ -6841,8 +6842,8 @@
     <!-- [CHAR LIMIT=100] Notification importance screen title -->
     <string name="notification_importance_title">Importance</string>
 
-    <!-- [CHAR LIMIT=100] Notification Importance: unspecified importance level description -->
-    <string name="notification_importance_unspecified">Let the app decide</string>
+    <!-- [CHAR LIMIT=100 BACKUP_MESSAGE_ID=1820188704793497324] Notification Importance: unspecified importance level description -->
+    <string name="notification_importance_unspecified">Allow sound</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance: blocked importance level description -->
     <string name="notification_importance_blocked">Never show notifications</string>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 92205e4..11a579a 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -215,6 +215,11 @@
             android:entryValues="@array/usb_configuration_values" />
 
         <SwitchPreference
+            android:key="bluetooth_show_devices_without_names"
+            android:title="@string/bluetooth_show_devices_without_names"
+            android:summary="@string/bluetooth_show_devices_without_names_summary"/>
+
+        <SwitchPreference
             android:key="bluetooth_disable_absolute_volume"
             android:title="@string/bluetooth_disable_absolute_volume"
             android:summary="@string/bluetooth_disable_absolute_volume_summary"/>
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 2a57577..417ac0f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -107,6 +107,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.UserIcons;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.password.FingerprintManagerWrapper;
 import com.android.settings.password.IFingerprintManager;
 
@@ -1280,6 +1281,28 @@
     }
 
     /**
+     * Return {@code true} if the supplied package is device owner or profile owner of at
+     * least one user.
+     * @param userManager used to get profile owner app for each user
+     * @param devicePolicyManager used to check whether it is device owner app
+     * @param packageName package to check about
+     */
+    public static boolean isProfileOrDeviceOwner(UserManager userManager,
+            DevicePolicyManagerWrapper devicePolicyManager, String packageName) {
+        List<UserInfo> userInfos = userManager.getUsers();
+        if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) {
+            return true;
+        }
+        for (int i = 0, size = userInfos.size(); i < size; i++) {
+            ComponentName cn = devicePolicyManager.getProfileOwnerAsUser(userInfos.get(i).id);
+            if (cn != null && cn.getPackageName().equals(packageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Return the resource id to represent the install status for an app
      */
     @StringRes
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 4af9bc6..a5daee2 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -43,6 +43,8 @@
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.applications.ApplicationsState;
@@ -73,7 +75,7 @@
     protected String mPackageName;
 
     protected IUsbManager mUsbManager;
-    protected DevicePolicyManager mDpm;
+    protected DevicePolicyManagerWrapper mDpm;
     protected UserManager mUserManager;
     protected PackageManager mPm;
 
@@ -92,7 +94,8 @@
                 .getApplicationFeatureProvider(activity);
         mState = ApplicationsState.getInstance(activity.getApplication());
         mSession = mState.newSession(this);
-        mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mDpm = new DevicePolicyManagerWrapperImpl(
+                (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
         mPm = activity.getPackageManager();
         IBinder b = ServiceManager.getService(Context.USB_SERVICE);
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 5e834d8..209cd22 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -277,7 +277,7 @@
         // We don't allow uninstalling DO/PO on *any* users, because if it's a system app,
         // "uninstall" is actually "downgrade to the system version + disable", and "downgrade"
         // will clear data on all users.
-        if (isProfileOrDeviceOwner(mPackageInfo.packageName)) {
+        if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) {
             enabled = false;
         }
 
@@ -352,23 +352,6 @@
         return enabled;
     }
 
-    /** Returns if the supplied package is device owner or profile owner of at least one user */
-    private boolean isProfileOrDeviceOwner(String packageName) {
-        List<UserInfo> userInfos = mUserManager.getUsers();
-        DevicePolicyManager dpm = (DevicePolicyManager)
-                getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
-        if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) {
-            return true;
-        }
-        for (UserInfo userInfo : userInfos) {
-            ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id);
-            if (cn != null && cn.getPackageName().equals(packageName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle icicle) {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 7b81018..084b50e 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -54,16 +54,17 @@
     private final UserManager mUserManager;
 
     private AlertDialog mDisconnectDialog;
-
     private String contentDescription = null;
-
+    private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
     /* Talk-back descriptions for various BT icons */
     Resources mResources;
 
-    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
+    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
+            DeviceListPreferenceFragment deviceListPreferenceFragment) {
         super(context, null);
         mResources = getContext().getResources();
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDeviceListPreferenceFragment = deviceListPreferenceFragment;
 
         if (sDimAlpha == Integer.MIN_VALUE) {
             TypedValue outValue = new TypedValue();
@@ -131,6 +132,11 @@
         // Used to gray out the item
         setEnabled(!mCachedDevice.isBusy());
 
+        // Device is only visible in the UI if it has a valid name besides MAC address or when user
+        // allows showing devices without user-friendly name in developer settings
+        setVisible(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()
+                || mCachedDevice.hasHumanReadableName());
+
         // This could affect ordering, so notify that
         notifyHierarchyChanged();
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
index 97382c3..22cb3a6 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
@@ -108,12 +108,6 @@
     @VisibleForTesting
     void dismiss() {
         if (!isFinishing()) {
-            BluetoothPairingDialogFragment bluetoothFragment =
-                (BluetoothPairingDialogFragment) getFragmentManager()
-                    .findFragmentByTag(FRAGMENT_TAG);
-            if (bluetoothFragment != null) {
-                bluetoothFragment.dismiss();
-            }
             finish();
         }
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 2ee58a1..9789310 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -140,6 +140,8 @@
             mBluetoothEnabler.resume(getActivity());
         }
         super.onStart();
+        // Always show paired devices regardless whether user-friendly name exists
+        mShowDevicesWithoutNames = true;
         if (isUiRestricted()) {
             getPreferenceScreen().removeAll();
             if (!isUiRestrictedByOnlyAdmin()) {
diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
index ca06e3c..0485e69 100644
--- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
+++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
@@ -19,6 +19,7 @@
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.os.Bundle;
+import android.os.SystemProperties;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
@@ -52,6 +53,10 @@
 
     private static final String KEY_BT_SCAN = "bt_scan";
 
+    // Copied from DevelopmentSettings.java
+    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+            "persist.bluetooth.showdeviceswithoutnames";
+
     private BluetoothDeviceFilter.Filter mFilter;
 
     @VisibleForTesting
@@ -68,6 +73,8 @@
     final WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap =
             new WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference>();
 
+    boolean mShowDevicesWithoutNames;
+
     DeviceListPreferenceFragment(String restrictedKey) {
         super(restrictedKey);
         mFilter = BluetoothDeviceFilter.ALL_FILTER;
@@ -103,6 +110,8 @@
     @Override
     public void onStart() {
         super.onStart();
+        mShowDevicesWithoutNames = SystemProperties.getBoolean(
+                BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
         if (mLocalManager == null || isUiRestricted()) return;
 
         mLocalManager.setForegroundActivity(getActivity());
@@ -181,7 +190,7 @@
         BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);
 
         if (preference == null) {
-            preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice);
+            preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, this);
             preference.setKey(key);
             mDeviceListGroup.addPreference(preference);
         } else {
@@ -271,4 +280,8 @@
      * Return the key of the {@link PreferenceGroup} that contains the bluetooth devices
      */
     public abstract String getDeviceListKey();
+
+    public boolean shouldShowDevicesWithoutNames() {
+        return mShowDevicesWithoutNames;
+    }
 }
diff --git a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
index e8e2c2d..a4f087a 100644
--- a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
+++ b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
@@ -102,6 +102,6 @@
     }
 
     private boolean isHalHdrplusEnabled() {
-        return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, false);
+        return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, true);
     }
 }
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index 0af3dd4..4df72e6 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -166,6 +166,10 @@
     private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
     private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
 
+    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY =
+            "bluetooth_show_devices_without_names";
+    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+            "persist.bluetooth.showdeviceswithoutnames";
     private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY =
             "bluetooth_disable_absolute_volume";
     private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY =
@@ -250,6 +254,7 @@
     private SwitchPreference mWifiAggressiveHandover;
     private SwitchPreference mMobileDataAlwaysOn;
     private SwitchPreference mTetheringHardwareOffload;
+    private SwitchPreference mBluetoothShowDevicesWithoutNames;
     private SwitchPreference mBluetoothDisableAbsVolume;
     private SwitchPreference mBluetoothEnableInbandRinging;
 
@@ -459,6 +464,8 @@
         mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
         mTetheringHardwareOffload = findAndInitSwitchPref(TETHERING_HARDWARE_OFFLOAD);
         mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
+        mBluetoothShowDevicesWithoutNames =
+                findAndInitSwitchPref(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY);
         mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
         mBluetoothEnableInbandRinging = findAndInitSwitchPref(BLUETOOTH_ENABLE_INBAND_RINGING_KEY);
         if (!BluetoothHeadset.isInbandRingingSupported(getContext())) {
@@ -813,6 +820,7 @@
         if (mColorTemperaturePreference != null) {
             updateColorTemperature();
         }
+        updateBluetoothShowDevicesWithoutUserFriendlyNameOptions();
         updateBluetoothDisableAbsVolumeOptions();
         updateBluetoothEnableInbandRingingOptions();
         updateBluetoothA2dpConfigurationValues();
@@ -867,14 +875,17 @@
     }
 
     private void updatePasswordSummary() {
-        try {
-            if (mBackupManager.hasBackupPassword()) {
-                mPassword.setSummary(R.string.local_backup_password_summary_change);
-            } else {
-                mPassword.setSummary(R.string.local_backup_password_summary_none);
+        mPassword.setEnabled(mBackupManager != null);
+        if (mBackupManager != null) {
+            try {
+                if (mBackupManager.hasBackupPassword()) {
+                    mPassword.setSummary(R.string.local_backup_password_summary_change);
+                } else {
+                    mPassword.setSummary(R.string.local_backup_password_summary_none);
+                }
+            } catch (RemoteException e) {
+                // Not much we can do here
             }
-        } catch (RemoteException e) {
-            // Not much we can do here
         }
     }
 
@@ -1443,6 +1454,17 @@
         mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0);
     }
 
+    private void updateBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+        updateSwitchPreference(mBluetoothShowDevicesWithoutNames,
+                SystemProperties.getBoolean(
+                        BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false));
+    }
+
+    private void writeBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+        SystemProperties.set(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY,
+                mBluetoothShowDevicesWithoutNames.isChecked() ? "true" : "false");
+    }
+
     private void updateBluetoothDisableAbsVolumeOptions() {
         updateSwitchPreference(mBluetoothDisableAbsVolume,
                 SystemProperties.getBoolean(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY, false));
@@ -2283,6 +2305,8 @@
             writeUSBAudioOptions();
         } else if (preference == mForceResizable) {
             writeForceResizableOptions();
+        } else if (preference == mBluetoothShowDevicesWithoutNames) {
+            writeBluetoothShowDevicesWithoutUserFriendlyNameOptions();
         } else if (preference == mBluetoothDisableAbsVolume) {
             writeBluetoothDisableAbsVolumeOptions();
         } else if (preference == mBluetoothEnableInbandRinging) {
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index be72539..33d7d36 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -109,8 +109,9 @@
     public void onResume() {
         super.onResume();
         getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
+        getLoaderManager()
+                .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
         getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
-        getLoaderManager().initLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index 684ac52..cf1e360 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.UserInfo;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.storage.VolumeInfo;
@@ -126,7 +127,14 @@
     public void handleUserIcons(SparseArray<Drawable> fetchedIcons) {
         Drawable userIcon = fetchedIcons.get(mUser.id);
         if (userIcon != null) {
-            mStoragePreference.setIcon(userIcon);
+            mStoragePreference.setIcon(applyTint(mContext, userIcon));
         }
     }
+
+    private static Drawable applyTint(Context context, Drawable icon) {
+        icon = icon.mutate();
+        icon.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
+        return icon;
+    }
+
 }
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index 7ebf294..6ae2fa1 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -903,7 +903,7 @@
     }
 
     private static class LearnMoreSpan extends URLSpan {
-
+        private static final String TAG = "LearnMoreSpan";
         private static final Typeface TYPEFACE_MEDIUM =
                 Typeface.create("sans-serif-medium", Typeface.NORMAL);
 
@@ -928,6 +928,10 @@
                 RestrictedLockUtils.sendShowAdminSupportDetailsIntent(ctx, mEnforcedAdmin);
             } else {
                 Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName());
+                if (intent == null) {
+                    Log.w(LearnMoreSpan.TAG, "Null help intent.");
+                    return;
+                }
                 try {
                     widget.startActivityForResult(intent, 0);
                 } catch (ActivityNotFoundException e) {
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 3b83fa5..0142e62 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -16,7 +16,9 @@
 
 package com.android.settings.fuelgauge;
 
+import android.annotation.UserIdInt;
 import android.app.Activity;
+import android.app.ActivityManager;
 import android.app.LoaderManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -152,7 +154,14 @@
 
         caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
                 R.string.battery_details_title, null,
-                new UserHandle(UserHandle.getUserId(sipper.getUid())));
+                new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(sipper)));
+    }
+
+    private static @UserIdInt int getUserIdToLaunchAdvancePowerUsageDetail(BatterySipper bs) {
+        if (bs.drainType == BatterySipper.DrainType.USER) {
+            return ActivityManager.getCurrentUser();
+        }
+        return UserHandle.getUserId(bs.getUid());
     }
 
     public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index 8b56b59..0d5bed8 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -383,7 +383,7 @@
         // We don't allow uninstalling DO/PO on *any* users, because if it's a system app,
         // "uninstall" is actually "downgrade to the system version + disable", and "downgrade"
         // will clear data on all users.
-        if (isProfileOrDeviceOwner(mPackageInfo.packageName)) {
+        if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) {
             enabled = false;
         }
 
@@ -582,21 +582,6 @@
                 || (mUserManager.isSplitSystemUser() && userCount == 2);
     }
 
-    /** Returns if the supplied package is device owner or profile owner of at least one user */
-    private boolean isProfileOrDeviceOwner(String packageName) {
-        List<UserInfo> userInfos = mUserManager.getUsers();
-        if (mDpm.isDeviceOwnerAppOnAnyUser(packageName)) {
-            return true;
-        }
-        for (int i = 0, size = userInfos.size(); i < size; i++) {
-            ComponentName cn = mDpm.getProfileOwnerAsUser(userInfos.get(i).id);
-            if (cn != null && cn.getPackageName().equals(packageName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index 89089e5..4d1cf77 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -15,17 +15,22 @@
 package com.android.settings.fuelgauge;
 
 import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;
+import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.util.Log;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 /**
@@ -39,14 +44,20 @@
 
     private final PackageManager mPackageManager;
     private final AppOpsManager mAppOpsManager;
+    private final UserManager mUserManager;
     private final String[] mPackages;
     private final int mUid;
+    @VisibleForTesting
+    DevicePolicyManagerWrapper mDpm;
 
     private String mTargetPackage;
 
     public BackgroundActivityPreferenceController(Context context, int uid) {
         super(context);
         mPackageManager = context.getPackageManager();
+        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDpm = new DevicePolicyManagerWrapperImpl(
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mUid = uid;
         mPackages = mPackageManager.getPackagesForUid(mUid);
@@ -56,12 +67,15 @@
     public void updateState(Preference preference) {
         final int mode = mAppOpsManager
                 .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
-        if (mode == AppOpsManager.MODE_ERRORED) {
-            preference.setEnabled(false);
-        } else {
+        // Set checked or not before we may set it disabled
+        if (mode != AppOpsManager.MODE_ERRORED) {
             final boolean checked = mode != AppOpsManager.MODE_IGNORED;
             ((SwitchPreference) preference).setChecked(checked);
         }
+        if (mode == AppOpsManager.MODE_ERRORED
+                || Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) {
+            preference.setEnabled(false);
+        }
 
         updateSummary(preference);
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 3d44c40..1596aca 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -428,7 +428,8 @@
     }
 
     private static boolean isSystemUid(int uid) {
-        return uid >= Process.SYSTEM_UID && uid < Process.FIRST_APPLICATION_UID;
+        final int appUid = UserHandle.getAppId(uid);
+        return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID;
     }
 
     /**
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index dc321e2..34e8cc3 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -211,11 +211,6 @@
                     request.contentDescription);
             pref.setIcon(request.icon);
             pref.setTitle(request.label);
-            if (request.isHighBattery) {
-                pref.setSummary(R.string.location_high_battery_use);
-            } else {
-                pref.setSummary(R.string.location_low_battery_use);
-            }
             pref.setOnPreferenceClickListener(
                     new PackageEntryClickedListener(request.packageName, request.userHandle));
             recentLocationPrefs.add(pref);
diff --git a/src/com/android/settings/search/SavedQueryController.java b/src/com/android/settings/search/SavedQueryController.java
index 545b415..eaba3d6 100644
--- a/src/com/android/settings/search/SavedQueryController.java
+++ b/src/com/android/settings/search/SavedQueryController.java
@@ -34,10 +34,6 @@
         MenuItem.OnMenuItemClickListener {
 
     // TODO: make a generic background task manager to handle one-off tasks like this one.
-
-    private static final int LOADER_ID_SAVE_QUERY_TASK = 0;
-    private static final int LOADER_ID_REMOVE_QUERY_TASK = 1;
-    private static final int LOADER_ID_SAVED_QUERIES = 2;
     private static final String ARG_QUERY = "remove_query";
     private static final String TAG = "SearchSavedQueryCtrl";
 
@@ -60,11 +56,11 @@
     @Override
     public Loader onCreateLoader(int id, Bundle args) {
         switch (id) {
-            case LOADER_ID_SAVE_QUERY_TASK:
+            case SearchFragment.SearchLoaderId.SAVE_QUERY_TASK:
                 return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
-            case LOADER_ID_REMOVE_QUERY_TASK:
+            case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
                 return new SavedQueryRemover(mContext);
-            case LOADER_ID_SAVED_QUERIES:
+            case SearchFragment.SearchLoaderId.SAVED_QUERIES:
                 return mSearchFeatureProvider.getSavedQueryLoader(mContext);
         }
         return null;
@@ -73,10 +69,11 @@
     @Override
     public void onLoadFinished(Loader loader, Object data) {
         switch (loader.getId()) {
-            case LOADER_ID_REMOVE_QUERY_TASK:
-                mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
+            case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
+                mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES,
+                        null /* args */, this /* callback */);
                 break;
-            case LOADER_ID_SAVED_QUERIES:
+            case SearchFragment.SearchLoaderId.SAVED_QUERIES:
                 if (SettingsSearchIndexablesProvider.DEBUG) {
                     Log.d(TAG, "Saved queries loaded");
                 }
@@ -107,7 +104,8 @@
     public void saveQuery(String query) {
         final Bundle args = new Bundle();
         args.putString(ARG_QUERY, query);
-        mLoaderManager.restartLoader(LOADER_ID_SAVE_QUERY_TASK, args, this);
+        mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVE_QUERY_TASK, args,
+                this /* callback */);
     }
 
     /**
@@ -115,13 +113,15 @@
      */
     public void removeQueries() {
         final Bundle args = new Bundle();
-        mLoaderManager.restartLoader(LOADER_ID_REMOVE_QUERY_TASK, args, this);
+        mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK, args,
+                this /* callback */);
     }
 
     public void loadSavedQueries() {
         if (SettingsSearchIndexablesProvider.DEBUG) {
             Log.d(TAG, "loading saved queries");
         }
-        mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
+        mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES, null /* args */,
+                this /* callback */);
     }
 }
diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java
index ccc4d61..092404c 100644
--- a/src/com/android/settings/search/SearchFragment.java
+++ b/src/com/android/settings/search/SearchFragment.java
@@ -77,15 +77,19 @@
     private static final String STATE_NEVER_ENTERED_QUERY = "state_never_entered_query";
     private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
 
-    // Loader IDs
-    @VisibleForTesting
-    static final int LOADER_ID_DATABASE = 1;
-    @VisibleForTesting
-    static final int LOADER_ID_INSTALLED_APPS = 2;
-    @VisibleForTesting
-    static final int LOADER_ID_ACCESSIBILITY_SERVICES = 3;
-    @VisibleForTesting
-    static final int LOADER_ID_INPUT_DEVICES = 4;
+    static final class SearchLoaderId {
+        // Search Query IDs
+        public static final int DATABASE = 1;
+        public static final int INSTALLED_APPS = 2;
+        public static final int ACCESSIBILITY_SERVICES = 3;
+        public static final int INPUT_DEVICES = 4;
+
+        // Saved Query IDs
+        public static final int SAVE_QUERY_TASK = 5;
+        public static final int REMOVE_QUERY_TASK = 6;
+        public static final int SAVED_QUERIES = 7;
+    }
+
 
     private static final int NUM_QUERY_LOADERS = 4;
 
@@ -283,10 +287,10 @@
 
         if (isEmptyQuery) {
             final LoaderManager loaderManager = getLoaderManager();
-            loaderManager.destroyLoader(LOADER_ID_DATABASE);
-            loaderManager.destroyLoader(LOADER_ID_INSTALLED_APPS);
-            loaderManager.destroyLoader(LOADER_ID_ACCESSIBILITY_SERVICES);
-            loaderManager.destroyLoader(LOADER_ID_INPUT_DEVICES);
+            loaderManager.destroyLoader(SearchLoaderId.DATABASE);
+            loaderManager.destroyLoader(SearchLoaderId.INSTALLED_APPS);
+            loaderManager.destroyLoader(SearchLoaderId.ACCESSIBILITY_SERVICES);
+            loaderManager.destroyLoader(SearchLoaderId.INPUT_DEVICES);
             mShowingSavedQuery = true;
             mSavedQueryController.loadSavedQueries();
             mSearchFeatureProvider.hideFeedbackButton();
@@ -311,13 +315,13 @@
         final Activity activity = getActivity();
 
         switch (id) {
-            case LOADER_ID_DATABASE:
+            case SearchLoaderId.DATABASE:
                 return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
-            case LOADER_ID_INSTALLED_APPS:
+            case SearchLoaderId.INSTALLED_APPS:
                 return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
-            case LOADER_ID_ACCESSIBILITY_SERVICES:
+            case SearchLoaderId.ACCESSIBILITY_SERVICES:
                 return mSearchFeatureProvider.getAccessibilityServiceResultLoader(activity, mQuery);
-            case LOADER_ID_INPUT_DEVICES:
+            case SearchLoaderId.INPUT_DEVICES:
                 return mSearchFeatureProvider.getInputDeviceResultLoader(activity, mQuery);
             default:
                 return null;
@@ -351,13 +355,13 @@
             mSavedQueryController.loadSavedQueries();
         } else {
             final LoaderManager loaderManager = getLoaderManager();
-            loaderManager.initLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
+            loaderManager.initLoader(SearchLoaderId.DATABASE, null /* args */, this /* callback */);
             loaderManager.initLoader(
-                    LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
+                    SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
             loaderManager.initLoader(
-                    LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
+                    SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
             loaderManager.initLoader(
-                    LOADER_ID_INPUT_DEVICES, null /* args */, this /* callback */);
+                    SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
         }
 
         requery();
@@ -395,12 +399,14 @@
         mShowingSavedQuery = false;
         final LoaderManager loaderManager = getLoaderManager();
         mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
-        loaderManager.restartLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
-        loaderManager.restartLoader(LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
-        loaderManager.restartLoader(LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */,
-                this /* callback */);
-        loaderManager.restartLoader(LOADER_ID_INPUT_DEVICES, null /* args */,
-                this /* callback */);
+        loaderManager.restartLoader(
+                SearchLoaderId.DATABASE, null /* args */, this /* callback */);
+        loaderManager.restartLoader(
+                SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
+        loaderManager.restartLoader(
+                SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
+        loaderManager.restartLoader(
+                SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
     }
 
     public String getQuery() {
diff --git a/src/com/android/settings/security/ConfigureKeyGuardDialog.java b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
index 3c89340..dfe3bbe 100644
--- a/src/com/android/settings/security/ConfigureKeyGuardDialog.java
+++ b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
@@ -51,7 +51,7 @@
         return new AlertDialog.Builder(getActivity())
                 .setTitle(android.R.string.dialog_alert_title)
                 .setMessage(R.string.credentials_configure_lock_screen_hint)
-                .setPositiveButton(android.R.string.ok, this)
+                .setPositiveButton(R.string.credentials_configure_lock_screen_button, this)
                 .setNegativeButton(android.R.string.cancel, this)
                 .create();
     }
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 72fc981..b16e645 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -448,7 +448,7 @@
         String dnsServers = mLinkProperties.getDnsServers().stream()
                 .filter(Inet4Address.class::isInstance)
                 .map(InetAddress::getHostAddress)
-                .collect(Collectors.joining(","));
+                .collect(Collectors.joining("\n"));
 
         // Update UI.
         updatePreference(mIpAddressPref, ipv4Address);
diff --git a/tests/anomaly-tester/Android.mk b/tests/anomaly-tester/Android.mk
index beb5d69..ade37db 100644
--- a/tests/anomaly-tester/Android.mk
+++ b/tests/anomaly-tester/Android.mk
@@ -2,6 +2,15 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    android-support-test \
+    mockito-target \
+    ub-uiautomator \
+    truth-prebuilt \
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
@@ -9,7 +18,7 @@
 
 LOCAL_PACKAGE_NAME := AnomalyTester
 
-LOCAL_CERTIFICATE := platform
+LOCAL_INSTRUMENTATION_FOR := Settings
 
 LOCAL_USE_AAPT2 := true
 
diff --git a/tests/anomaly-tester/AndroidManifest.xml b/tests/anomaly-tester/AndroidManifest.xml
index 68e2dd7..7893b86 100644
--- a/tests/anomaly-tester/AndroidManifest.xml
+++ b/tests/anomaly-tester/AndroidManifest.xml
@@ -22,11 +22,13 @@
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
     <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
+
     <application
         android:allowBackup="false"
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@android:style/Theme.Material.Light.DarkActionBar">
+        <uses-library android:name="android.test.runner" />
         <activity
             android:name=".AnomalyActivity"
             android:exported="true">
@@ -41,4 +43,10 @@
             android:exported="false"/>
     </application>
 
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.settings"
+        android:label="Settings Test Cases">
+    </instrumentation>
+
 </manifest>
\ No newline at end of file
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
new file mode 100644
index 0000000..3630ce4
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class BluetoothAnomalyTest {
+    private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+    private static final String RES_BT_EDITTEXT =
+            "com.android.settings.anomaly.tester:id/bluetooth_run_time";
+    private static final String RES_BT_BUTTON =
+            "com.android.settings.anomaly.tester:id/bluetooth_button";
+    private static final long TIME_OUT = 3000;
+    private UiDevice mDevice;
+
+    @Before
+    public void setUp() {
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        final Context context = instrumentation.getContext();
+        mDevice = UiDevice.getInstance(instrumentation);
+
+        // setup environment
+        TestUtils.setUp(instrumentation);
+        // start anomaly-tester app
+        TestUtils.startAnomalyApp(context, mDevice);
+    }
+
+    @After
+    public void tearDown() {
+        TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+    }
+
+    @Test
+    public void testBluetoothAnomaly_longScanningTime_reportAnomaly() throws InterruptedException {
+        // Set running time
+        final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+        TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+        // Click start button
+        TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+        // Wait for its running
+        mDevice.pressHome();
+        TestUtils.wait(mDevice, durationMs);
+
+        // Check it in battery main page
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+        assertWithMessage("Doesn't have bluetooth anomaly").that(
+                mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+                        TIME_OUT)).isNotNull();
+    }
+
+    @Test
+    public void testBluetoothAnomaly_shortScanningTime_notReport() throws InterruptedException {
+        // Set running time
+        final long durationMs = DateUtils.SECOND_IN_MILLIS;
+        TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+        // Click start button
+        TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+        // Wait for its running
+        mDevice.pressHome();
+        TestUtils.wait(mDevice, durationMs);
+
+        // Check it in battery main page
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+        assertWithMessage("Shouldn't have bluetooth anomaly").that(
+                mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+                        TIME_OUT)).isNull();
+    }
+
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
new file mode 100644
index 0000000..ac15d77
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
@@ -0,0 +1,91 @@
+/*
+ * 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.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.app.UiAutomation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+
+public class TestUtils {
+    private static final String PACKAGE_NAME = "com.android.settings.anomaly.tester";
+    private static final long TIME_OUT = 3000;
+
+    /**
+     * This method set up the environment for anomaly test
+     *
+     * @param instrumentation to execute command
+     */
+    public static void setUp(Instrumentation instrumentation) {
+        final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+        // pretend unplug and screen off, also reset the battery stats
+        uiAutomation.executeShellCommand("dumpsys battery unplug");
+        uiAutomation.executeShellCommand("dumpsys batterystats enable pretend-screen-off");
+        uiAutomation.executeShellCommand("dumpsys batterystats --reset");
+    }
+
+    /**
+     * This method cleans up all the commands in {@link #setUp(Instrumentation)}
+     *
+     * @param instrumentation to execute command
+     */
+    public static void tearDown(Instrumentation instrumentation) {
+        final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+        // reset unplug and screen-off
+        uiAutomation.executeShellCommand("dumpsys battery reset");
+        uiAutomation.executeShellCommand("dumpsys batterystats disable pretend-screen-off");
+    }
+
+    public static void startAnomalyApp(Context context, UiDevice uiDevice) {
+        final Intent intent = context.getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME);
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        context.startActivity(intent);
+        uiDevice.wait(Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)), TIME_OUT);
+    }
+
+    /**
+     * Find {@link android.widget.EditText} with {@code res} and set its {@code value}
+     */
+    public static void setEditTextWithValue(UiDevice uiDevice, String res, long value) {
+        final UiObject2 editText = uiDevice.findObject(By.res(res));
+        assertWithMessage("Cannot find editText with res: " + res).that(editText).isNotNull();
+        editText.setText(String.valueOf(value));
+    }
+
+    /**
+     * Find {@link android.widget.Button} with {@code res} and click it
+     */
+    public static void clickButton(UiDevice uiDevice, String res) {
+        final UiObject2 button = uiDevice.findObject(By.res(res));
+        assertWithMessage("Cannot find button with res: " + res).that(button).isNotNull();
+        button.click();
+    }
+
+    /**
+     * Make {@link UiDevice} wait for {@code timeMs}
+     *
+     * @see Thread#sleep(long)
+     */
+    public static void wait(UiDevice uiDevice, long timeMs) throws InterruptedException {
+        uiDevice.waitForIdle();
+        Thread.sleep(timeMs);
+    }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
new file mode 100644
index 0000000..a2f3804
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class WakelockAnomalyTest {
+    private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+    private static final String RES_WAKELOCK_EDITTEXT =
+            "com.android.settings.anomaly.tester:id/wakelock_run_time";
+    private static final String RES_WAKELOCK_BUTTON =
+            "com.android.settings.anomaly.tester:id/wakelock_button";
+    private static final long TIME_OUT = 3000;
+    private UiDevice mDevice;
+
+    @Before
+    public void setUp() {
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        final Context context = instrumentation.getContext();
+        mDevice = UiDevice.getInstance(instrumentation);
+
+        // setup environment
+        TestUtils.setUp(instrumentation);
+        // start anomaly-tester app
+        TestUtils.startAnomalyApp(context, mDevice);
+    }
+
+    @After
+    public void tearDown() {
+        TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+    }
+
+    @Test
+    public void testWakelockAnomaly_longTimeWhileRunning_report() throws InterruptedException {
+        // Set running time
+        final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+        TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+        // Click start button
+        TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+        // Wait for its running
+        mDevice.pressHome();
+        // Sleeping time less than running time, so the app still holding wakelock when we check
+        TestUtils.wait(mDevice, durationMs - TIME_OUT);
+
+        // Check it in battery main page
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+        assertWithMessage("Doesn't have wakelock anomaly").that(
+                mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+                        TIME_OUT)).isNotNull();
+    }
+
+    @Test
+    public void testWakelockAnomaly_shortTime_notReport() throws InterruptedException {
+        // Set running time
+        final long durationMs = DateUtils.SECOND_IN_MILLIS;
+        TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+        // Click start button
+        TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+        // Wait for its running
+        mDevice.pressHome();
+        TestUtils.wait(mDevice, durationMs);
+
+        // Check it in battery main page
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+        assertWithMessage("Shouldn't have wakelock anomaly").that(
+                mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+                        TIME_OUT)).isNull();
+    }
+
+    @Test
+    public void testWakelockAnomaly_longTimeWhileNotRunning_notReport()
+            throws InterruptedException {
+        // Set running time
+        final long durationMs = DateUtils.SECOND_IN_MILLIS * 10;
+        TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+        // Click start button
+        TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+        // Wait for its running
+        mDevice.pressHome();
+        // Wait more time for releasing the wakelock
+        TestUtils.wait(mDevice, durationMs + TIME_OUT);
+
+        // Check it in battery main page
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+        assertWithMessage("Shouldn't have wakelock anomaly").that(
+                mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+                        TIME_OUT)).isNull();
+    }
+
+}
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
deleted file mode 100644
index c0c0ccf..0000000
--- a/tests/app/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-LOCAL_CERTIFICATE := platform
-
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    android-support-test \
-    mockito-target \
-    espresso-core \
-    espresso-contrib-nodep \
-    espresso-intents-nodep \
-    ub-uiautomator \
-    truth-prebuilt \
-    legacy-android-test
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := SettingsTests
-
-LOCAL_INSTRUMENTATION_FOR := Settings
-
-include $(BUILD_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
deleted file mode 100644
index 6659e5f..0000000
--- a/tests/app/AndroidManifest.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.settings.tests">
-
-    <uses-permission android:name="android.permission.BLUETOOTH" />
-    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
-    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
-    <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-        <activity android:name="BluetoothRequestPermissionTest"
-            android:label="Bluetooth Perm Test" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity android:name="Operator" android:label="Operator Hook Test" >
-            <intent-filter>
-                <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" />
-            <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" />
-            <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
-        </activity>
-        <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" >
-            <intent-filter>
-                <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" />
-            <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" />
-            <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
-        </activity>
-    </application>
-
-    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.settings"
-        android:label="Settings Test Cases">
-    </instrumentation>
-
-    <instrumentation android:name="SettingsLaunchPerformance"
-        android:targetPackage="com.android.settings"
-        android:label="Settings Launch Performance">
-    </instrumentation>
-
-</manifest>
diff --git a/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java b/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
deleted file mode 100644
index dff7e61..0000000
--- a/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.notification;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.containsString;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.support.test.espresso.contrib.RecyclerViewActions;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.settings.R;
-import com.android.settings.Settings;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class SoundSettingsIntegrationTest {
-
-    private AudioManager mAudioManager;
-    private final String TRUNCATED_SUMMARY = "Ring volume at";
-
-    @Rule
-    public ActivityTestRule<Settings> mActivityRule =
-            new ActivityTestRule<>(Settings.class, true);
-
-    @Test
-    public void soundPreferenceShowsCorrectSummaryOnSilentMode() {
-        mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
-                .getSystemService(Context.AUDIO_SERVICE);
-        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
-        onView(withId(R.id.dashboard_container))
-                .perform(RecyclerViewActions.scrollTo(
-                        hasDescendant(withText(R.string.sound_settings))));
-        onView(withText(R.string.sound_settings_summary_silent)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    public void soundPreferenceShowsCorrectSummaryOnVibrateMode() {
-        mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
-                .getSystemService(Context.AUDIO_SERVICE);
-        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
-        onView(withId(R.id.dashboard_container)).perform(RecyclerViewActions
-                .scrollTo(hasDescendant(withText(R.string.sound_settings))));
-        onView(withText(R.string.sound_settings_summary_vibrate)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    public void soundPreferenceShowsCorrectSummaryOnMaxVolume() {
-        mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
-                .getSystemService(Context.AUDIO_SERVICE);
-        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
-        mAudioManager.setStreamVolume(AudioManager.STREAM_RING,
-                mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING), 0);
-        onView(withId(R.id.dashboard_container))
-                .perform(RecyclerViewActions.scrollTo(
-                        hasDescendant(withText(R.string.sound_settings))));
-        onView(withText(containsString(TRUNCATED_SUMMARY))).check(matches(isDisplayed()));
-    }
-}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
deleted file mode 100644
index 4b8e6cf..0000000
--- a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2016 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.tests;
-
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import com.android.settings.R;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.*;
-import static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
-import static org.hamcrest.core.AllOf.allOf;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class DashboardAdapterTest {
-    @Before
-    public void SetUp() {
-        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-        instrumentation.startActivitySync(new Intent(Settings
-                .ACTION_SETTINGS));
-    }
-
-    @Test
-    public void testTileConsistency_ToggleSuggestionsAndOpenBluetooth_shouldInBluetooth()
-            throws Exception{
-        final Context context = InstrumentationRegistry.getTargetContext();
-
-        onView(allOf(withText(context.getString(R.string.suggestions_title)),
-                withEffectiveVisibility(VISIBLE))).perform(click());
-        onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
-                withEffectiveVisibility(VISIBLE))).perform(click());
-
-        // It should go to Bluetooth sub page, not other page or crash
-        onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
-                withEffectiveVisibility(VISIBLE))).check(matches(isDisplayed()));
-
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index d85464d..33ead1f 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -8,14 +8,17 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.UserInfo;
 import android.net.ConnectivityManager;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.Network;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.os.storage.DiskInfo;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
@@ -23,6 +26,7 @@
 import android.text.format.DateUtils;
 import android.text.style.TtsSpan;
 
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -34,12 +38,15 @@
 import org.robolectric.annotation.Config;
 
 import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class UtilsTest {
 
     private static final String TIME_DESCRIPTION = "1 day 20 hours 30 minutes";
+    private static final String PACKAGE_NAME = "com.android.app";
     private Context mContext;
     @Mock
     private WifiManager wifiManager;
@@ -47,6 +54,10 @@
     private Network network;
     @Mock
     private ConnectivityManager connectivityManager;
+    @Mock
+    private DevicePolicyManagerWrapper mDevicePolicyManager;
+    @Mock
+    private UserManager mUserManager;
 
     @Before
     public void setUp() {
@@ -194,4 +205,25 @@
 
         assertThat(Utils.getInstallationStatus(info)).isEqualTo(R.string.disabled);
     }
+
+    @Test
+    public void testIsProfileOrDeviceOwner_deviceOwnerApp_returnTrue() {
+        when(mDevicePolicyManager.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true);
+
+        assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager,
+                PACKAGE_NAME)).isTrue();
+    }
+
+    @Test
+    public void testIsProfileOrDeviceOwner_profileOwnerApp_returnTrue() {
+        final List<UserInfo> userInfos = new ArrayList<>();
+        userInfos.add(new UserInfo());
+
+        when(mUserManager.getUsers()).thenReturn(userInfos);
+        when(mDevicePolicyManager.getProfileOwnerAsUser(userInfos.get(0).id)).thenReturn(
+                new ComponentName(PACKAGE_NAME, ""));
+
+        assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager,
+                PACKAGE_NAME)).isTrue();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index dc0730e..8fb1e99 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -55,6 +55,7 @@
 import com.android.settings.TestConfig;
 import com.android.settings.applications.instantapps.InstantAppButtonsController;
 import com.android.settings.applications.instantapps.InstantAppButtonsController.ShowDialogDelegate;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -103,7 +104,7 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private SettingsActivity mActivity;
     @Mock
-    private DevicePolicyManager mDevicePolicyManager;
+    private DevicePolicyManagerWrapper mDevicePolicyManager;
     @Mock
     private BatterySipper mBatterySipper;
     @Mock
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
index b16e5bc..a1db5de 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -39,6 +39,8 @@
 import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -52,6 +54,8 @@
     private Context mContext;
     @Mock
     private CachedBluetoothDevice mCachedBluetoothDevice;
+    @Mock
+    private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
 
     private FakeFeatureFactory mFakeFeatureFactory;
     private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -64,7 +68,8 @@
         FakeFeatureFactory.setupForTest(mContext);
         mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
         mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
-        mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice);
+        mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+                mDeviceListPreferenceFragment);
     }
 
     @Test
@@ -151,4 +156,49 @@
         assertThat(mPreference.getIcon()).isEqualTo(
                 mContext.getDrawable(R.drawable.ic_settings_print));
     }
+
+    @Test
+    public void testVisible_notVisibleThenVisible() {
+        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
+        final boolean[] humanReadableName = {false};
+        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+                .hasHumanReadableName();
+        BluetoothDevicePreference preference =
+                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+                        mDeviceListPreferenceFragment);
+        assertThat(preference.isVisible()).isFalse();
+        humanReadableName[0] = true;
+        preference.onDeviceAttributesChanged();
+        assertThat(preference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void testVisible_visibleThenNotVisible() {
+        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
+        final boolean[] humanReadableName = {true};
+        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+                .hasHumanReadableName();
+        BluetoothDevicePreference preference =
+                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+                        mDeviceListPreferenceFragment);
+        assertThat(preference.isVisible()).isTrue();
+        humanReadableName[0] = false;
+        preference.onDeviceAttributesChanged();
+        assertThat(preference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void testVisible_alwaysVisibleWhenEnabled() {
+        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(true);
+        final boolean[] humanReadableName = {true};
+        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+                .hasHumanReadableName();
+        BluetoothDevicePreference preference =
+                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+                        mDeviceListPreferenceFragment);
+        assertThat(preference.isVisible()).isTrue();
+        humanReadableName[0] = false;
+        preference.onDeviceAttributesChanged();
+        assertThat(preference.isVisible()).isTrue();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java b/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
index 09af870..bf57f40 100644
--- a/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
+++ b/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
@@ -16,50 +16,47 @@
 
 package com.android.settings.core.codeinspection;
 
-import java.io.File;
+import com.google.common.reflect.ClassPath;
+
 import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLDecoder;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * Scans and builds all classes in current classloader.
  */
 public class ClassScanner {
 
-    private static final String CLASS_SUFFIX = ".class";
-
     public List<Class<?>> getClassesForPackage(String packageName)
             throws ClassNotFoundException {
         final List<Class<?>> classes = new ArrayList<>();
 
         try {
-            final Enumeration<URL> resources = Thread.currentThread().getContextClassLoader()
-                    .getResources(packageName.replace('.', '/'));
-            if (!resources.hasMoreElements()) {
-                return classes;
-            }
-            URL url = resources.nextElement();
-            while (url != null) {
-                final URLConnection connection = url.openConnection();
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            ClassPath classPath = ClassPath.from(classLoader);
 
-                if (connection instanceof JarURLConnection) {
-                    loadClassFromJar((JarURLConnection) connection, packageName,
-                            classes);
-                } else {
-                    loadClassFromDirectory(new File(URLDecoder.decode(url.getPath(), "UTF-8")),
-                            packageName, classes);
-                }
-                if (resources.hasMoreElements()) {
-                    url = resources.nextElement();
-                } else {
-                    break;
+            // Some anonymous classes don't return true when calling isAnonymousClass(), but they
+            // always seem to be nested anonymous classes like com.android.settings.Foo$1$2. In
+            // general we don't want any anonymous classes so we just filter these out by searching
+            // for $[0-9] in the name.
+            Pattern anonymousClassPattern = Pattern.compile(".*\\$\\d+.*");
+            Matcher anonymousClassMatcher = anonymousClassPattern.matcher("");
+
+            for (ClassPath.ClassInfo info : classPath.getAllClasses()) {
+                if (info.getPackageName().startsWith(packageName)) {
+                    try {
+                        Class clazz = classLoader.loadClass(info.getName());
+                        if (clazz.isAnonymousClass() || anonymousClassMatcher.reset(
+                                clazz.getName()).matches()) {
+                            continue;
+                        }
+                        classes.add(clazz);
+                    } catch (NoClassDefFoundError e) {
+                        // do nothing. this class hasn't been found by the
+                        // loader, and we don't care.
+                    }
                 }
             }
         } catch (final IOException e) {
@@ -68,63 +65,4 @@
         return classes;
     }
 
-    private void loadClassFromDirectory(File directory, String packageName, List<Class<?>> classes)
-            throws ClassNotFoundException {
-        if (directory.exists() && directory.isDirectory()) {
-            final String[] files = directory.list();
-
-            for (final String file : files) {
-                if (file.endsWith(CLASS_SUFFIX)) {
-                    try {
-                        classes.add(Class.forName(
-                                packageName + '.' + file.substring(0, file.length() - 6),
-                                false /* init */,
-                                Thread.currentThread().getContextClassLoader()));
-                    } catch (NoClassDefFoundError e) {
-                        // do nothing. this class hasn't been found by the
-                        // loader, and we don't care.
-                    }
-                } else {
-                    final File tmpDirectory = new File(directory, file);
-                    if (tmpDirectory.isDirectory()) {
-                        loadClassFromDirectory(tmpDirectory, packageName + "." + file, classes);
-                    }
-                }
-            }
-        }
-    }
-
-    private void loadClassFromJar(JarURLConnection connection, String packageName,
-            List<Class<?>> classes) throws ClassNotFoundException, IOException {
-        final JarFile jarFile = connection.getJarFile();
-        final Enumeration<JarEntry> entries = jarFile.entries();
-        String name;
-        if (!entries.hasMoreElements()) {
-            return;
-        }
-        JarEntry jarEntry = entries.nextElement();
-        while (jarEntry != null) {
-            name = jarEntry.getName();
-
-            if (name.contains(CLASS_SUFFIX)) {
-                name = name.substring(0, name.length() - CLASS_SUFFIX.length()).replace('/', '.');
-
-                if (name.startsWith(packageName)) {
-                    try {
-                        classes.add(Class.forName(name,
-                                false /* init */,
-                                Thread.currentThread().getContextClassLoader()));
-                    } catch (NoClassDefFoundError e) {
-                        // do nothing. this class hasn't been found by the
-                        // loader, and we don't care.
-                    }
-                }
-            }
-            if (entries.hasMoreElements()) {
-                jarEntry = entries.nextElement();
-            } else {
-                break;
-            }
-        }
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
index faaf338..126a346 100644
--- a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
+++ b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
@@ -44,14 +44,12 @@
     @Before
     public void setUp() throws Exception {
         mClasses = new ClassScanner().getClassesForPackage(CodeInspector.PACKAGE_NAME);
-        // Disabled temporarily - see b/64840107
-        //assertThat(mClasses).isNotEmpty();
+        assertThat(mClasses).isNotEmpty();
     }
 
     @Test
     public void runCodeInspections() {
-        // Disabled temporarily - see b/64840107
-        // new InstrumentableFragmentCodeInspector(mClasses).run();
-        // new SearchIndexProviderCodeInspector(mClasses).run();
+        new InstrumentableFragmentCodeInspector(mClasses).run();
+        new SearchIndexProviderCodeInspector(mClasses).run();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 54d043c..c9fcf26 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -53,6 +53,7 @@
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowActivityManager;
 import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settingslib.applications.AppUtils;
@@ -78,7 +79,7 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
-        shadows = ShadowEntityHeaderController.class)
+        shadows = {ShadowEntityHeaderController.class, ShadowActivityManager.class})
 public class AdvancedPowerUsageDetailTest {
     private static final String APP_LABEL = "app label";
     private static final String SUMMARY = "summary";
@@ -350,6 +351,22 @@
     }
 
     @Test
+    public void testStartBatteryDetailPage_typeUser_startByCurrentUser() {
+        mBatterySipper.drainType = BatterySipper.DrainType.USER;
+        mBatterySipper.userId = 10;
+
+        final int currentUser = 20;
+        ShadowActivityManager.setCurrentUser(currentUser);
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+                mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+
+
+        verify(mTestActivity).startPreferencePanelAsUser(
+                nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
+                nullable(CharSequence.class), eq(new UserHandle(currentUser)));
+    }
+
+    @Test
     public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
         final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
         Answer<Void> callable = invocation -> {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 4f48945..91f4a2b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -17,14 +17,17 @@
 package com.android.settings.fuelgauge;
 
 import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;
+import android.os.UserManager;
 import android.support.v14.preference.SwitchPreference;
 
 import com.android.settings.R;
 import com.android.settings.TestConfig;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -62,6 +65,12 @@
     private ApplicationInfo mHighApplicationInfo;
     @Mock
     private ApplicationInfo mLowApplicationInfo;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private DevicePolicyManager mDevicePolicyManager;
+    @Mock
+    private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper;
     private BackgroundActivityPreferenceController mController;
     private SwitchPreference mPreference;
     private Context mShadowContext;
@@ -73,6 +82,9 @@
         mShadowContext = RuntimeEnvironment.application;
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(
+                mDevicePolicyManager);
         when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL);
         when(mPackageManager.getPackagesForUid(UID_SPECIAL)).thenReturn(PACKAGES_SPECIAL);
 
@@ -86,6 +98,7 @@
         mPreference = new SwitchPreference(mShadowContext);
         mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL));
         mController.isAvailable();
+        mController.mDpm = mDevicePolicyManagerWrapper;
     }
 
     @Test
@@ -181,6 +194,7 @@
     @Test
     public void testMultiplePackages_ReturnStatusForTargetPackage() {
         mController = new BackgroundActivityPreferenceController(mContext, UID_SPECIAL);
+        mController.mDpm = mDevicePolicyManagerWrapper;
         when(mAppOpsManager
                 .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, LOW_SDK_PACKAGE))
                 .thenReturn(AppOpsManager.MODE_ALLOWED);
diff --git a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
index 71c31aa..d78a818 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
@@ -410,9 +410,9 @@
 
         fragment.onIndexingFinished();
 
-        verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_DATABASE),
+        verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.DATABASE),
                 eq(null), any(LoaderManager.LoaderCallbacks.class));
-        verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_INSTALLED_APPS),
+        verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.INSTALLED_APPS),
                 eq(null), any(LoaderManager.LoaderCallbacks.class));
     }
 
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java
new file mode 100644
index 0000000..b7698b3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java
@@ -0,0 +1,36 @@
+/*
+ * 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.testutils.shadow;
+
+import android.app.ActivityManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(ActivityManager.class)
+public class ShadowActivityManager {
+    private static int sCurrentUserId = 0;
+
+    @Implementation
+    public static int getCurrentUser() {
+        return sCurrentUserId;
+    }
+
+    public static void setCurrentUser(int userId) {
+        sCurrentUserId = userId;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 2a7f0cc..86a5ba3 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -433,7 +433,7 @@
 
         displayAndResume();
 
-        verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8");
+        verify(mockDnsPref).setDetailText("8.8.4.4\n8.8.8.8");
     }
 
     @Test
@@ -545,7 +545,7 @@
         lp.addDnsServer(Constants.IPV4_DNS2);
         updateLinkProperties(lp);
         inOrder.verify(mockDnsPref).setDetailText(
-                Constants.IPV4_DNS1.getHostAddress() + "," +
+                Constants.IPV4_DNS1.getHostAddress() + "\n" +
                 Constants.IPV4_DNS2.getHostAddress());
         inOrder.verify(mockDnsPref).setVisible(true);
     }
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index b75a592..a91dcb1 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -14,6 +14,7 @@
     mockito-target-minus-junit4 \
     truth-prebuilt \
     ub-uiautomator \
+    espresso-contrib-nodep \
     espresso-intents-nodep \
 
 
diff --git a/tests/unit/AndroidManifest.xml b/tests/unit/AndroidManifest.xml
index c4cae0c..65ed661 100644
--- a/tests/unit/AndroidManifest.xml
+++ b/tests/unit/AndroidManifest.xml
@@ -17,8 +17,41 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.settings.tests.unit">
 
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+    <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
+
     <application>
         <uses-library android:name="android.test.runner" />
+        <activity android:name="com.android.settings.tests.BluetoothRequestPermissionTest"
+            android:label="Bluetooth Perm Test" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="Operator" android:label="Operator Hook Test" >
+            <intent-filter>
+                <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" />
+            <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" />
+            <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
+        </activity>
+        <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" >
+            <intent-filter>
+                <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" />
+            <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" />
+            <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
+        </activity>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
@@ -26,4 +59,9 @@
         android:label="Settings Test Cases">
     </instrumentation>
 
+    <instrumentation android:name="com.android.settings.tests.SettingsLaunchPerformance"
+        android:targetPackage="com.android.settings"
+        android:label="Settings Launch Performance">
+    </instrumentation>
+
 </manifest>
diff --git a/tests/app/res/drawable-hdpi/ic_settings_applications.png b/tests/unit/res/drawable-hdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-hdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-hdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/drawable-mdpi/ic_settings_applications.png b/tests/unit/res/drawable-mdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-mdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-mdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/drawable-xhdpi/ic_settings_applications.png b/tests/unit/res/drawable-xhdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-xhdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-xhdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/layout/bluetooth_request_permission_test.xml b/tests/unit/res/layout/bluetooth_request_permission_test.xml
similarity index 100%
rename from tests/app/res/layout/bluetooth_request_permission_test.xml
rename to tests/unit/res/layout/bluetooth_request_permission_test.xml
diff --git a/tests/app/res/layout/manufacturer_main.xml b/tests/unit/res/layout/manufacturer_main.xml
similarity index 100%
rename from tests/app/res/layout/manufacturer_main.xml
rename to tests/unit/res/layout/manufacturer_main.xml
diff --git a/tests/app/res/layout/operator_main.xml b/tests/unit/res/layout/operator_main.xml
similarity index 100%
rename from tests/app/res/layout/operator_main.xml
rename to tests/unit/res/layout/operator_main.xml
diff --git a/tests/app/res/values-af/strings.xml b/tests/unit/res/values-af/strings.xml
similarity index 100%
rename from tests/app/res/values-af/strings.xml
rename to tests/unit/res/values-af/strings.xml
diff --git a/tests/app/res/values-am/strings.xml b/tests/unit/res/values-am/strings.xml
similarity index 100%
rename from tests/app/res/values-am/strings.xml
rename to tests/unit/res/values-am/strings.xml
diff --git a/tests/app/res/values-ar/strings.xml b/tests/unit/res/values-ar/strings.xml
similarity index 100%
rename from tests/app/res/values-ar/strings.xml
rename to tests/unit/res/values-ar/strings.xml
diff --git a/tests/app/res/values-az/strings.xml b/tests/unit/res/values-az/strings.xml
similarity index 100%
rename from tests/app/res/values-az/strings.xml
rename to tests/unit/res/values-az/strings.xml
diff --git a/tests/app/res/values-b+sr+Latn/strings.xml b/tests/unit/res/values-b+sr+Latn/strings.xml
similarity index 100%
rename from tests/app/res/values-b+sr+Latn/strings.xml
rename to tests/unit/res/values-b+sr+Latn/strings.xml
diff --git a/tests/app/res/values-be/strings.xml b/tests/unit/res/values-be/strings.xml
similarity index 100%
rename from tests/app/res/values-be/strings.xml
rename to tests/unit/res/values-be/strings.xml
diff --git a/tests/app/res/values-bg/strings.xml b/tests/unit/res/values-bg/strings.xml
similarity index 100%
rename from tests/app/res/values-bg/strings.xml
rename to tests/unit/res/values-bg/strings.xml
diff --git a/tests/app/res/values-bn/strings.xml b/tests/unit/res/values-bn/strings.xml
similarity index 100%
rename from tests/app/res/values-bn/strings.xml
rename to tests/unit/res/values-bn/strings.xml
diff --git a/tests/app/res/values-bs/strings.xml b/tests/unit/res/values-bs/strings.xml
similarity index 100%
rename from tests/app/res/values-bs/strings.xml
rename to tests/unit/res/values-bs/strings.xml
diff --git a/tests/app/res/values-ca/strings.xml b/tests/unit/res/values-ca/strings.xml
similarity index 100%
rename from tests/app/res/values-ca/strings.xml
rename to tests/unit/res/values-ca/strings.xml
diff --git a/tests/app/res/values-cs/strings.xml b/tests/unit/res/values-cs/strings.xml
similarity index 100%
rename from tests/app/res/values-cs/strings.xml
rename to tests/unit/res/values-cs/strings.xml
diff --git a/tests/app/res/values-da/strings.xml b/tests/unit/res/values-da/strings.xml
similarity index 100%
rename from tests/app/res/values-da/strings.xml
rename to tests/unit/res/values-da/strings.xml
diff --git a/tests/app/res/values-de/strings.xml b/tests/unit/res/values-de/strings.xml
similarity index 100%
rename from tests/app/res/values-de/strings.xml
rename to tests/unit/res/values-de/strings.xml
diff --git a/tests/app/res/values-el/strings.xml b/tests/unit/res/values-el/strings.xml
similarity index 100%
rename from tests/app/res/values-el/strings.xml
rename to tests/unit/res/values-el/strings.xml
diff --git a/tests/app/res/values-en-rAU/strings.xml b/tests/unit/res/values-en-rAU/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rAU/strings.xml
rename to tests/unit/res/values-en-rAU/strings.xml
diff --git a/tests/app/res/values-en-rCA/strings.xml b/tests/unit/res/values-en-rCA/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rCA/strings.xml
rename to tests/unit/res/values-en-rCA/strings.xml
diff --git a/tests/app/res/values-en-rGB/strings.xml b/tests/unit/res/values-en-rGB/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rGB/strings.xml
rename to tests/unit/res/values-en-rGB/strings.xml
diff --git a/tests/app/res/values-en-rIN/strings.xml b/tests/unit/res/values-en-rIN/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rIN/strings.xml
rename to tests/unit/res/values-en-rIN/strings.xml
diff --git a/tests/app/res/values-en-rXC/strings.xml b/tests/unit/res/values-en-rXC/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rXC/strings.xml
rename to tests/unit/res/values-en-rXC/strings.xml
diff --git a/tests/app/res/values-es-rUS/strings.xml b/tests/unit/res/values-es-rUS/strings.xml
similarity index 100%
rename from tests/app/res/values-es-rUS/strings.xml
rename to tests/unit/res/values-es-rUS/strings.xml
diff --git a/tests/app/res/values-es/strings.xml b/tests/unit/res/values-es/strings.xml
similarity index 100%
rename from tests/app/res/values-es/strings.xml
rename to tests/unit/res/values-es/strings.xml
diff --git a/tests/app/res/values-et/strings.xml b/tests/unit/res/values-et/strings.xml
similarity index 100%
rename from tests/app/res/values-et/strings.xml
rename to tests/unit/res/values-et/strings.xml
diff --git a/tests/app/res/values-eu/strings.xml b/tests/unit/res/values-eu/strings.xml
similarity index 100%
rename from tests/app/res/values-eu/strings.xml
rename to tests/unit/res/values-eu/strings.xml
diff --git a/tests/app/res/values-fa/strings.xml b/tests/unit/res/values-fa/strings.xml
similarity index 100%
rename from tests/app/res/values-fa/strings.xml
rename to tests/unit/res/values-fa/strings.xml
diff --git a/tests/app/res/values-fi/strings.xml b/tests/unit/res/values-fi/strings.xml
similarity index 100%
rename from tests/app/res/values-fi/strings.xml
rename to tests/unit/res/values-fi/strings.xml
diff --git a/tests/app/res/values-fr-rCA/strings.xml b/tests/unit/res/values-fr-rCA/strings.xml
similarity index 100%
rename from tests/app/res/values-fr-rCA/strings.xml
rename to tests/unit/res/values-fr-rCA/strings.xml
diff --git a/tests/app/res/values-fr/strings.xml b/tests/unit/res/values-fr/strings.xml
similarity index 100%
rename from tests/app/res/values-fr/strings.xml
rename to tests/unit/res/values-fr/strings.xml
diff --git a/tests/app/res/values-gl/strings.xml b/tests/unit/res/values-gl/strings.xml
similarity index 100%
rename from tests/app/res/values-gl/strings.xml
rename to tests/unit/res/values-gl/strings.xml
diff --git a/tests/app/res/values-gu/strings.xml b/tests/unit/res/values-gu/strings.xml
similarity index 100%
rename from tests/app/res/values-gu/strings.xml
rename to tests/unit/res/values-gu/strings.xml
diff --git a/tests/app/res/values-hi/strings.xml b/tests/unit/res/values-hi/strings.xml
similarity index 100%
rename from tests/app/res/values-hi/strings.xml
rename to tests/unit/res/values-hi/strings.xml
diff --git a/tests/app/res/values-hr/strings.xml b/tests/unit/res/values-hr/strings.xml
similarity index 100%
rename from tests/app/res/values-hr/strings.xml
rename to tests/unit/res/values-hr/strings.xml
diff --git a/tests/app/res/values-hu/strings.xml b/tests/unit/res/values-hu/strings.xml
similarity index 100%
rename from tests/app/res/values-hu/strings.xml
rename to tests/unit/res/values-hu/strings.xml
diff --git a/tests/app/res/values-hy/strings.xml b/tests/unit/res/values-hy/strings.xml
similarity index 100%
rename from tests/app/res/values-hy/strings.xml
rename to tests/unit/res/values-hy/strings.xml
diff --git a/tests/app/res/values-in/strings.xml b/tests/unit/res/values-in/strings.xml
similarity index 100%
rename from tests/app/res/values-in/strings.xml
rename to tests/unit/res/values-in/strings.xml
diff --git a/tests/app/res/values-is/strings.xml b/tests/unit/res/values-is/strings.xml
similarity index 100%
rename from tests/app/res/values-is/strings.xml
rename to tests/unit/res/values-is/strings.xml
diff --git a/tests/app/res/values-it/strings.xml b/tests/unit/res/values-it/strings.xml
similarity index 100%
rename from tests/app/res/values-it/strings.xml
rename to tests/unit/res/values-it/strings.xml
diff --git a/tests/app/res/values-iw/strings.xml b/tests/unit/res/values-iw/strings.xml
similarity index 100%
rename from tests/app/res/values-iw/strings.xml
rename to tests/unit/res/values-iw/strings.xml
diff --git a/tests/app/res/values-ja/strings.xml b/tests/unit/res/values-ja/strings.xml
similarity index 100%
rename from tests/app/res/values-ja/strings.xml
rename to tests/unit/res/values-ja/strings.xml
diff --git a/tests/app/res/values-ka/strings.xml b/tests/unit/res/values-ka/strings.xml
similarity index 100%
rename from tests/app/res/values-ka/strings.xml
rename to tests/unit/res/values-ka/strings.xml
diff --git a/tests/app/res/values-kk/strings.xml b/tests/unit/res/values-kk/strings.xml
similarity index 100%
rename from tests/app/res/values-kk/strings.xml
rename to tests/unit/res/values-kk/strings.xml
diff --git a/tests/app/res/values-km/strings.xml b/tests/unit/res/values-km/strings.xml
similarity index 100%
rename from tests/app/res/values-km/strings.xml
rename to tests/unit/res/values-km/strings.xml
diff --git a/tests/app/res/values-kn/strings.xml b/tests/unit/res/values-kn/strings.xml
similarity index 100%
rename from tests/app/res/values-kn/strings.xml
rename to tests/unit/res/values-kn/strings.xml
diff --git a/tests/app/res/values-ko/strings.xml b/tests/unit/res/values-ko/strings.xml
similarity index 100%
rename from tests/app/res/values-ko/strings.xml
rename to tests/unit/res/values-ko/strings.xml
diff --git a/tests/app/res/values-ky/strings.xml b/tests/unit/res/values-ky/strings.xml
similarity index 100%
rename from tests/app/res/values-ky/strings.xml
rename to tests/unit/res/values-ky/strings.xml
diff --git a/tests/app/res/values-lo/strings.xml b/tests/unit/res/values-lo/strings.xml
similarity index 100%
rename from tests/app/res/values-lo/strings.xml
rename to tests/unit/res/values-lo/strings.xml
diff --git a/tests/app/res/values-lt/strings.xml b/tests/unit/res/values-lt/strings.xml
similarity index 100%
rename from tests/app/res/values-lt/strings.xml
rename to tests/unit/res/values-lt/strings.xml
diff --git a/tests/app/res/values-lv/strings.xml b/tests/unit/res/values-lv/strings.xml
similarity index 100%
rename from tests/app/res/values-lv/strings.xml
rename to tests/unit/res/values-lv/strings.xml
diff --git a/tests/app/res/values-mk/strings.xml b/tests/unit/res/values-mk/strings.xml
similarity index 100%
rename from tests/app/res/values-mk/strings.xml
rename to tests/unit/res/values-mk/strings.xml
diff --git a/tests/app/res/values-ml/strings.xml b/tests/unit/res/values-ml/strings.xml
similarity index 100%
rename from tests/app/res/values-ml/strings.xml
rename to tests/unit/res/values-ml/strings.xml
diff --git a/tests/app/res/values-mn/strings.xml b/tests/unit/res/values-mn/strings.xml
similarity index 100%
rename from tests/app/res/values-mn/strings.xml
rename to tests/unit/res/values-mn/strings.xml
diff --git a/tests/app/res/values-mr/strings.xml b/tests/unit/res/values-mr/strings.xml
similarity index 100%
rename from tests/app/res/values-mr/strings.xml
rename to tests/unit/res/values-mr/strings.xml
diff --git a/tests/app/res/values-ms/strings.xml b/tests/unit/res/values-ms/strings.xml
similarity index 100%
rename from tests/app/res/values-ms/strings.xml
rename to tests/unit/res/values-ms/strings.xml
diff --git a/tests/app/res/values-my/strings.xml b/tests/unit/res/values-my/strings.xml
similarity index 100%
rename from tests/app/res/values-my/strings.xml
rename to tests/unit/res/values-my/strings.xml
diff --git a/tests/app/res/values-nb/strings.xml b/tests/unit/res/values-nb/strings.xml
similarity index 100%
rename from tests/app/res/values-nb/strings.xml
rename to tests/unit/res/values-nb/strings.xml
diff --git a/tests/app/res/values-ne/strings.xml b/tests/unit/res/values-ne/strings.xml
similarity index 100%
rename from tests/app/res/values-ne/strings.xml
rename to tests/unit/res/values-ne/strings.xml
diff --git a/tests/app/res/values-nl/strings.xml b/tests/unit/res/values-nl/strings.xml
similarity index 100%
rename from tests/app/res/values-nl/strings.xml
rename to tests/unit/res/values-nl/strings.xml
diff --git a/tests/app/res/values-pa/strings.xml b/tests/unit/res/values-pa/strings.xml
similarity index 100%
rename from tests/app/res/values-pa/strings.xml
rename to tests/unit/res/values-pa/strings.xml
diff --git a/tests/app/res/values-pl/strings.xml b/tests/unit/res/values-pl/strings.xml
similarity index 100%
rename from tests/app/res/values-pl/strings.xml
rename to tests/unit/res/values-pl/strings.xml
diff --git a/tests/app/res/values-pt-rBR/strings.xml b/tests/unit/res/values-pt-rBR/strings.xml
similarity index 100%
rename from tests/app/res/values-pt-rBR/strings.xml
rename to tests/unit/res/values-pt-rBR/strings.xml
diff --git a/tests/app/res/values-pt-rPT/strings.xml b/tests/unit/res/values-pt-rPT/strings.xml
similarity index 100%
rename from tests/app/res/values-pt-rPT/strings.xml
rename to tests/unit/res/values-pt-rPT/strings.xml
diff --git a/tests/app/res/values-pt/strings.xml b/tests/unit/res/values-pt/strings.xml
similarity index 100%
rename from tests/app/res/values-pt/strings.xml
rename to tests/unit/res/values-pt/strings.xml
diff --git a/tests/app/res/values-ro/strings.xml b/tests/unit/res/values-ro/strings.xml
similarity index 100%
rename from tests/app/res/values-ro/strings.xml
rename to tests/unit/res/values-ro/strings.xml
diff --git a/tests/app/res/values-ru/strings.xml b/tests/unit/res/values-ru/strings.xml
similarity index 100%
rename from tests/app/res/values-ru/strings.xml
rename to tests/unit/res/values-ru/strings.xml
diff --git a/tests/app/res/values-si/strings.xml b/tests/unit/res/values-si/strings.xml
similarity index 100%
rename from tests/app/res/values-si/strings.xml
rename to tests/unit/res/values-si/strings.xml
diff --git a/tests/app/res/values-sk/strings.xml b/tests/unit/res/values-sk/strings.xml
similarity index 100%
rename from tests/app/res/values-sk/strings.xml
rename to tests/unit/res/values-sk/strings.xml
diff --git a/tests/app/res/values-sl/strings.xml b/tests/unit/res/values-sl/strings.xml
similarity index 100%
rename from tests/app/res/values-sl/strings.xml
rename to tests/unit/res/values-sl/strings.xml
diff --git a/tests/app/res/values-sq/strings.xml b/tests/unit/res/values-sq/strings.xml
similarity index 100%
rename from tests/app/res/values-sq/strings.xml
rename to tests/unit/res/values-sq/strings.xml
diff --git a/tests/app/res/values-sr/strings.xml b/tests/unit/res/values-sr/strings.xml
similarity index 100%
rename from tests/app/res/values-sr/strings.xml
rename to tests/unit/res/values-sr/strings.xml
diff --git a/tests/app/res/values-sv/strings.xml b/tests/unit/res/values-sv/strings.xml
similarity index 100%
rename from tests/app/res/values-sv/strings.xml
rename to tests/unit/res/values-sv/strings.xml
diff --git a/tests/app/res/values-sw/strings.xml b/tests/unit/res/values-sw/strings.xml
similarity index 100%
rename from tests/app/res/values-sw/strings.xml
rename to tests/unit/res/values-sw/strings.xml
diff --git a/tests/app/res/values-ta/strings.xml b/tests/unit/res/values-ta/strings.xml
similarity index 100%
rename from tests/app/res/values-ta/strings.xml
rename to tests/unit/res/values-ta/strings.xml
diff --git a/tests/app/res/values-te/strings.xml b/tests/unit/res/values-te/strings.xml
similarity index 100%
rename from tests/app/res/values-te/strings.xml
rename to tests/unit/res/values-te/strings.xml
diff --git a/tests/app/res/values-th/strings.xml b/tests/unit/res/values-th/strings.xml
similarity index 100%
rename from tests/app/res/values-th/strings.xml
rename to tests/unit/res/values-th/strings.xml
diff --git a/tests/app/res/values-tl/strings.xml b/tests/unit/res/values-tl/strings.xml
similarity index 100%
rename from tests/app/res/values-tl/strings.xml
rename to tests/unit/res/values-tl/strings.xml
diff --git a/tests/app/res/values-tr/strings.xml b/tests/unit/res/values-tr/strings.xml
similarity index 100%
rename from tests/app/res/values-tr/strings.xml
rename to tests/unit/res/values-tr/strings.xml
diff --git a/tests/app/res/values-uk/strings.xml b/tests/unit/res/values-uk/strings.xml
similarity index 100%
rename from tests/app/res/values-uk/strings.xml
rename to tests/unit/res/values-uk/strings.xml
diff --git a/tests/app/res/values-ur/strings.xml b/tests/unit/res/values-ur/strings.xml
similarity index 100%
rename from tests/app/res/values-ur/strings.xml
rename to tests/unit/res/values-ur/strings.xml
diff --git a/tests/app/res/values-uz/strings.xml b/tests/unit/res/values-uz/strings.xml
similarity index 100%
rename from tests/app/res/values-uz/strings.xml
rename to tests/unit/res/values-uz/strings.xml
diff --git a/tests/app/res/values-vi/strings.xml b/tests/unit/res/values-vi/strings.xml
similarity index 100%
rename from tests/app/res/values-vi/strings.xml
rename to tests/unit/res/values-vi/strings.xml
diff --git a/tests/app/res/values-zh-rCN/strings.xml b/tests/unit/res/values-zh-rCN/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rCN/strings.xml
rename to tests/unit/res/values-zh-rCN/strings.xml
diff --git a/tests/app/res/values-zh-rHK/strings.xml b/tests/unit/res/values-zh-rHK/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rHK/strings.xml
rename to tests/unit/res/values-zh-rHK/strings.xml
diff --git a/tests/app/res/values-zh-rTW/strings.xml b/tests/unit/res/values-zh-rTW/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rTW/strings.xml
rename to tests/unit/res/values-zh-rTW/strings.xml
diff --git a/tests/app/res/values-zu/strings.xml b/tests/unit/res/values-zu/strings.xml
similarity index 100%
rename from tests/app/res/values-zu/strings.xml
rename to tests/unit/res/values-zu/strings.xml
diff --git a/tests/app/res/values/strings.xml b/tests/unit/res/values/strings.xml
similarity index 100%
rename from tests/app/res/values/strings.xml
rename to tests/unit/res/values/strings.xml
diff --git a/tests/app/src/com/android/settings/SettingsHookTests.java b/tests/unit/src/com/android/settings/SettingsHookTests.java
similarity index 97%
rename from tests/app/src/com/android/settings/SettingsHookTests.java
rename to tests/unit/src/com/android/settings/SettingsHookTests.java
index 4dfd484..cc7aa89 100644
--- a/tests/app/src/com/android/settings/SettingsHookTests.java
+++ b/tests/unit/src/com/android/settings/SettingsHookTests.java
@@ -17,8 +17,6 @@
 package com.android.settings;
 
 import com.android.settings.Settings;
-import com.android.settings.tests.Manufacturer;
-import com.android.settings.tests.Operator;
 
 import android.content.Context;
 import android.content.Intent;
@@ -41,7 +39,7 @@
  */
 public class SettingsHookTests extends ActivityInstrumentationTestCase2<Settings> {
 
-    private static final String PACKAGE_NAME = "com.android.settings.tests";
+    private static final String PACKAGE_NAME = "com.android.settings.tests.unit";
 
     private static final String KEY_SETTINGS_ROOT = "parent";
     private static final String KEY_SETTINGS_OPERATOR = "operator_settings";
diff --git a/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java b/tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
similarity index 93%
rename from tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
rename to tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
index bd03bc9..eafe32a 100644
--- a/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
+++ b/tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
@@ -67,6 +67,9 @@
         final String titleApps = mTargetContext.getResources().getString(
             R.string.app_and_notification_dashboard_title);
         mDevice.findObject(new UiSelector().text(titleApps)).click();
+        final String titleAdvance = mTargetContext.getResources().getString(
+                R.string.advanced_section_header);
+        mDevice.findObject(new UiSelector().text(titleAdvance)).click();
         final String titleDefaultApps = mTargetContext.getResources().getString(
             R.string.app_default_dashboard_title);
         mDevice.findObject(new UiSelector().text(titleDefaultApps)).click();
diff --git a/tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java b/tests/unit/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
rename to tests/unit/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
diff --git a/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java b/tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
similarity index 91%
rename from tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
index b43a5ba..00b710f 100644
--- a/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
@@ -19,7 +19,7 @@
 import static org.hamcrest.Matchers.equalTo;
 
 @SmallTest
-public class StorageDashboardFragmentEspressoTest {
+public class StorageDashboardFragmentTest {
 
     public static final String EXTRA_KEY = ":settings:show_fragment";
 
@@ -30,7 +30,7 @@
     @Test
     public void testStorageManagePreference_canClickTextView() throws InterruptedException {
         // Click on the actual textbox instead of just somewhere in the preference
-        onView(withText(R.string.storage_menu_manage)).perform(click());
+        onView(withText(R.string.automatic_storage_manager_preference_title)).perform(click());
 
         // Check that it worked by seeing if we switched screens
         intended(hasExtra(equalTo(EXTRA_KEY),
diff --git a/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java b/tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
similarity index 97%
rename from tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 6c372c5..9cbd742 100644
--- a/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -34,7 +34,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public class PowerUsageSummaryUiTest {
+public class PowerUsageSummaryTest {
     private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
 
     @Before
diff --git a/tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java b/tests/unit/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
rename to tests/unit/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
diff --git a/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
similarity index 96%
rename from tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
rename to tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
index 40b69a4..32b47df 100644
--- a/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -170,6 +170,14 @@
         enterTestPin(view);
         enterTestPin(view);
 
+        // Dismiss notifications setting
+        view = new UiObject(new UiSelector()
+                .resourceId(mSettingPackage + ":id/redaction_done_button"));
+        if (view.waitForExists(TIMEOUT)) {
+            view.click();
+            mDevice.waitForIdle();
+        }
+
         mDevice.pressBack();
 
         assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure())
diff --git a/tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/unit/src/com/android/settings/password/ChooseLockPasswordTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java
rename to tests/unit/src/com/android/settings/password/ChooseLockPasswordTest.java
diff --git a/tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java b/tests/unit/src/com/android/settings/password/ConfirmLockPasswordTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java
rename to tests/unit/src/com/android/settings/password/ConfirmLockPasswordTest.java
diff --git a/tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java b/tests/unit/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
rename to tests/unit/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
diff --git a/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java b/tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
similarity index 99%
rename from tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
rename to tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
index a2cdafe..442f4b6 100644
--- a/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
+++ b/tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
@@ -30,6 +30,7 @@
 import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.ListView;
+import com.android.settings.tests.unit.R;
 
 public class BluetoothRequestPermissionTest extends Activity {
     private static final String TAG = "BluetoothRequestPermissionTest";
diff --git a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java b/tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
similarity index 84%
rename from tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
rename to tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
index 234f8e6..3e00a45 100644
--- a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
+++ b/tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
@@ -21,9 +21,13 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.uiautomator.UiDevice;
+
 import org.junit.runner.RunWith;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiScrollable;
+import android.support.test.uiautomator.UiSelector;
 import org.junit.Test;
 import com.android.settings.R;
 
@@ -52,8 +56,16 @@
         final String appName = (String) packageManager.getApplicationLabel(packageManager
                 .getApplicationInfo(PACKAGE_SYSTEM_UI, PackageManager.GET_META_DATA));
 
+        final UiDevice device = UiDevice.getInstance(instrumentation);
+        device.waitForIdle();
+
         openActionBarOverflowOrOptionsMenu(targetContext);
         onView(withText(targetContext.getString(R.string.menu_show_system))).perform(click());
+        device.waitForIdle();
+
+        final UiScrollable settings = new UiScrollable(
+                new UiSelector().packageName(targetContext.getPackageName()).scrollable(true));
+        settings.scrollTextIntoView(appName);
         onView(withText(appName)).perform(click());
         onView(withText(targetContext.getString(R.string.permit_draw_overlay))).check(matches
                 (not(isEnabled())));
diff --git a/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java b/tests/unit/src/com/android/settings/tests/KeepOnScreenTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
rename to tests/unit/src/com/android/settings/tests/KeepOnScreenTest.java
diff --git a/tests/app/src/com/android/settings/tests/Manufacturer.java b/tests/unit/src/com/android/settings/tests/Manufacturer.java
similarity index 95%
rename from tests/app/src/com/android/settings/tests/Manufacturer.java
rename to tests/unit/src/com/android/settings/tests/Manufacturer.java
index 692e6a8..a708d1b 100644
--- a/tests/app/src/com/android/settings/tests/Manufacturer.java
+++ b/tests/unit/src/com/android/settings/tests/Manufacturer.java
@@ -18,6 +18,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import com.android.settings.tests.unit.R;
 
 public class Manufacturer extends Activity {
 
diff --git a/tests/app/src/com/android/settings/tests/Operator.java b/tests/unit/src/com/android/settings/tests/Operator.java
similarity index 95%
rename from tests/app/src/com/android/settings/tests/Operator.java
rename to tests/unit/src/com/android/settings/tests/Operator.java
index 8a34363..94bcc78 100644
--- a/tests/app/src/com/android/settings/tests/Operator.java
+++ b/tests/unit/src/com/android/settings/tests/Operator.java
@@ -18,6 +18,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import com.android.settings.tests.unit.R;
 
 public class Operator extends Activity {
 
diff --git a/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java b/tests/unit/src/com/android/settings/tests/SettingsLaunchPerformance.java
similarity index 100%
rename from tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java
rename to tests/unit/src/com/android/settings/tests/SettingsLaunchPerformance.java
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 26a711b..b311816 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -66,15 +66,15 @@
     @Test
     public void launchTetherSettings_shouldHaveAllFields() {
         launchWifiTetherActivity();
-        onView(withText("Network name")).check(matches(isDisplayed()));
-        onView(withText("Password")).check(matches(isDisplayed()));
-        onView(withText("Select AP Band")).check(matches(isDisplayed()));
+        onView(withText("Hotspot name")).check(matches(isDisplayed()));
+        onView(withText("Hotspot password")).check(matches(isDisplayed()));
+        onView(withText("AP Band")).check(matches(isDisplayed()));
     }
 
     private void launchWifiTetherActivity() {
         mInstrumentation.startActivitySync(mTetherActivityIntent);
-        onView(withText("Portable Wi‑Fi hotspot")).perform();
-        UiObject2 item = mDevice.wait(Until.findObject(By.text("Portable Wi‑Fi hotspot")), TIMEOUT);
+        onView(withText("Wi‑Fi hotspot")).perform();
+        UiObject2 item = mDevice.wait(Until.findObject(By.text("Wi‑Fi hotspot")), TIMEOUT);
         item.click();
     }
 }