Merge "Import translations. DO NOT MERGE" into oc-dr1-dev
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_local_movies.xml
similarity index 75%
copy from res/drawable/ic_apps_vd_theme_24.xml
copy to res/drawable/ic_local_movies.xml
index ba59e83..9997723 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_local_movies.xml
@@ -20,6 +20,6 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="@android:color/white"
-        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"/>
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M18,3v2h-2V3H8v2H6V3H5C4.45,3 4,3.45 4,4v16c0,0.55 0.45,1 1,1h1v-2h2v2h8v-2h2v2h1c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1H18zM8,17H6v-2h2V17zM8,13H6v-2h2V13zM8,9H6V7h2V9zM18,17h-2v-2h2V17zM18,13h-2v-2h2V13zM18,9h-2V7h2V9z"/>
+</vector>
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_media_stream.xml
similarity index 77%
rename from res/drawable/ic_apps_vd_theme_24.xml
rename to res/drawable/ic_media_stream.xml
index ba59e83..4eb78bc 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_media_stream.xml
@@ -20,6 +20,6 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="@android:color/white"
-        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"/>
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M18,3h-5c-0.55,0 -1,0.45 -1,1v8.3a3.88,3.88 0,0 0,-2.9 -0.04c-1.79,0.67 -3.11,2.35 -3.1,4.26A4.483,4.483 0,0 0,10.5 21c2.5,0 4.5,-2.3 4.5,-4.5V6h3c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1z"/>
+</vector>
diff --git a/res/drawable/ic_music_note_vd_theme_24.xml b/res/drawable/ic_music_note_vd_theme_24.xml
deleted file mode 100644
index f31b023..0000000
--- a/res/drawable/ic_music_note_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-    Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_photo_library.xml
similarity index 72%
copy from res/drawable/ic_apps_vd_theme_24.xml
copy to res/drawable/ic_photo_library.xml
index ba59e83..732a348 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_photo_library.xml
@@ -20,6 +20,6 @@
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="@android:color/white"
-        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"/>
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M22,16V4c0,-1.11 -0.9,-2 -2,-2H8C6.89,2 6,2.89 6,4v12c0,1.1 0.89,2 2,2h12C21.1,18 22,17.1 22,16zM11,12l2.03,2.71L16,11l4,5H8L11,12zM2,7v13c0,1.1 0.9,2 2,2h13c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H4.5C4.22,20 4,19.78 4,19.5V7c0,-0.55 -0.45,-1 -1,-1h0C2.45,6 2,6.45 2,7z"/>
+</vector>
diff --git a/res/drawable/ic_photo_library_vd_theme_24.xml b/res/drawable/ic_photo_library_vd_theme_24.xml
deleted file mode 100644
index 3cd97fc..0000000
--- a/res/drawable/ic_photo_library_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-    Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings_storage.xml b/res/drawable/ic_settings_storage.xml
index 9bf6a27..36dcc38 100644
--- a/res/drawable/ic_settings_storage.xml
+++ b/res/drawable/ic_settings_storage.xml
@@ -1,5 +1,5 @@
 <!--
-    Copyright (C) 2016 The Android Open Source Project
+    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.
@@ -14,12 +14,12 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
+        android:width="24dp"
+        android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0"
         android:tint="?android:attr/colorControlNormal">
     <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M2.0,20.0l20.0,0.0l0.0,-4.0L2.0,16.0l0.0,4.0zm2.0,-3.0l2.0,0.0l0.0,2.0L4.0,19.0l0.0,-2.0zM2.0,4.0l0.0,4.0l20.0,0.0L22.0,4.0L2.0,4.0zm4.0,3.0L4.0,7.0L4.0,5.0l2.0,0.0l0.0,2.0zm-4.0,7.0l20.0,0.0l0.0,-4.0L2.0,10.0l0.0,4.0zm2.0,-3.0l2.0,0.0l0.0,2.0L4.0,13.0l0.0,-2.0z"/>
+        android:fillColor="#FF000000"
+        android:pathData="M20,16L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,19.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1zM4,8h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM5,4.9c0.61,0 1.1,0.49 1.1,1.1 0,0.61 -0.49,1.1 -1.1,1.1S3.9,6.61 3.9,6c0,-0.61 0.49,-1.1 1.1,-1.1zM20,10L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,13.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1z"/>
 </vector>
diff --git a/res/drawable/ic_storage.xml b/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..36dcc38
--- /dev/null
+++ b/res/drawable/ic_storage.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,16L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,19.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1zM4,8h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM5,4.9c0.61,0 1.1,0.49 1.1,1.1 0,0.61 -0.49,1.1 -1.1,1.1S3.9,6.61 3.9,6c0,-0.61 0.49,-1.1 1.1,-1.1zM20,10L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,13.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1z"/>
+</vector>
diff --git a/res/drawable/ic_storage_apps.xml b/res/drawable/ic_storage_apps.xml
new file mode 100644
index 0000000..7b86b89
--- /dev/null
+++ b/res/drawable/ic_storage_apps.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M6,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM16,6c0,1.1 0.9,2 2,2s2,-0.9 2,-2 -0.9,-2 -2,-2 -2,0.9 -2,2zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
+</vector>
diff --git a/res/drawable/ic_theaters_vd_theme_24.xml b/res/drawable/ic_theaters_vd_theme_24.xml
deleted file mode 100644
index d0bad19..0000000
--- a/res/drawable/ic_theaters_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-    Copyright (C) 2017 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z"/>
-</vector>
\ No newline at end of file
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 0cc9339..218192c 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -76,7 +76,6 @@
                     android:inputType="textPassword"
                     android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
                     android:gravity="center"
-                    android:textSize="16sp"
                     style="@style/TextAppearance.PasswordEntry"/>
 
                 <TextView style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml
index 082d6c9..7ce3034 100644
--- a/res/layout/choose_lock_password.xml
+++ b/res/layout/choose_lock_password.xml
@@ -59,7 +59,6 @@
                 android:gravity="center"
                 android:inputType="textPassword"
                 android:imeOptions="actionNext|flagNoExtractUi|flagForceAscii"
-                android:textSize="24sp"
                 style="@style/TextAppearance.PasswordEntry"/>
 
             <android.support.v7.widget.RecyclerView
diff --git a/res/layout/condition_tile_new_ui.xml b/res/layout/condition_tile_new_ui.xml
index d8d2284..49bf0c0 100644
--- a/res/layout/condition_tile_new_ui.xml
+++ b/res/layout/condition_tile_new_ui.xml
@@ -24,15 +24,15 @@
 
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="48dp"
+        android:layout_height="36dp"
         android:background="?android:attr/selectableItemBackground"
-        android:orientation="horizontal"
-        android:gravity="center_vertical">
+        android:orientation="horizontal">
 
         <ImageView
             android:id="@android:id/icon"
             android:layout_width="@dimen/dashboard_tile_image_size"
             android:layout_height="@dimen/dashboard_tile_image_size"
+            android:layout_marginTop="12dp"
             android:layout_marginStart="14dp"
             android:layout_marginEnd="24dp"
             android:tint="?android:attr/colorAccent" />
@@ -41,6 +41,7 @@
             android:id="@android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginTop="14dp"
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:textColor="?android:attr/colorAccent" />
 
@@ -62,7 +63,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingStart="62dp"
-        android:paddingBottom="8dp"
+        android:paddingBottom="1dp"
         style="?android:attr/buttonBarStyle"
         android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
 
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index 0c65e86..05e90d2 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -76,7 +76,6 @@
                 android:inputType="textPassword"
                 android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
                 android:gravity="center"
-                android:textSize="16sp"
                 style="@style/TextAppearance.PasswordEntry"/>
 
             <TextView
diff --git a/res/layout/confirm_lock_password_internal.xml b/res/layout/confirm_lock_password_internal.xml
index 701ff57..558522c 100644
--- a/res/layout/confirm_lock_password_internal.xml
+++ b/res/layout/confirm_lock_password_internal.xml
@@ -54,7 +54,6 @@
                 android:inputType="textPassword"
                 android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
                 android:gravity="center"
-                android:textSize="16sp"
                 style="@style/TextAppearance.PasswordEntry"/>
 
             <TextView
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f63d963..7f4cb79 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -100,7 +100,7 @@
     <color name="usage_graph_dots">#B0BEC5</color>
 
     <!-- Gestures settings -->
-    <color name="gestures_setting_background_color">#f5f5f5</color>
+    <color name="gestures_setting_background_color">#f4f4f4</color>
 
     <color name="status_bar_color">#3c3c3c</color>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 398bdbd..e40850d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -79,6 +79,7 @@
         <item name="android:gravity">center</item>
         <item name="android:singleLine">true</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="android:textSize">24sp</item>
     </style>
 
     <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index b31d0eb..54699d3 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -26,20 +26,20 @@
         android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings"
         android:key="toggle_asm"
         android:title="@string/automatic_storage_manager_preference_title"
-        android:icon="@drawable/ic_settings_storage"
+        android:icon="@drawable/ic_storage"
         android:order="1"
         settings:allowDividerAbove="true"
         settings:allowDividerBelow="true"/>
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_photos_videos"
         android:title="@string/storage_photos_videos"
-        android:icon="@drawable/ic_photo_library_vd_theme_24"
+        android:icon="@drawable/ic_photo_library"
         settings:allowDividerAbove="true"
         android:order="2" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_music_audio"
         android:title="@string/storage_music_audio"
-        android:icon="@drawable/ic_music_note_vd_theme_24"
+        android:icon="@drawable/ic_media_stream"
         android:order="3" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_games"
@@ -49,12 +49,12 @@
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_movies"
         android:title="@string/storage_movies_tv"
-        android:icon="@drawable/ic_theaters_vd_theme_24"
+        android:icon="@drawable/ic_local_movies"
         android:order="5" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_other_apps"
         android:title="@string/storage_other_apps"
-        android:icon="@drawable/ic_apps_vd_theme_24"
+        android:icon="@drawable/ic_storage_apps"
         android:order="6" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_files"
diff --git a/res/xml/storage_profile_fragment.xml b/res/xml/storage_profile_fragment.xml
index be269e5..a12bdd5 100644
--- a/res/xml/storage_profile_fragment.xml
+++ b/res/xml/storage_profile_fragment.xml
@@ -21,12 +21,12 @@
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_photos_videos"
         android:title="@string/storage_photos_videos"
-        android:icon="@drawable/ic_photo_library_vd_theme_24"
+        android:icon="@drawable/ic_photo_library"
         android:order="2" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_music_audio"
         android:title="@string/storage_music_audio"
-        android:icon="@drawable/ic_music_note_vd_theme_24"
+        android:icon="@drawable/ic_media_stream"
         android:order="3" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_games"
@@ -36,13 +36,13 @@
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_movies"
         android:title="@string/storage_movies_tv"
-        android:icon="@drawable/ic_theaters_vd_theme_24"
+        android:icon="@drawable/ic_local_movies"
         android:order="5"
     />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_other_apps"
         android:title="@string/storage_other_apps"
-        android:icon="@drawable/ic_apps_vd_theme_24"
+        android:icon="@drawable/ic_storage_apps"
         android:order="6" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_files"
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index c8f9dd1..ba160ab 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -52,6 +52,7 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.util.ArrayUtils;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -117,6 +118,7 @@
     private String[] mReadOnlyApnTypes;
     private String[] mReadOnlyApnFields;
     private boolean mReadOnlyApn;
+    private String mUserEnteredApnType;
 
     /**
      * Standard projection for the interesting columns of a normal note.
@@ -212,6 +214,7 @@
         mReadOnlyApn = false;
         mReadOnlyApnTypes = null;
         mReadOnlyApnFields = null;
+        mUserEnteredApnType = null;
 
         CarrierConfigManager configManager = (CarrierConfigManager)
                 getSystemService(Context.CARRIER_CONFIG_SERVICE);
@@ -220,6 +223,11 @@
             if (b != null) {
                 mReadOnlyApnTypes = b.getStringArray(
                         CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY);
+                if (!ArrayUtils.isEmpty(mReadOnlyApnTypes)) {
+                    for (String apnType : mReadOnlyApnTypes) {
+                        Log.d(TAG, "onCreate: read only APN type: " + apnType);
+                    }
+                }
                 mReadOnlyApnFields = b.getStringArray(
                         CarrierConfigManager.KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY);
             }
@@ -951,7 +959,7 @@
 
         callUpdate = setStringValueAndCheckIfDiff(values,
                 Telephony.Carriers.TYPE,
-                checkNotSet(mApnType.getText()),
+                checkNotSet(getUserEnteredApnType()),
                 callUpdate,
                 TYPE_INDEX);
 
@@ -1057,10 +1065,11 @@
             // if carrier does not allow editing certain apn types, make sure type does not include
             // those
             if (!ArrayUtils.isEmpty(mReadOnlyApnTypes)
-                    && apnTypesMatch(mReadOnlyApnTypes, mApnType.getText())) {
+                    && apnTypesMatch(mReadOnlyApnTypes, getUserEnteredApnType())) {
                 StringBuilder stringBuilder = new StringBuilder();
                 for (String type : mReadOnlyApnTypes) {
                     stringBuilder.append(type).append(", ");
+                    Log.d(TAG, "getErrorMsg: appending type: " + type);
                 }
                 // remove last ", "
                 if (stringBuilder.length() >= 2) {
@@ -1107,6 +1116,41 @@
         }
     }
 
+    private String getUserEnteredApnType() {
+        if (mUserEnteredApnType != null) {
+            return mUserEnteredApnType;
+        }
+
+        // if user has not specified a type, map it to "ALL APN TYPES THAT ARE NOT READ-ONLY"
+        mUserEnteredApnType = mApnType.getText();
+        if (mUserEnteredApnType != null) mUserEnteredApnType = mUserEnteredApnType.trim();
+        if ((TextUtils.isEmpty(mUserEnteredApnType)
+                || PhoneConstants.APN_TYPE_ALL.equals(mUserEnteredApnType))
+                && !ArrayUtils.isEmpty(mReadOnlyApnTypes)) {
+            StringBuilder editableApnTypes = new StringBuilder();
+            List<String> readOnlyApnTypes = Arrays.asList(mReadOnlyApnTypes);
+            boolean first = true;
+            for (String apnType : PhoneConstants.APN_TYPES) {
+                // add APN type if it is not read-only and is not wild-cardable
+                if (!readOnlyApnTypes.contains(apnType)
+                        && !apnType.equals(PhoneConstants.APN_TYPE_IA)
+                        && !apnType.equals(PhoneConstants.APN_TYPE_EMERGENCY)) {
+                    if (first) {
+                        first = false;
+                    } else {
+                        editableApnTypes.append(",");
+                    }
+                    editableApnTypes.append(apnType);
+                }
+            }
+            mUserEnteredApnType = editableApnTypes.toString();
+            Log.d(TAG, "getUserEnteredApnType: changed apn type to editable apn types: "
+                    + mUserEnteredApnType);
+        }
+
+        return mUserEnteredApnType;
+    }
+
     public static class ErrorDialog extends InstrumentedDialogFragment {
 
         public static void showError(ApnEditor editor) {
diff --git a/src/com/android/settings/applications/MusicViewHolderController.java b/src/com/android/settings/applications/MusicViewHolderController.java
index 61a011d..af822a0 100644
--- a/src/com/android/settings/applications/MusicViewHolderController.java
+++ b/src/com/android/settings/applications/MusicViewHolderController.java
@@ -19,6 +19,7 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.drawable.InsetDrawable;
 import android.os.UserHandle;
 import android.provider.DocumentsContract;
 import android.support.annotation.WorkerThread;
@@ -38,6 +39,7 @@
     private static final String TAG = "MusicViewHolderController";
 
     private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
+    private static final int INSET_SIZE = 24; // dp
 
     private Context mContext;
     private StorageStatsSource mSource;
@@ -71,7 +73,8 @@
 
     @Override
     public void setupView(AppViewHolder holder) {
-        holder.appIcon.setImageDrawable(mContext.getDrawable(R.drawable.ic_headset_24dp));
+        holder.appIcon.setImageDrawable(
+                new InsetDrawable(mContext.getDrawable(R.drawable.ic_headset_24dp), INSET_SIZE));
         holder.appName.setText(mContext.getText(R.string.audio_files_title));
         holder.summary.setText(Formatter.formatFileSize(mContext, mMusicSize));
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
index 41cd28d..bbc8d81 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
@@ -43,14 +43,19 @@
         mIsConnected = device.isConnected();
     }
 
+    private void onForgetButtonPressed() {
+        ForgetDeviceDialogFragment fragment =
+                ForgetDeviceDialogFragment.newInstance(mCachedDevice.getAddress());
+        fragment.show(mFragment.getFragmentManager(), ForgetDeviceDialogFragment.TAG);
+    }
+
     @Override
     protected void init(PreferenceScreen screen) {
         mActionButtons = (LayoutPreference) screen.findPreference(getPreferenceKey());
         Button rightButton = (Button) mActionButtons.findViewById(R.id.right_button);
         rightButton.setText(R.string.forget);
         rightButton.setOnClickListener((view) -> {
-            mCachedDevice.unpair();
-            mFragment.getActivity().finish();
+            onForgetButtonPressed();
         });
     }
 
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
new file mode 100644
index 0000000..1f3a689
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/** Implements an AlertDialog for confirming that a user wishes to unpair or "forget" a paired
+ *  device*/
+public class ForgetDeviceDialogFragment extends InstrumentedDialogFragment {
+    public static final String TAG = "ForgetBluetoothDevice";
+    private static final String KEY_DEVICE_ADDRESS = "device_address";
+
+    private CachedBluetoothDevice mDevice;
+
+    public static ForgetDeviceDialogFragment newInstance(String deviceAddress) {
+        Bundle args = new Bundle(1);
+        args.putString(KEY_DEVICE_ADDRESS, deviceAddress);
+        ForgetDeviceDialogFragment dialog = new ForgetDeviceDialogFragment();
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    @VisibleForTesting
+    CachedBluetoothDevice getDevice(Context context) {
+        String deviceAddress = getArguments().getString(KEY_DEVICE_ADDRESS);
+        LocalBluetoothManager manager = Utils.getLocalBtManager(context);
+        BluetoothDevice device = manager.getBluetoothAdapter().getRemoteDevice(deviceAddress);
+        return manager.getCachedDeviceManager().findDevice(device);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle inState) {
+        DialogInterface.OnClickListener onConfirm = (dialog, which) -> {
+            mDevice.unpair();
+            Activity activity = getActivity();
+            if (activity != null) {
+                activity.finish();
+            }
+        };
+        Context context = getContext();
+        mDevice = getDevice(context);
+        AlertDialog dialog = new AlertDialog.Builder(context)
+                .setPositiveButton(R.string.bluetooth_unpair_dialog_forget_confirm_button,
+                        onConfirm)
+                .setNegativeButton(android.R.string.cancel, null)
+                .create();
+        dialog.setTitle(R.string.bluetooth_unpair_dialog_title);
+        dialog.setMessage(context.getString(R.string.bluetooth_unpair_dialog_body,
+                mDevice.getName()));
+        return dialog;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java b/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
index b99519b..bc166c3 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
@@ -41,9 +41,12 @@
 
     @Override
     public BatteryStatsHelper loadInBackground() {
-        final BatteryStatsHelper statsHelper = new BatteryStatsHelper(getContext(), true);
+        Context context = getContext();
+        final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
+                true /* collectBatteryBroadcast */);
 
-        initBatteryStatsHelper(statsHelper);
+        BatteryUtils.getInstance(context).initBatteryStatsHelper(statsHelper, mBundle,
+                mUserManager);
         return statsHelper;
     }
 
@@ -52,9 +55,5 @@
 
     }
 
-    @VisibleForTesting
-    void initBatteryStatsHelper(BatteryStatsHelper statsHelper) {
-        statsHelper.create(mBundle);
-        statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, mUserManager.getUserProfiles());
-    }
+
 }
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 48da886..e98ed82 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -15,10 +15,15 @@
  */
 package com.android.settings.fuelgauge;
 
+import android.app.AppOpsManager;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.BatteryStats;
+import android.os.Bundle;
+import android.os.Build;
 import android.os.SystemClock;
+import android.os.UserManager;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.annotation.StringRes;
@@ -45,6 +50,7 @@
  */
 public class BatteryUtils {
     public static final int UID_NULL = -1;
+    public static final int SDK_NULL = -1;
 
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({StatusType.FOREGROUND,
@@ -64,6 +70,7 @@
     private static BatteryUtils sInstance;
 
     private PackageManager mPackageManager;
+    private AppOpsManager mAppOpsManager;
     @VisibleForTesting
     PowerUsageFeatureProvider mPowerUsageFeatureProvider;
 
@@ -77,6 +84,7 @@
     @VisibleForTesting
     BatteryUtils(Context context) {
         mPackageManager = context.getPackageManager();
+        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mPowerUsageFeatureProvider = FeatureFactory.getFactory(
                 context).getPowerUsageFeatureProvider(context);
     }
@@ -262,6 +270,37 @@
     }
 
     /**
+     * Find the targetSdkVersion for package with name {@code packageName}
+     *
+     * @return the targetSdkVersion, or {@link #SDK_NULL} if {@code packageName} doesn't exist
+     */
+    public int getTargetSdkVersion(final String packageName) {
+        try {
+            ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
+                    PackageManager.GET_META_DATA);
+
+            return info.targetSdkVersion;
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Cannot find package: " + packageName, e);
+        }
+
+        return SDK_NULL;
+    }
+
+    /**
+     * Check whether background restriction is enabled
+     */
+    public boolean isBackgroundRestrictionEnabled(final int targetSdkVersion, final int uid,
+            final String packageName) {
+        if (targetSdkVersion >= Build.VERSION_CODES.O) {
+            return true;
+        }
+        final int mode = mAppOpsManager
+                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName);
+        return mode == AppOpsManager.MODE_IGNORED || mode == AppOpsManager.MODE_ERRORED;
+    }
+
+    /**
      * Sort the {@code usageList} based on {@link BatterySipper#totalPowerMah}
      */
     public void sortUsageList(List<BatterySipper> usageList) {
@@ -328,8 +367,14 @@
         return timeMs * 1000;
     }
 
+    public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
+            UserManager userManager) {
+        statsHelper.create(bundle);
+        statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, userManager.getUserProfiles());
+    }
+
     private boolean isDataCorrupted() {
-        return mPackageManager == null;
+        return mPackageManager == null || mAppOpsManager == null;
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java b/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
index 2a4282a..dba964f 100644
--- a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
+++ b/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
@@ -46,16 +46,18 @@
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({AnomalyActionType.FORCE_STOP,
             AnomalyActionType.BACKGROUND_CHECK,
-            AnomalyActionType.LOCATION_CHECK})
+            AnomalyActionType.LOCATION_CHECK,
+            AnomalyActionType.STOP_AND_BACKGROUND_CHECK})
     public @interface AnomalyActionType {
         int FORCE_STOP = 0;
         int BACKGROUND_CHECK = 1;
         int LOCATION_CHECK = 2;
+        int STOP_AND_BACKGROUND_CHECK = 3;
     }
 
     @AnomalyType
-    public static final int[] ANOMALY_TYPE_LIST =
-            {AnomalyType.WAKE_LOCK,
+    public static final int[] ANOMALY_TYPE_LIST = {
+            AnomalyType.WAKE_LOCK,
             AnomalyType.WAKEUP_ALARM,
             AnomalyType.BLUETOOTH_SCAN};
 
@@ -64,8 +66,15 @@
      */
     public final int type;
     public final int uid;
+    public final int targetSdkVersion;
     public final long wakelockTimeMs;
     /**
+     * {@code true} if background restriction is enabled
+     *
+     * @see android.app.AppOpsManager.OP_RUN_IN_BACKGROUND
+     */
+    public final boolean backgroundRestrictionEnabled;
+    /**
      * Display name of this anomaly, usually it is the app name
      */
     public final CharSequence displayName;
@@ -77,6 +86,8 @@
         displayName = builder.mDisplayName;
         packageName = builder.mPackageName;
         wakelockTimeMs = builder.mWakeLockTimeMs;
+        targetSdkVersion = builder.mTargetSdkVersion;
+        backgroundRestrictionEnabled = builder.mBgRestrictionEnabled;
     }
 
     private Anomaly(Parcel in) {
@@ -85,6 +96,8 @@
         displayName = in.readCharSequence();
         packageName = in.readString();
         wakelockTimeMs = in.readLong();
+        targetSdkVersion = in.readInt();
+        backgroundRestrictionEnabled = in.readBoolean();
     }
 
     @Override
@@ -99,6 +112,8 @@
         dest.writeCharSequence(displayName);
         dest.writeString(packageName);
         dest.writeLong(wakelockTimeMs);
+        dest.writeInt(targetSdkVersion);
+        dest.writeBoolean(backgroundRestrictionEnabled);
     }
 
     @Override
@@ -115,12 +130,15 @@
                 && uid == other.uid
                 && wakelockTimeMs == other.wakelockTimeMs
                 && TextUtils.equals(displayName, other.displayName)
-                && TextUtils.equals(packageName, other.packageName);
+                && TextUtils.equals(packageName, other.packageName)
+                && targetSdkVersion == other.targetSdkVersion
+                && backgroundRestrictionEnabled == other.backgroundRestrictionEnabled;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(type, uid, displayName, packageName, wakelockTimeMs);
+        return Objects.hash(type, uid, displayName, packageName, wakelockTimeMs, targetSdkVersion,
+                backgroundRestrictionEnabled);
     }
 
     public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@@ -137,9 +155,11 @@
         @AnomalyType
         private int mType;
         private int mUid;
+        private int mTargetSdkVersion;
         private CharSequence mDisplayName;
         private String mPackageName;
         private long mWakeLockTimeMs;
+        private boolean mBgRestrictionEnabled;
 
         public Builder setType(@AnomalyType int type) {
             mType = type;
@@ -166,6 +186,16 @@
             return this;
         }
 
+        public Builder setTargetSdkVersion(int targetSdkVersion) {
+            mTargetSdkVersion = targetSdkVersion;
+            return this;
+        }
+
+        public Builder setBackgroundRestrictionEnabled(boolean bgRestrictionEnabled) {
+            mBgRestrictionEnabled = bgRestrictionEnabled;
+            return this;
+        }
+
         public Anomaly build() {
             return new Anomaly(this);
         }
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
index 452cc35..69d03b9 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
@@ -90,7 +90,7 @@
             return;
         }
 
-        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly.type);
+        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
         final int metricsKey = getArguments().getInt(ARG_METRICS_KEY);
 
         anomalyAction.handlePositiveAction(mAnomaly, metricsKey);
@@ -103,16 +103,18 @@
         mAnomaly = bundle.getParcelable(ARG_ANOMALY);
 
         final Context context = getContext();
-        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly.type);
+        final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
         switch (anomalyAction.getActionType()) {
             case Anomaly.AnomalyActionType.FORCE_STOP:
                 return new AlertDialog.Builder(context)
                         .setTitle(R.string.dialog_stop_title)
-                        .setMessage(getString(R.string.dialog_stop_message, mAnomaly.displayName))
+                        .setMessage(getString(mAnomaly.type == Anomaly.AnomalyType.WAKE_LOCK
+                                ? R.string.dialog_stop_message
+                                : R.string.dialog_stop_message_wakeup_alarm, mAnomaly.displayName))
                         .setPositiveButton(R.string.dialog_stop_ok, this)
                         .setNegativeButton(R.string.dlg_cancel, null)
                         .create();
-            case Anomaly.AnomalyActionType.BACKGROUND_CHECK:
+            case Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK:
                 return new AlertDialog.Builder(context)
                         .setTitle(R.string.dialog_background_check_title)
                         .setMessage(getString(R.string.dialog_background_check_message,
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
index 9d0e1d0..8ac9e6f 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
@@ -17,12 +17,13 @@
 package com.android.settings.fuelgauge.anomaly;
 
 import android.content.Context;
+import android.os.Build;
 import android.support.annotation.VisibleForTesting;
 
 import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.fuelgauge.anomaly.action.BackgroundCheckAction;
 import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
 import com.android.settings.fuelgauge.anomaly.action.LocationCheckAction;
+import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
 import com.android.settings.fuelgauge.anomaly.checker.AnomalyDetector;
 import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector;
 import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
@@ -49,16 +50,22 @@
 
     /**
      * Return the corresponding {@link AnomalyAction} according to
-     * {@link com.android.settings.fuelgauge.anomaly.Anomaly.AnomalyType}
+     * {@link com.android.settings.fuelgauge.anomaly.Anomaly}
      *
      * @return corresponding {@link AnomalyAction}, or null if cannot find it.
      */
-    public AnomalyAction getAnomalyAction(@Anomaly.AnomalyType int anomalyType) {
-        switch (anomalyType) {
+    public AnomalyAction getAnomalyAction(Anomaly anomaly) {
+        switch (anomaly.type) {
             case Anomaly.AnomalyType.WAKE_LOCK:
                 return new ForceStopAction(mContext);
             case Anomaly.AnomalyType.WAKEUP_ALARM:
-                return new BackgroundCheckAction(mContext);
+                if (anomaly.targetSdkVersion >= Build.VERSION_CODES.O
+                        || (anomaly.targetSdkVersion < Build.VERSION_CODES.O
+                                && anomaly.backgroundRestrictionEnabled)) {
+                    return new ForceStopAction(mContext);
+                } else {
+                    return new StopAndBackgroundCheckAction(mContext);
+                }
             case Anomaly.AnomalyType.BLUETOOTH_SCAN:
                 return new LocationCheckAction(mContext);
             default:
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
index 799bddc..5526cc9 100644
--- a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
+++ b/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
@@ -18,8 +18,11 @@
 
 import android.app.AppOpsManager;
 import android.content.Context;
+import android.os.Build;
+import android.support.annotation.VisibleForTesting;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 
 /**
@@ -28,6 +31,8 @@
 public class BackgroundCheckAction extends AnomalyAction {
 
     private AppOpsManager mAppOpsManager;
+    @VisibleForTesting
+    BatteryUtils mBatteryUtils;
 
     public BackgroundCheckAction(Context context) {
         super(context);
@@ -38,17 +43,17 @@
     @Override
     public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
         super.handlePositiveAction(anomaly, contextMetricsKey);
-
-        mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid, anomaly.packageName,
-                AppOpsManager.MODE_IGNORED);
+        if (anomaly.targetSdkVersion < Build.VERSION_CODES.O) {
+            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
+                    anomaly.packageName,
+                    AppOpsManager.MODE_IGNORED);
+        }
     }
 
     @Override
     public boolean isActionActive(Anomaly anomaly) {
-        final int mode = mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
-                        anomaly.packageName);
-        return mode != AppOpsManager.MODE_IGNORED && mode != AppOpsManager.MODE_ERRORED;
+        return !mBatteryUtils.isBackgroundRestrictionEnabled(anomaly.targetSdkVersion, anomaly.uid,
+                anomaly.packageName);
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
new file mode 100644
index 0000000..dba221a
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
@@ -0,0 +1,63 @@
+/*
+ * 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.fuelgauge.anomaly.action;
+
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+
+/**
+ * Force stop and background check action for anomaly app, this action will
+ * 1. Force stop the app
+ * 2. Turn on background check
+ */
+public class StopAndBackgroundCheckAction extends AnomalyAction {
+    @VisibleForTesting
+    ForceStopAction mForceStopAction;
+    @VisibleForTesting
+    BackgroundCheckAction mBackgroundCheckAction;
+
+    public StopAndBackgroundCheckAction(Context context) {
+        this(context, new ForceStopAction(context), new BackgroundCheckAction(context));
+    }
+
+    @VisibleForTesting
+    StopAndBackgroundCheckAction(Context context, ForceStopAction forceStopAction,
+            BackgroundCheckAction backgroundCheckAction) {
+        super(context);
+        mForceStopAction = forceStopAction;
+        mBackgroundCheckAction = backgroundCheckAction;
+    }
+
+    @Override
+    public void handlePositiveAction(Anomaly anomaly, int metricsKey) {
+        mForceStopAction.handlePositiveAction(anomaly, metricsKey);
+        mBackgroundCheckAction.handlePositiveAction(anomaly, metricsKey);
+    }
+
+    @Override
+    public boolean isActionActive(Anomaly anomaly) {
+        return mForceStopAction.isActionActive(anomaly)
+                && mBackgroundCheckAction.isActionActive(anomaly);
+    }
+
+    @Override
+    public int getActionType() {
+        return Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
index 4281743..f66c61c 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
@@ -42,24 +42,21 @@
     private static final String TAG = "BluetoothScanAnomalyDetector";
     @VisibleForTesting
     BatteryUtils mBatteryUtils;
-    @VisibleForTesting
-    AnomalyAction mAnomalyAction;
     private long mBluetoothScanningThreshold;
     private Context mContext;
+    private AnomalyUtils mAnomalyUtils;
 
     public BluetoothScanAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context),
-                AnomalyUtils.getInstance(context).getAnomalyAction(
-                        Anomaly.AnomalyType.BLUETOOTH_SCAN));
+        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
     }
 
     @VisibleForTesting
     BluetoothScanAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
-            AnomalyAction anomalyAction) {
+            AnomalyUtils anomalyUtils) {
         mContext = context;
         mBatteryUtils = BatteryUtils.getInstance(context);
-        mAnomalyAction = anomalyAction;
         mBluetoothScanningThreshold = policy.bluetoothScanThreshold;
+        mAnomalyUtils = anomalyUtils;
     }
 
     @Override
@@ -98,7 +95,7 @@
                         .setPackageName(packageName)
                         .build();
 
-                if (mAnomalyAction.isActionActive(anomaly)) {
+                if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
                     anomalies.add(anomaly);
                 }
             }
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
index 5fa0e41..959ceb5 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
@@ -29,7 +29,6 @@
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
 import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,27 +38,25 @@
  */
 public class WakeLockAnomalyDetector implements AnomalyDetector {
     private static final String TAG = "WakeLockAnomalyChecker";
-    private PackageManager mPackageManager;
-    private Context mContext;
     @VisibleForTesting
     BatteryUtils mBatteryUtils;
     @VisibleForTesting
     long mWakeLockThresholdMs;
-    @VisibleForTesting
-    AnomalyAction mAnomalyAction;
+    private PackageManager mPackageManager;
+    private Context mContext;
+    private AnomalyUtils mAnomalyUtils;
 
     public WakeLockAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context));
+        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
     }
 
     @VisibleForTesting
-    WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
+    WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
+            AnomalyUtils anomalyUtils) {
         mContext = context;
         mPackageManager = context.getPackageManager();
         mBatteryUtils = BatteryUtils.getInstance(context);
-        mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
-                Anomaly.AnomalyType.WAKE_LOCK);
-
+        mAnomalyUtils = anomalyUtils;
         mWakeLockThresholdMs = policy.wakeLockThreshold;
     }
 
@@ -94,15 +91,20 @@
                 final String packageName = mBatteryUtils.getPackageName(uid.getUid());
                 final CharSequence displayName = Utils.getApplicationLabel(mContext,
                         packageName);
+                final int targetSdkVersion = mBatteryUtils.getTargetSdkVersion(packageName);
 
                 Anomaly anomaly = new Anomaly.Builder()
                         .setUid(uid.getUid())
                         .setType(Anomaly.AnomalyType.WAKE_LOCK)
                         .setDisplayName(displayName)
                         .setPackageName(packageName)
+                        .setTargetSdkVersion(targetSdkVersion)
+                        .setBackgroundRestrictionEnabled(
+                                mBatteryUtils.isBackgroundRestrictionEnabled(targetSdkVersion,
+                                        uid.getUid(), packageName))
                         .build();
 
-                if (mAnomalyAction.isActionActive(anomaly)) {
+                if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
                     anomalies.add(anomaly);
                 }
             }
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
index 55686e0..f6ff7aa 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
@@ -41,21 +41,20 @@
     private static final String TAG = "WakeupAlarmAnomalyDetector";
     @VisibleForTesting
     BatteryUtils mBatteryUtils;
-    @VisibleForTesting
-    AnomalyAction mAnomalyAction;
     private long mWakeupAlarmThreshold;
     private Context mContext;
+    private AnomalyUtils mAnomalyUtils;
 
     public WakeupAlarmAnomalyDetector(Context context) {
-        this(context, new AnomalyDetectionPolicy(context));
+        this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
     }
 
     @VisibleForTesting
-    WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
+    WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
+            AnomalyUtils anomalyUtils) {
         mContext = context;
         mBatteryUtils = BatteryUtils.getInstance(context);
-        mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
-                Anomaly.AnomalyType.WAKEUP_ALARM);
+        mAnomalyUtils = anomalyUtils;
         mWakeupAlarmThreshold = policy.wakeupAlarmThreshold;
     }
 
@@ -98,7 +97,7 @@
                             .setPackageName(packageName)
                             .build();
 
-                    if (mAnomalyAction.isActionActive(anomaly)) {
+                    if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
                         anomalies.add(anomaly);
                     }
                 }
diff --git a/src/com/android/settings/gestures/AssistGesturePreferenceController.java b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
index ede20c2..a3d4ec1 100644
--- a/src/com/android/settings/gestures/AssistGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
@@ -65,9 +65,12 @@
     public void displayPreference(PreferenceScreen screen) {
         mScreen = screen;
         mPreference = screen.findPreference(getPreferenceKey());
+        if (!mFeatureProvider.isSensorAvailable(mContext)) {
+            removePreference(mScreen, getPreferenceKey());
+            return;
+        }
         if (!mFeatureProvider.isSupported(mContext)) {
             mScreen.removePreference(mPreference);
-            removePreference(mScreen, getPreferenceKey());
             return;
         }
         // Call super last or AbstractPreferenceController might remove the preference from the
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index b646360..0f50375 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -30,6 +30,7 @@
 import android.content.Intent;
 import android.content.res.Resources.Theme;
 import android.graphics.Insets;
+import android.graphics.Typeface;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -204,7 +205,7 @@
         private Stage mUiStage = Stage.Introduction;
         private PasswordRequirementAdapter mPasswordRequirementAdapter;
         private GlifLayout mLayout;
-        private boolean mForFingerprint;
+        protected boolean mForFingerprint;
 
         private String mFirstPin;
         private RecyclerView mPasswordRestrictionView;
@@ -375,6 +376,10 @@
             int currentType = mPasswordEntry.getInputType();
             mPasswordEntry.setInputType(mIsAlphaMode ? currentType
                     : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
+            // Can't set via XML since setInputType resets the fontFamily to null
+            mPasswordEntry.setTypeface(Typeface.create(
+                    getContext().getString(com.android.internal.R.string.config_headlineFontFamily),
+                    Typeface.NORMAL));
 
             Intent intent = getActivity().getIntent();
             final boolean confirmCredentials = intent.getBooleanExtra(
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index f48ec96..853ab36 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -20,6 +20,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Typeface;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.CountDownTimer;
@@ -172,6 +173,10 @@
             int currentType = mPasswordEntry.getInputType();
             mPasswordEntry.setInputType(mIsAlpha ? currentType
                     : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
+            // Can't set via XML since setInputType resets the fontFamily to null
+            mPasswordEntry.setTypeface(Typeface.create(
+                    getContext().getString(com.android.internal.R.string.config_headlineFontFamily),
+                    Typeface.NORMAL));
             mAppearAnimationUtils = new AppearAnimationUtils(getContext(),
                     220, 2f /* translationScale */, 1f /* delayScale*/,
                     AnimationUtils.loadInterpolator(getContext(),
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index f23ab6d..8a7028e 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -77,7 +77,11 @@
         public void onViewCreated(View view, Bundle savedInstanceState) {
             super.onViewCreated(view, savedInstanceState);
 
-            mCancelButton.setText(R.string.skip_label);
+            if (mForFingerprint) {
+                mCancelButton.setVisibility(View.GONE);
+            } else {
+                mCancelButton.setText(R.string.skip_label);
+            }
 
             boolean showOptionsButton = getActivity().getIntent().getBooleanExtra(
                     ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java
index 4ab1af2..6c08e3d 100644
--- a/src/com/android/settings/widget/SeekBarPreference.java
+++ b/src/com/android/settings/widget/SeekBarPreference.java
@@ -135,6 +135,10 @@
         }
     }
 
+    public int getMax() {
+        return mMax;
+    }
+
     public void setProgress(int progress) {
         setProgress(progress, true);
     }
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index a570361..e20a435 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -18,6 +18,7 @@
 
 
 import android.app.AlertDialog;
+import android.app.AppOpsManager;
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.app.admin.DevicePolicyManager;
@@ -113,6 +114,8 @@
     private BatteryUtils mBatteryUtils;
     @Mock
     private LoaderManager mLoaderManager;
+    @Mock
+    private AppOpsManager mAppOpsManager;
 
     private FakeFeatureFactory mFeatureFactory;
     private InstalledAppDetails mAppDetail;
@@ -138,6 +141,7 @@
         doReturn(mActivity).when(mAppDetail).getActivity();
         doReturn(mShadowContext).when(mAppDetail).getContext();
         doReturn(mPackageManager).when(mActivity).getPackageManager();
+        doReturn(mAppOpsManager).when(mActivity).getSystemService(Context.APP_OPS_SERVICE);
 
         // Default to not considering any apps to be instant (individual tests can override this).
         ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
index f2dc851..7af2b85 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
@@ -18,25 +18,30 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
 import android.widget.Button;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowBluetoothDevice;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.robolectric.annotation.Config;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
-        shadows=SettingsShadowBluetoothDevice.class)
+        shadows = SettingsShadowBluetoothDevice.class)
 public class BluetoothDetailsButtonsControllerTest extends BluetoothDetailsControllerTestBase {
     private BluetoothDetailsButtonsController mController;
     private LayoutPreference mLayoutPreference;
@@ -125,13 +130,21 @@
     }
 
     @Test
-    public void forget() {
+    public void forgetDialog() {
         showScreen(mController);
+        FragmentManager fragmentManager = mock(FragmentManager.class);
+        when(mFragment.getFragmentManager()).thenReturn(fragmentManager);
+        FragmentTransaction ft = mock(FragmentTransaction.class);
+        when(fragmentManager.beginTransaction()).thenReturn(ft);
         mRightButton.callOnClick();
-        verify(mCachedDevice).unpair();
-        verify(mActivity).finish();
-    }
 
+        ArgumentCaptor<ForgetDeviceDialogFragment> dialogCaptor =
+                ArgumentCaptor.forClass(ForgetDeviceDialogFragment.class);
+        verify(ft).add(dialogCaptor.capture(), anyString());
+
+        ForgetDeviceDialogFragment dialogFragment = dialogCaptor.getValue();
+        assertThat(dialogFragment).isNotNull();
+    }
 
     @Test
     public void startsOutBusy() {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
new file mode 100644
index 0000000..21bc868
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ForgetDeviceDialogFragmentTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private CachedBluetoothDevice mCachedDevice;
+
+    private ForgetDeviceDialogFragment mFragment;
+    private Context mContext;
+    private Activity mActivity;
+    private AlertDialog mDialog;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        FakeFeatureFactory.setupForTest(mContext);
+        String deviceAddress = "55:66:77:88:99:AA";
+        when(mCachedDevice.getAddress()).thenReturn(deviceAddress);
+        mFragment = spy(ForgetDeviceDialogFragment.newInstance(deviceAddress));
+        doReturn(mCachedDevice).when(mFragment).getDevice(any());
+        mActivity = Robolectric.setupActivity(Activity.class);
+        mActivity.getFragmentManager().beginTransaction().add(mFragment, null).commit();
+        mDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+
+    @Test
+    public void cancelDialog() {
+        mDialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick();
+        verify(mCachedDevice, never()).unpair();
+        assertThat(mActivity.isFinishing()).isFalse();
+    }
+
+    @Test
+    public void confirmDialog() {
+        mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+        verify(mCachedDevice).unpair();
+        assertThat(mActivity.isFinishing()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 5c18670..0d6a4d7 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -298,19 +298,19 @@
     @Test
     public void settingUserIdAppliesNewIcons() {
         StorageItemPreference audio = spy(new StorageItemPreference(mContext));
-        audio.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        audio.setIcon(R.drawable.ic_media_stream);
         StorageItemPreference video = spy(new StorageItemPreference(mContext));
-        video.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        video.setIcon(R.drawable.ic_local_movies);
         StorageItemPreference image = spy(new StorageItemPreference(mContext));
-        image.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        image.setIcon(R.drawable.ic_photo_library);
         StorageItemPreference games = spy(new StorageItemPreference(mContext));
-        games.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        games.setIcon(R.drawable.ic_videogame_vd_theme_24);
         StorageItemPreference apps = spy(new StorageItemPreference(mContext));
-        apps.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        apps.setIcon(R.drawable.ic_storage_apps);
         StorageItemPreference system = spy(new StorageItemPreference(mContext));
-        system.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        system.setIcon(R.drawable.ic_system_update_vd_theme_24);
         StorageItemPreference files = spy(new StorageItemPreference(mContext));
-        files.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        files.setIcon(R.drawable.ic_folder_vd_theme_24);
         PreferenceScreen screen = mock(PreferenceScreen.class);
         when(screen.findPreference(
                 eq(StorageItemPreferenceController.AUDIO_KEY))).thenReturn(audio);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 0cabb05..7f2aeb6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,6 +30,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.Activity;
+import android.app.AppOpsManager;
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.content.Context;
@@ -116,6 +117,8 @@
     @Mock
     private PackageManager mPackageManager;
     @Mock
+    private AppOpsManager mAppOpsManager;
+    @Mock
     private LoaderManager mLoaderManager;
     @Mock
     private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
@@ -184,6 +187,7 @@
 
         mTestActivity = spy(new SettingsActivity());
         doReturn(mPackageManager).when(mTestActivity).getPackageManager();
+        doReturn(mAppOpsManager).when(mTestActivity).getSystemService(Context.APP_OPS_SERVICE);
 
         final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java
deleted file mode 100644
index f04b3b8..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.fuelgauge;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.UserManager;
-
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class BatteryStatsHelperLoaderTest {
-    @Mock
-    private BatteryStatsHelper mBatteryStatsHelper;
-    @Mock
-    private Bundle mBundle;
-    @Mock
-    private Context mContext;
-    @Mock
-    private UserManager mUserManager;
-    private BatteryStatsHelperLoader mLoader;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mLoader = new BatteryStatsHelperLoader(mContext, mBundle);
-        mLoader.mUserManager = mUserManager;
-    }
-
-    @Test
-    public void testInitBatteryStatsHelper_init() {
-        mLoader.initBatteryStatsHelper(mBatteryStatsHelper);
-
-        verify(mBatteryStatsHelper).create(mBundle);
-        verify(mBatteryStatsHelper).refreshStats(BatteryStats.STATS_SINCE_CHARGED,
-                mUserManager.getUserProfiles());
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index e2c6f6d..aa19055 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -15,10 +15,16 @@
  */
 package com.android.settings.fuelgauge;
 
+import android.app.AppOpsManager;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.os.BatteryStats;
+import android.os.Bundle;
+import android.os.Build;
 import android.os.Process;
 import android.os.SystemClock;
+import android.os.UserManager;
 import android.text.format.DateUtils;
 
 import com.android.internal.os.BatterySipper;
@@ -56,7 +62,9 @@
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.spy;
 
@@ -93,6 +101,8 @@
     private static final int DISCHARGE_AMOUNT = 80;
     private static final double PERCENT_SYSTEM_USAGE = 60;
     private static final double PRECISION = 0.001;
+    private static final int SDK_VERSION = Build.VERSION_CODES.L;
+    private static final String PACKAGE_NAME = "com.android.app";
 
     @Mock
     private BatteryStats.Uid mUid;
@@ -116,6 +126,16 @@
     private BatterySipper mCellBatterySipper;
     @Mock
     private BatterySipper mIdleBatterySipper;
+    @Mock
+    private Bundle mBundle;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private AppOpsManager mAppOpsManager;
+    @Mock
+    private ApplicationInfo mApplicationInfo;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -170,10 +190,11 @@
         mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE;
         mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE;
 
-        mBatteryUtils = BatteryUtils.getInstance(RuntimeEnvironment.application);
+        final Context shadowContext = spy(RuntimeEnvironment.application);
+        doReturn(mPackageManager).when(shadowContext).getPackageManager();
+        doReturn(mAppOpsManager).when(shadowContext).getSystemService(Context.APP_OPS_SERVICE);
+        mBatteryUtils = spy(new BatteryUtils(shadowContext));
         mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
-
-        mBatteryUtils = spy(new BatteryUtils(RuntimeEnvironment.application));
     }
 
     @Test
@@ -385,6 +406,44 @@
                 TIME_SINCE_LAST_FULL_CHARGE_US);
     }
 
+    @Test
+    public void testGetTargetSdkVersion_packageExist_returnSdk() throws
+            PackageManager.NameNotFoundException {
+        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
+                PackageManager.GET_META_DATA);
+        mApplicationInfo.targetSdkVersion = SDK_VERSION;
+
+        assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(SDK_VERSION);
+    }
+
+    @Test
+    public void testGetTargetSdkVersion_packageNotExist_returnSdkNull() throws
+            PackageManager.NameNotFoundException {
+        doThrow(new PackageManager.NameNotFoundException()).when(
+                mPackageManager).getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
+
+        assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(
+                BatteryUtils.SDK_NULL);
+    }
+
+    @Test
+    public void testBackgroundRestrictionOn_restrictionOn_returnTrue() {
+        doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
+                AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+
+        assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+                PACKAGE_NAME)).isTrue();
+    }
+
+    @Test
+    public void testBackgroundRestrictionOn_restrictionOff_returnFalse() {
+        doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(
+                AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+
+        assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+                PACKAGE_NAME)).isFalse();
+    }
+
     private BatterySipper createTestSmearBatterySipper(long topTime,
             double totalPowerMah, int uidCode, boolean isUidNull) {
         final BatterySipper sipper = mock(BatterySipper.class);
@@ -401,4 +460,13 @@
 
         return sipper;
     }
+
+    @Test
+    public void testInitBatteryStatsHelper_init() {
+        mBatteryUtils.initBatteryStatsHelper(mBatteryStatsHelper, mBundle, mUserManager);
+
+        verify(mBatteryStatsHelper).create(mBundle);
+        verify(mBatteryStatsHelper).refreshStats(BatteryStats.STATS_SINCE_CHARGED,
+                mUserManager.getUserProfiles());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
index e8e4bab..1111804 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -27,6 +28,7 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.os.Build;
 
 import com.android.settings.R;
 import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
@@ -57,6 +59,7 @@
     private AnomalyAction mAnomalyAction;
     private Anomaly mWakeLockAnomaly;
     private Anomaly mWakeupAlarmAnomaly;
+    private Anomaly mWakeupAlarmAnomaly2;
     private Anomaly mBluetoothAnomaly;
     private AnomalyDialogFragment mAnomalyDialogFragment;
     private Context mContext;
@@ -78,6 +81,13 @@
                 .setPackageName(PACKAGE_NAME)
                 .setDisplayName(DISPLAY_NAME)
                 .build();
+        mWakeupAlarmAnomaly2 = new Anomaly.Builder()
+                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+                .setUid(UID)
+                .setPackageName(PACKAGE_NAME)
+                .setDisplayName(DISPLAY_NAME)
+                .setTargetSdkVersion(Build.VERSION_CODES.O)
+                .build();
         mBluetoothAnomaly = new Anomaly.Builder()
                 .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
                 .setUid(UID)
@@ -116,7 +126,7 @@
     }
 
     @Test
-    public void testOnCreateDialog_wakeupAlarmAnomaly_fireBackgroundCheckDialog() {
+    public void testOnCreateDialog_wakeupAlarmAnomalyPriorO_fireStopAndBackgroundCheckDialog() {
         mAnomalyDialogFragment = AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly,
                 0 /* metricskey */);
 
@@ -137,11 +147,32 @@
     }
 
     @Test
+    public void testOnCreateDialog_wakeupAlarmAnomalyTargetingO_fireForceStopDialog() {
+        mAnomalyDialogFragment = AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly2,
+                0 /* metricskey */);
+
+        FragmentTestUtil.startFragment(mAnomalyDialogFragment);
+
+        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        ShadowAlertDialog shadowDialog = shadowOf(dialog);
+
+        assertThat(shadowDialog.getMessage()).isEqualTo(
+                mContext.getString(R.string.dialog_stop_message_wakeup_alarm,
+                        mWakeLockAnomaly.displayName));
+        assertThat(shadowDialog.getTitle()).isEqualTo(
+                mContext.getString(R.string.dialog_stop_title));
+        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
+                mContext.getString(R.string.dialog_stop_ok));
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
+                mContext.getString(R.string.dlg_cancel));
+    }
+
+    @Test
     public void testOnCreateDialog_bluetoothAnomaly_fireLocationCheckDialog() {
         mAnomalyDialogFragment = spy(AnomalyDialogFragment.newInstance(mBluetoothAnomaly,
                 0 /* metricskey */));
         mAnomalyDialogFragment.mAnomalyUtils = mAnomalyUtils;
-        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(anyInt());
+        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
         doNothing().when(mAnomalyDialogFragment).initAnomalyUtils();
         doReturn(Anomaly.AnomalyActionType.LOCATION_CHECK).when(mAnomalyAction).getActionType();
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
index 55b8308..759f0fd 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.os.Build;
+
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
@@ -30,6 +32,7 @@
 public class AnomalyTest {
     private static int TYPE = Anomaly.AnomalyType.WAKE_LOCK;
     private static int UID = 111;
+    private static int SDK_VERSION = Build.VERSION_CODES.L;
     private static long WAKE_LOCK_TIME_MS = 1500;
     private static String PACKAGE_NAME = "com.android.settings";
     private static String DISPLAY_NAME = "settings";
@@ -42,6 +45,8 @@
                 .setWakeLockTimeMs(WAKE_LOCK_TIME_MS)
                 .setPackageName(PACKAGE_NAME)
                 .setDisplayName(DISPLAY_NAME)
+                .setTargetSdkVersion(SDK_VERSION)
+                .setBackgroundRestrictionEnabled(true)
                 .build();
 
         assertThat(anomaly.type).isEqualTo(TYPE);
@@ -49,5 +54,7 @@
         assertThat(anomaly.wakelockTimeMs).isEqualTo(WAKE_LOCK_TIME_MS);
         assertThat(anomaly.packageName).isEqualTo(PACKAGE_NAME);
         assertThat(anomaly.displayName).isEqualTo(DISPLAY_NAME);
+        assertThat(anomaly.targetSdkVersion).isEqualTo(SDK_VERSION);
+        assertThat(anomaly.backgroundRestrictionEnabled).isTrue();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
index 15bca7e..8cd5a06 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
@@ -18,9 +18,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.os.Build;
+
+import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-import com.android.settings.fuelgauge.anomaly.action.BackgroundCheckAction;
 import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
 import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
 import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl;
@@ -45,23 +47,52 @@
 
     @Test
     public void testGetAnomalyAction_typeWakeLock_returnForceStop() {
-        assertThat(mAnomalyUtils.getAnomalyAction(Anomaly.AnomalyType.WAKE_LOCK)).isInstanceOf(
+        Anomaly anomaly = new Anomaly.Builder()
+                .setType(Anomaly.AnomalyType.WAKE_LOCK)
+                .build();
+        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
                 ForceStopAction.class);
     }
 
     @Test
-    public void testGetAnomalyAction_typeWakeUpAlarm_returnBackgroundCheck() {
-        assertThat(mAnomalyUtils.getAnomalyAction(Anomaly.AnomalyType.WAKEUP_ALARM)).isInstanceOf(
-                BackgroundCheckAction.class);
-    }
-
-    @Test
     public void testGetAnomalyDetector_typeWakeLock_returnWakeLockDetector() {
         assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKE_LOCK)).isInstanceOf(
                 WakeLockAnomalyDetector.class);
     }
 
     @Test
+    public void testGetAnomalyAction_typeWakeUpAlarmTargetO_returnForceStop() {
+        Anomaly anomaly = new Anomaly.Builder()
+                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+                .setTargetSdkVersion(Build.VERSION_CODES.O)
+                .build();
+        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+                ForceStopAction.class);
+    }
+
+    @Test
+    public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOff_returnStopAndBackground() {
+        Anomaly anomaly = new Anomaly.Builder()
+                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+                .setTargetSdkVersion(Build.VERSION_CODES.L)
+                .setBackgroundRestrictionEnabled(false)
+                .build();
+        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+                StopAndBackgroundCheckAction.class);
+    }
+
+    @Test
+    public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOn_returnForceStop() {
+        Anomaly anomaly = new Anomaly.Builder()
+                .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+                .setTargetSdkVersion(Build.VERSION_CODES.L)
+                .setBackgroundRestrictionEnabled(true)
+                .build();
+        assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+                ForceStopAction.class);
+    }
+
+    @Test
     public void testGetAnomalyDetector_typeWakeUpAlarm_returnWakeUpAlarmDetector() {
         assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKEUP_ALARM)).isInstanceOf(
                 WakeupAlarmAnomalyDetector.class);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
index ae783ab..e2b8656 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
@@ -23,7 +23,9 @@
 
 import android.app.AppOpsManager;
 import android.content.Context;
+import android.os.Build;
 
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
@@ -42,11 +44,14 @@
 public class BackgroundCheckActionTest {
     private static final String PACKAGE_NAME = "com.android.app";
     private static final int UID = 111;
+    private static final int SDK_VERSION = Build.VERSION_CODES.L;
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
     @Mock
-    private AppOpsManager mAppOpsManagerr;
+    private AppOpsManager mAppOpsManager;
+    @Mock
+    private BatteryUtils mBatteryUtils;
     private Anomaly mAnomaly;
     private BackgroundCheckAction mBackgroundCheckAction;
 
@@ -55,35 +60,37 @@
         MockitoAnnotations.initMocks(this);
 
         FakeFeatureFactory.setupForTest(mContext);
-        doReturn(mAppOpsManagerr).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
+        doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
 
         mAnomaly = new Anomaly.Builder()
                 .setUid(UID)
                 .setPackageName(PACKAGE_NAME)
+                .setTargetSdkVersion(SDK_VERSION)
                 .build();
         mBackgroundCheckAction = new BackgroundCheckAction(mContext);
+        mBackgroundCheckAction.mBatteryUtils = mBatteryUtils;
     }
 
     @Test
     public void testHandlePositiveAction_forceStopPackage() {
         mBackgroundCheckAction.handlePositiveAction(mAnomaly, 0 /* metricskey */);
 
-        verify(mAppOpsManagerr).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME,
+        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME,
                 AppOpsManager.MODE_IGNORED);
     }
 
     @Test
     public void testIsActionActive_modeAllowed_returnTrue() {
-        doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManagerr).checkOpNoThrow(
-                AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+        doReturn(false).when(mBatteryUtils).isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+                PACKAGE_NAME);
 
         assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isTrue();
     }
 
     @Test
     public void testIsActionActive_modeIgnored_returnFalse() {
-        doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManagerr).checkOpNoThrow(
-                AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+        doReturn(true).when(mBatteryUtils).isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+                PACKAGE_NAME);
 
         assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
new file mode 100644
index 0000000..c06bddd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.fuelgauge.anomaly.action;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class StopAndBackgroundActionTest {
+    private static final String PACKAGE_NAME = "com.android.app";
+    private static final int UID = 111;
+    private static final int METRICS_KEY = 3;
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private BackgroundCheckAction mBackgroundCheckAction;
+    @Mock
+    private ForceStopAction mForceStopAction;
+    private StopAndBackgroundCheckAction mStopAndBackgroundCheckAction;
+    private Anomaly mAnomaly;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mAnomaly = new Anomaly.Builder()
+                .setUid(UID)
+                .setPackageName(PACKAGE_NAME)
+                .build();
+
+        FakeFeatureFactory.setupForTest(mContext);
+        mStopAndBackgroundCheckAction = new StopAndBackgroundCheckAction(mContext, mForceStopAction,
+                mBackgroundCheckAction);
+    }
+
+    @Test
+    public void testHandlePositiveAction_stopAndBackgroundCheck() {
+        mStopAndBackgroundCheckAction.handlePositiveAction(mAnomaly, METRICS_KEY);
+
+        verify(mBackgroundCheckAction).handlePositiveAction(mAnomaly, METRICS_KEY);
+        verify(mForceStopAction).handlePositiveAction(mAnomaly, METRICS_KEY);
+    }
+
+    @Test
+    public void testIsActionActive_restrictionEnabled_returnFalse() {
+        doReturn(true).when(mForceStopAction).isActionActive(mAnomaly);
+
+        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+    }
+
+    @Test
+    public void testIsActionActive_appNotRunning_returnFalse() {
+        doReturn(true).when(mBackgroundCheckAction).isActionActive(mAnomaly);
+
+        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+    }
+
+    @Test
+    public void testIsActionActive_appStoppedAndRestrictionOn_returnFalse() {
+        assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
index a687e2f..d21687c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
@@ -36,6 +36,7 @@
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
 import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -80,6 +81,8 @@
     private AnomalyDetectionPolicy mPolicy;
     @Mock
     private AnomalyAction mAnomalyAction;
+    @Mock
+    private AnomalyUtils mAnomalyUtils;
 
     private BluetoothScanAnomalyDetector mBluetoothScanAnomalyDetector;
     private Context mContext;
@@ -92,6 +95,7 @@
         mContext = spy(RuntimeEnvironment.application);
         ReflectionHelpers.setField(mPolicy, "bluetoothScanThreshold",
                 30 * DateUtils.MINUTE_IN_MILLIS);
+        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
 
         mAnomalySipper.uidObj = mAnomalyUid;
         doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
@@ -106,10 +110,9 @@
         mUsageList.add(mTargetSipper);
         doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
 
-        mBluetoothScanAnomalyDetector = spy(
-                new BluetoothScanAnomalyDetector(mContext, mPolicy, mAnomalyAction));
+        mBluetoothScanAnomalyDetector = spy(new BluetoothScanAnomalyDetector(mContext, mPolicy,
+                mAnomalyUtils));
         mBluetoothScanAnomalyDetector.mBatteryUtils = mBatteryUtils;
-        mBluetoothScanAnomalyDetector.mAnomalyAction = mAnomalyAction;
         doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
         doReturn(true).when(mAnomalyAction).isActionActive(any());
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
index 19ab7d6..f53e8a0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
@@ -34,6 +34,7 @@
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.fuelgauge.BatteryUtils;
@@ -92,6 +93,8 @@
     private AnomalyDetectionPolicy mPolicy;
     @Mock
     private AnomalyAction mAnomalyAction;
+    @Mock
+    private AnomalyUtils mAnomalyUtils;
 
     private WakeLockAnomalyDetector mWakelockAnomalyDetector;
     private Context mContext;
@@ -109,10 +112,11 @@
         doReturn(mApplicationInfo).when(mPackageManager)
                 .getApplicationInfo(nullable(String.class), anyInt());
         doReturn(true).when(mAnomalyAction).isActionActive(any());
+        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
 
-        mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
+        mWakelockAnomalyDetector = spy(
+                new WakeLockAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
         mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
-        mWakelockAnomalyDetector.mAnomalyAction = mAnomalyAction;
 
         mAnomalySipper.uidObj = mAnomalyUid;
         doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
index e7c2664..a16db6e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
@@ -33,6 +33,7 @@
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.fuelgauge.BatteryUtils;
@@ -89,6 +90,8 @@
     private AnomalyDetectionPolicy mPolicy;
     @Mock
     private AnomalyAction mAnomalyAction;
+    @Mock
+    private AnomalyUtils mAnomalyUtils;
 
     private WakeupAlarmAnomalyDetector mWakeupAlarmAnomalyDetector;
     private Context mContext;
@@ -105,6 +108,7 @@
         doReturn(RUNNING_TIME_MS).when(mBatteryUtils).calculateRunningTimeBasedOnStatsType(any(),
                 anyInt());
         doReturn(true).when(mAnomalyAction).isActionActive(any());
+        doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
 
         mAnomalySipper.uidObj = mAnomalyUid;
         doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
@@ -119,9 +123,9 @@
         mUsageList.add(mTargetSipper);
         doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
 
-        mWakeupAlarmAnomalyDetector = spy(new WakeupAlarmAnomalyDetector(mContext, mPolicy));
+        mWakeupAlarmAnomalyDetector = spy(
+                new WakeupAlarmAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
         mWakeupAlarmAnomalyDetector.mBatteryUtils = mBatteryUtils;
-        mWakeupAlarmAnomalyDetector.mAnomalyAction = mAnomalyAction;
     }
 
     @Test