Merge "Reload data if slice binding returns null at rendering time."
diff --git a/res/drawable/ic_find_in_page_24px.xml b/res/drawable/ic_find_in_page_24px.xml
new file mode 100644
index 0000000..18895e4
--- /dev/null
+++ b/res/drawable/ic_find_in_page_24px.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorControlNormal">
+  <path
+      android:fillColor="#FFFFFFFF"
+      android:pathData="M6,2C4.9,2 4.01,2.9 4.01,4L4,20c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2V8l-6,-6H6zM18,17.59l-2.2,-2.2c0.44,-0.69 0.7,-1.51 0.7,-2.39c0,-2.48 -2.02,-4.5 -4.5,-4.5S7.5,10.52 7.5,13s2.02,4.5 4.5,4.5c0.88,0 1.69,-0.26 2.39,-0.7l3.2,3.2L6,20V4h7.17L18,8.83V17.59zM12,15.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S13.38,15.5 12,15.5z"/>
+</vector>
diff --git a/res/layout/homepage_condition_half_tile.xml b/res/layout/homepage_condition_half_tile.xml
index fb83389..eff167a 100644
--- a/res/layout/homepage_condition_half_tile.xml
+++ b/res/layout/homepage_condition_half_tile.xml
@@ -61,6 +61,7 @@
             android:id="@+id/first_action"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:scrollbars="none"
             style="@style/ConditionHalfCardBorderlessButton"/>
 
     </LinearLayout>
diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml
index 8d81e82..75d449f 100644
--- a/res/layout/settings_homepage_container.xml
+++ b/res/layout/settings_homepage_container.xml
@@ -21,24 +21,17 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.google.android.material.appbar.AppBarLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@android:color/transparent"
-        app:elevation="0dp">
-        <include layout="@layout/search_bar"/>
-    </com.google.android.material.appbar.AppBarLayout>
-
     <androidx.core.widget.NestedScrollView
         android:id="@+id/main_content_scrollable_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+        app:layout_behavior="com.android.settings.widget.FloatingAppBarScrollingViewBehavior">
 
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
+            android:paddingTop="@dimen/app_bar_height"
             android:descendantFocusability="blocksDescendants">
 
             <FrameLayout
@@ -55,4 +48,10 @@
 
         </LinearLayout>
     </androidx.core.widget.NestedScrollView>
+
+    <com.google.android.material.appbar.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <include layout="@layout/search_bar"/>
+    </com.google.android.material.appbar.AppBarLayout>
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
index 99dba37..51189a0 100644
--- a/res/menu/manage_apps.xml
+++ b/res/menu/manage_apps.xml
@@ -16,6 +16,13 @@
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item
+        android:id="@+id/search_app_list_menu"
+        android:title="@string/search_settings"
+        android:icon="@drawable/ic_find_in_page_24px"
+        android:showAsAction="always|collapseActionView"
+        android:actionViewClass="android.widget.SearchView" />
+
+    <item
         android:id="@+id/advanced"
         android:title="@string/advanced_apps"
         android:icon="@drawable/ic_settings_24dp"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 33976a6..f95809e 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1077,11 +1077,18 @@
         <item>never</item>
     </string-array>
 
-    <string-array name="zen_mode_contacts_entries" translatable="false">
+    <string-array name="zen_mode_contacts_messages_entries" translatable="false">
         <item>@string/zen_mode_from_anyone</item>
         <item>@string/zen_mode_from_contacts</item>
         <item>@string/zen_mode_from_starred</item>
-        <item>@string/zen_mode_from_none</item>
+        <item>@string/zen_mode_from_none_calls</item>
+    </string-array>
+
+    <string-array name="zen_mode_contacts_calls_entries" translatable="false">
+        <item>@string/zen_mode_from_anyone</item>
+        <item>@string/zen_mode_from_contacts</item>
+        <item>@string/zen_mode_from_starred</item>
+        <item>@string/zen_mode_from_none_messages</item>
     </string-array>
 
     <string-array name="zen_mode_contacts_values" translatable="false">
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 752fd3d..86763b7 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -72,6 +72,14 @@
         <attr name="allowDynamicSummaryInSlice" format="boolean" />
     </declare-styleable>
 
+    <declare-styleable name="PreferenceScreen">
+        <!-- Determines if static preferences defined in addStaticPreferences are added before or after the radio buttons -->
+        <attr name="staticPreferenceLocation">
+            <enum name="prepend" value="0" />
+            <enum name="append" value="1" />
+        </attr>
+    </declare-styleable>
+
     <!-- For DotsPageIndicator -->
     <declare-styleable name="DotsPageIndicator">
         <attr name="dotDiameter" format="dimension" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 83848af..a6c6c37 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -105,6 +105,8 @@
     <dimen name="search_bar_avatar_size">32dp</dimen>
     <dimen name="search_bar_avatar_start_margin">4dp</dimen>
     <dimen name="search_bar_avatar_end_margin">16dp</dimen>
+    <!-- appbar height is equal search bar height (48dp) plus search bar top and bottom margin  -->
+    <dimen name="app_bar_height">80dp</dimen>
 
     <!-- Dimensions for Wifi Assistant Card -->
     <dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4aa0951..85f133f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -670,7 +670,7 @@
     <!-- check box cellular data title [CHAR LIMIT=30] -->
     <string name="cellular_data_title">Mobile data</string>
     <!-- check box Calls title [CHAR LIMIT=30] -->
-    <string name="calls_title">Calls</string>
+    <string name="calls_title">Allow calls</string>
     <!-- check box SMS Messges title [CHAR LIMIT=30] -->
     <string name="sms_messages_title">SMS messages</string>
     <!-- check box cellular data summary [CHAR LIMIT=85] -->
@@ -5406,6 +5406,12 @@
     <!-- Battery saver: Label for preference to turn on battery saver automatically when battery is low [CHAR_LIMIT=40] -->
     <string name="battery_saver_auto_title">Turn on automatically</string>
 
+    <!-- Battery saver: Label for preference to indicate there is no battery saver schedule [CHAR_LIMIT=40] -->
+    <string name="battery_saver_auto_no_schedule">No schedule</string>
+
+    <!-- Battery saver: Title for battery saver schedule screen [CHAR_LIMIT=40] -->
+    <string name="battery_saver_schedule_settings_title">Set a schedule</string>
+
     <!-- Battery saver: Label for seekbar to change battery saver threshold [CHAR_LIMIT=40] -->
     <string name="battery_saver_seekbar_title">At <xliff:g id="percent">%1$s</xliff:g></string>
 
@@ -7083,8 +7089,8 @@
 
     <!-- Sound: Summary for the Do not Disturb option when at least one automatic rules turned on. [CHAR LIMIT=NONE]-->
     <plurals name="zen_mode_settings_summary_on">
-        <item quantity="one">1 rule</item>
-        <item quantity="other"><xliff:g id="on_count" example="10">%d</xliff:g> rules</item>
+        <item quantity="one">1 enabled</item>
+        <item quantity="other"><xliff:g id="on_count" example="10">%d</xliff:g> enabled</item>
     </plurals>
 
     <!-- Sound: Title for the Do not Disturb option and associated settings page. [CHAR LIMIT=50]-->
@@ -7124,10 +7130,10 @@
     <string name="zen_mode_schedule_delete">Delete</string>
 
     <!--  Do not disturb: Title for the zen mode automatic rules page in settings. [CHAR LIMIT=30] -->
-    <string name="zen_mode_automation_settings_page_title">Do Not Disturb</string>
+    <string name="zen_mode_automation_settings_page_title">Schedules</string>
 
     <!--  Do not disturb: Title for a specific zen mode automatic rule in settings. [CHAR LIMIT=30] -->
-    <string name="zen_mode_automatic_rule_settings_page_title">Automatic rule</string>
+    <string name="zen_mode_automatic_rule_settings_page_title">Schedule</string>
 
     <!--  Do not disturb: Title do not disturb settings representing automatic (scheduled) do not disturb rules. [CHAR LIMIT=30] -->
     <string name="zen_mode_schedule_category_title">Schedule</string>
@@ -7142,7 +7148,7 @@
     <string name="zen_mode_schedule_title">Schedule</string>
 
     <!--  Do not disturb: Switch toggle to toggle whether to use an automatic dnd rule or not [CHAR LIMIT=40] -->
-    <string name="zen_mode_use_automatic_rule">Use rule</string>
+    <string name="zen_mode_use_automatic_rule">Use schedule</string>
 
     <!--  Do not disturb: Zen mode option: Important interruptions [CHAR LIMIT=60] -->
     <string name="zen_mode_option_important_interruptions">Priority only</string>
@@ -7166,7 +7172,7 @@
     <string name="zen_mode_settings_category">When Do Not Disturb is on</string>
 
     <!-- Do not disturb: restrict notifications title [CHAR LIMIT=80] -->
-    <string name="zen_mode_restrict_notifications_title">Notification restrictions</string>
+    <string name="zen_mode_restrict_notifications_title">Restrict notifications</string>
     <!-- Do not disturb: Mute notifications option [CHAR LIMIT=60] -->
     <string name="zen_mode_restrict_notifications_mute">No sound from notifications</string>
     <!-- Do not disturb:Mute notifications summary [CHAR LIMIT=NONE] -->
@@ -7272,7 +7278,7 @@
     <string name="zen_mode_sound_summary_on_with_info">On / <xliff:g name="dnd_summary" example="No sound except alarms and media">%1$s</xliff:g></string>
 
     <!-- Sound settings screen, summary format of do not disturb when off with extra information. [CHAR LIMIT=NONE] -->
-    <string name="zen_mode_sound_summary_off_with_info">Off / <xliff:g name="dnd_summary" example="1 rule can turn on automatically">%1$s</xliff:g></string>
+    <string name="zen_mode_sound_summary_off_with_info">Off / <xliff:g name="dnd_summary" example="1 schedule can turn on automatically">%1$s</xliff:g></string>
 
     <!-- Sound settings screen, summary format of do not disturb when off with no extra information. [CHAR LIMIT=NONE] -->
     <string name="zen_mode_sound_summary_off">Off</string>
@@ -7297,12 +7303,12 @@
 
     <!-- Summary for the Sound Do not Disturb option when at least one automatic rules is enabled. [CHAR LIMIT=NONE]-->
     <plurals name="zen_mode_sound_summary_summary_off_info">
-        <item quantity="one">1 rule can turn on automatically</item>
-        <item quantity="other"><xliff:g id="on_count" example="3">%d</xliff:g> rules can turn on automatically</item>
+        <item quantity="one">1 schedule can turn on automatically</item>
+        <item quantity="other"><xliff:g id="on_count" example="3">%d</xliff:g> schedules can turn on automatically</item>
     </plurals>
 
     <!-- Do not disturb settings, category header [CHAR LIMIT=120]-->
-    <string name="zen_category_behavior">Mute phone, but allow exceptions</string>
+    <string name="zen_category_behavior">Mute device but allow exceptions</string>
     <!-- Do not disturb settings, exceptions to dnd title [CHAR LIMIT=100]-->
     <string name="zen_category_exceptions">Exceptions</string>
     <!-- Do not disturb settings, category header [CHAR LIMIT=100]-->
@@ -7753,28 +7759,28 @@
     <string name="zen_mode_rule_rename_button">Rename</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Rule name option and edit dialog title -->
-    <string name="zen_mode_rule_name">Rule name</string>
+    <string name="zen_mode_rule_name">Schedule name</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Rule name hint text -->
-    <string name="zen_mode_rule_name_hint">Enter rule name</string>
+    <string name="zen_mode_rule_name_hint">Enter schedule name</string>
 
     <!-- [CHAR LIMIT=100] Zen mode settings: Warning text for invalid zen rule names -->
-    <string name="zen_mode_rule_name_warning">Rule name already in use</string>
+    <string name="zen_mode_rule_name_warning">Schedule name already in use</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Add another automatic zen rule option name-->
     <string name="zen_mode_add_rule">Add more</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Add event-based rule, set rule name title -->
-    <string name="zen_mode_add_event_rule">Add event rule</string>
+    <string name="zen_mode_add_event_rule">Add event schedule</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Add time-based rule, set rule name title -->
-    <string name="zen_mode_add_time_rule">Add time rule</string>
+    <string name="zen_mode_add_time_rule">Add time schedule</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Delete rule menu option name -->
-    <string name="zen_mode_delete_rule">Delete rule</string>
+    <string name="zen_mode_delete_rule">Delete schedule</string>
 
     <!-- [CHAR LIMIT=60] Zen mode settings: Choose rule type dialog title -->
-    <string name="zen_mode_choose_rule_type">Choose rule type</string>
+    <string name="zen_mode_choose_rule_type">Choose schedule type</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Delete rule dialog confirmation message -->
     <string name="zen_mode_delete_rule_confirmation">Delete \u201c<xliff:g id="rule" example="Weekends">%1$s</xliff:g>\u201d rule?</string>
@@ -7855,7 +7861,7 @@
     <string name="zen_mode_schedule_alarm_title">Alarm can override end time</string>
 
     <!-- [CHAR LIMIT=NONE] Zen mode settings: Downtime rule setting -->
-    <string name="zen_mode_schedule_alarm_summary">Stop at the end time or next alarm, whichever comes first</string>
+    <string name="zen_mode_schedule_alarm_summary">Schedule turns off when an alarm rings</string>
 
     <!-- [CHAR LIMIT=80] Zen mode settings: Title for preference to allow custom behavior for the dnd schedule -->
     <string name="zen_mode_custom_behavior_title">Do Not Disturb behavior</string>
@@ -7876,10 +7882,10 @@
     <string name="summary_range_verbal_combination"><xliff:g id="start" example="Sun">%1$s</xliff:g> to <xliff:g id="end" example="Thu">%2$s</xliff:g></string>
 
     <!-- [CHAR LIMIT=20] Zen mode settings: Calls option -->
-    <string name="zen_mode_calls">Calls</string>
+    <string name="zen_mode_calls">Allow calls</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Allow calls toggle title -->
-    <string name="zen_mode_calls_title">Allow calls</string>
+    <string name="zen_mode_calls_title">Calls</string>
 
     <!-- [CHAR LIMIT=20] Zen mode settings: Calls screen footer -->
     <string name="zen_mode_calls_footer">When Do Not Disturb is on, incoming calls are blocked. You can adjust settings to allow your friends, family, or other contacts to reach you.</string>
@@ -7894,25 +7900,13 @@
     </plurals>
 
     <!-- [CHAR LIMIT=20] Zen mode settings: Messages option -->
-    <string name="zen_mode_messages">Messages</string>
+    <string name="zen_mode_messages">Allow text messages</string>
 
     <!-- Do not disturb settings, messages, events and reminders footer [CHAR LIMIT=NONE]-->
     <string name="zen_mode_messages_footer">When Do Not Disturb is on, incoming text messages are blocked. You can adjust settings to allow your friends, family, or other contacts to reach you.</string>
 
-    <!-- [CHAR LIMIT=40] Zen mode settings: Allow messages toggle title -->
-    <string name="zen_mode_messages_title">Allow messages</string>
-
-    <!-- [CHAR LIMIT=50] Zen mode settings: All messages summary -->
-    <string name="zen_mode_all_messages">Messages</string>
-
-    <!-- [CHAR LIMIT=50] Zen mode settings: Messages option (ie: text messages) -->
-    <string name="zen_mode_all_messages_list">messages</string>
-
-    <!-- [CHAR LIMIT=50] Zen mode settings: Selected messages summary -->
-    <string name="zen_mode_selected_messages">Some messages</string>
-
-    <!-- [CHAR LIMIT=50] Zen mode settings: Selected messages (ie: some text messages are allowed to bypass dnd) -->
-    <string name="zen_mode_selected_messages_list">some messages</string>
+    <!-- [CHAR LIMIT=40] Zen mode settings: Allow messages to bypass DND title -->
+    <string name="zen_mode_messages_title">Text messages</string>
 
     <!-- [CHAR LIMIT=40] Zen mode settings: Calls or messages option value: From anyone -->
     <string name="zen_mode_from_anyone">From anyone</string>
@@ -7932,9 +7926,15 @@
     <!-- Do not disturb settings, calls summary [CHAR LIMIT=100]-->
     <string name="zen_calls_summary_repeat_only">From repeat callers only</string>
 
-    <!-- [CHAR LIMIT=40] Zen mode settings: Calls or messages option value: None -->
+    <!-- [CHAR LIMIT=40] Zen mode settings: Calls and/or messages from none-->
     <string name="zen_mode_from_none">None</string>
 
+    <!-- [CHAR LIMIT=40] Zen mode settings: Calls option value: No calls allowed -->
+    <string name="zen_mode_from_none_calls">Don\u2019t allow any calls</string>
+
+    <!-- [CHAR LIMIT=40] Zen mode settings: Messages option value: No messages allowed -->
+    <string name="zen_mode_from_none_messages">Don\u2019t allow any messages</string>
+
     <!-- [CHAR LIMIT=80] Zen mode settings: Allow alarms option -->
     <string name="zen_mode_alarms">Allow alarms</string>
 
@@ -7942,7 +7942,7 @@
     <string name="zen_mode_alarms_list">alarms</string>
 
     <!-- [CHAR LIMIT=80] Zen mode settings: Allow media (sound from video) to bypass dnd -->
-    <string name="zen_mode_media">Allow media</string>
+    <string name="zen_mode_media">Allow media sounds</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: Media (ie: sound from video) -->
     <string name="zen_mode_media_list">media</string>
@@ -7966,7 +7966,7 @@
     <string name="zen_mode_bypassing_apps">Allow apps to override</string>
 
     <!-- [CHAR LIMIT=100] Zen mode settings: Allow apps to bypass DND title-->
-    <string name="zen_mode_bypassing_apps_title">Overrides Do Not Disturb</string>
+    <string name="zen_mode_bypassing_apps_title">App exceptions</string>
 
     <!-- [CHAR LIMIT=80] Zen mode settings: Allow apps to bypass DND -->
     <plurals name="zen_mode_bypassing_apps_subtext">
@@ -7997,10 +7997,10 @@
     <string name="zen_mode_repeat_callers_title">Allow repeat callers</string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: calls summary -->
-    <string name="zen_mode_calls_summary_one">From <xliff:g id="caller type" example="contacts">%1$s</xliff:g></string>
+    <string name="zen_mode_calls_summary_one">Allow from <xliff:g id="caller type" example="contacts">%1$s</xliff:g></string>
 
     <!-- [CHAR LIMIT=50] Zen mode settings: calls summary -->
-    <string name="zen_mode_calls_summary_two">From <xliff:g id="caller type" example="starred contacts">%1$s</xliff:g> and <xliff:g id="callert tpye" example="repeat callers">%2$s</xliff:g></string>
+    <string name="zen_mode_calls_summary_two">Allow from <xliff:g id="caller type" example="starred contacts">%1$s</xliff:g> and <xliff:g id="callert tpye" example="repeat callers">%2$s</xliff:g></string>
 
     <!-- [CHAR LIMIT=200] Zen mode settings: Repeat callers option summary -->
     <string name="zen_mode_repeat_callers_summary">If the same person calls a second time within a <xliff:g id="minutes">%d</xliff:g> minute period</string>
diff --git a/res/xml/accessibility_content_timeout_settings.xml b/res/xml/accessibility_content_timeout_settings.xml
index d450449..2d9072b 100644
--- a/res/xml/accessibility_content_timeout_settings.xml
+++ b/res/xml/accessibility_content_timeout_settings.xml
@@ -17,27 +17,23 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:key="accessibility_content_timeout_preference"
     android:title="@string/accessibility_content_timeout_preference_title"
     android:persistent="false" >
 
     <com.android.settings.widget.VideoPreference
         android:key="accessibility_content_timeout_video"
-        app:animation="@raw/gesture_swipe_up"
-        app:preview="@drawable/gesture_swipe_up"
-        android:persistent="false" />
-
-    <Preference
-        android:key="accessibility_content_timeout_summary"
-        android:selectable="false"
-        android:enabled="true"
-        android:summary="@string/accessibility_content_timeout_preference_summary"
+        android:title="@string/summary_placeholder"
+        settings:animation="@raw/gesture_swipe_up"
+        settings:preview="@drawable/gesture_swipe_up"
+        settings:controller="com.android.settings.widget.VideoPreferenceController"
         android:persistent="false" />
 
     <com.android.settings.widget.RadioButtonPreference
         android:key="accessibility_content_timeout_default"
         android:title="@string/accessibility_timeout_default"
+        settings:allowDividerAbove="true"
         android:persistent="false" />
 
     <com.android.settings.widget.RadioButtonPreference
@@ -60,4 +56,8 @@
         android:title="@string/accessibility_timeout_2mins"
         android:persistent="false" />
 
+    <com.android.settingslib.widget.FooterPreference
+        android:title="@string/accessibility_content_timeout_preference_summary"
+        android:selectable="false" />
+
 </PreferenceScreen>
diff --git a/res/xml/accessibility_control_timeout_settings.xml b/res/xml/accessibility_control_timeout_settings.xml
index 6d8e1d0..ea8d8c6 100644
--- a/res/xml/accessibility_control_timeout_settings.xml
+++ b/res/xml/accessibility_control_timeout_settings.xml
@@ -17,27 +17,23 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:key="accessibility_control_timeout_preference"
     android:title="@string/accessibility_control_timeout_preference_title"
     android:persistent="false" >
 
     <com.android.settings.widget.VideoPreference
         android:key="accessibility_control_timeout_video"
-        app:animation="@raw/gesture_swipe_up"
-        app:preview="@drawable/gesture_swipe_up"
-        android:persistent="false" />
-
-    <Preference
-        android:key="accessibility_control_timeout_summary"
-        android:selectable="false"
-        android:enabled="true"
-        android:summary="@string/accessibility_control_timeout_preference_summary"
+        android:title="@string/summary_placeholder"
+        settings:animation="@raw/gesture_swipe_up"
+        settings:preview="@drawable/gesture_swipe_up"
+        settings:controller="com.android.settings.widget.VideoPreferenceController"
         android:persistent="false" />
 
     <com.android.settings.widget.RadioButtonPreference
         android:key="accessibility_control_timeout_default"
         android:title="@string/accessibility_timeout_default"
+        settings:allowDividerAbove="true"
         android:persistent="false" />
 
     <com.android.settings.widget.RadioButtonPreference
@@ -60,4 +56,8 @@
         android:title="@string/accessibility_timeout_2mins"
         android:persistent="false" />
 
+    <com.android.settingslib.widget.FooterPreference
+        android:title="@string/accessibility_control_timeout_preference_summary"
+        android:selectable="false" />
+
 </PreferenceScreen>
diff --git a/res/xml/battery_saver_schedule_settings.xml b/res/xml/battery_saver_schedule_settings.xml
new file mode 100644
index 0000000..f91e4ca
--- /dev/null
+++ b/res/xml/battery_saver_schedule_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/battery_saver_schedule_settings_title"
+    settings:staticPreferenceLocation="append">
+</PreferenceScreen >
diff --git a/res/xml/network_and_internet_v2.xml b/res/xml/network_and_internet_v2.xml
index 680b268..974739d 100644
--- a/res/xml/network_and_internet_v2.xml
+++ b/res/xml/network_and_internet_v2.xml
@@ -21,13 +21,20 @@
     android:title="@string/network_dashboard_title"
     settings:initialExpandedChildrenCount="5">
 
+    <PreferenceCategory
+        android:key="multi_network_header"
+        settings:allowDividerBelow="true"
+        android:order="-40"
+        settings:controller="com.android.settings.network.MultiNetworkHeaderController"/>
+
     <com.android.settings.widget.MasterSwitchPreference
         android:fragment="com.android.settings.wifi.WifiSettings"
         android:key="toggle_wifi"
         android:title="@string/wifi_settings"
         android:summary="@string/summary_placeholder"
         android:icon="@drawable/ic_settings_wireless"
-        android:order="-30">
+        android:order="-30"
+        settings:allowDividerAbove="true">
         <intent
             android:action="android.settings.WIFI_SETTINGS"
             android:targetClass="Settings$WifiSettingsActivity" />
@@ -44,16 +51,15 @@
         settings:useAdminDisabledSummary="true">
     </com.android.settingslib.RestrictedPreference>
 
-    <com.android.settingslib.RestrictedPreference
-        android:fragment="com.android.settings.TetherSettings"
-        android:key="tether_settings"
-        android:title="@string/tether_settings_title_all"
-        android:icon="@drawable/ic_wifi_tethering"
+    <com.android.settingslib.RestrictedSwitchPreference
+        android:key="toggle_airplane"
+        android:title="@string/airplane_mode"
+        android:icon="@drawable/ic_airplanemode_active"
+        android:disableDependentsState="true"
         android:order="-5"
-        android:summary="@string/summary_placeholder"
-        settings:keywords="@string/keywords_hotspot_tethering"
-        settings:userRestriction="no_config_tethering"
-        settings:useAdminDisabledSummary="true" />
+        settings:controller="com.android.settings.network.AirplaneModePreferenceController"
+        settings:platform_slice="true"
+        settings:userRestriction="no_airplane_mode"/>
 
     <com.android.settingslib.RestrictedPreference
         android:key="manage_mobile_plan"
@@ -63,20 +69,16 @@
         settings:userRestriction="no_config_mobile_networks"
         settings:useAdminDisabledSummary="true" />
 
-    <com.android.settingslib.RestrictedSwitchPreference
-        android:key="toggle_airplane"
-        android:title="@string/airplane_mode"
-        android:icon="@drawable/ic_airplanemode_active"
-        android:disableDependentsState="true"
+    <com.android.settingslib.RestrictedPreference
+        android:fragment="com.android.settings.TetherSettings"
+        android:key="tether_settings"
+        android:title="@string/tether_settings_title_all"
+        android:icon="@drawable/ic_wifi_tethering"
         android:order="5"
-        settings:controller="com.android.settings.network.AirplaneModePreferenceController"
-        settings:platform_slice="true"
-        settings:userRestriction="no_airplane_mode"/>
-
-    <Preference
-        android:fragment="com.android.settings.ProxySelector"
-        android:key="proxy_settings"
-        android:title="@string/proxy_settings_title" />
+        android:summary="@string/summary_placeholder"
+        settings:keywords="@string/keywords_hotspot_tethering"
+        settings:userRestriction="no_config_tethering"
+        settings:useAdminDisabledSummary="true" />
 
     <com.android.settingslib.RestrictedPreference
         android:fragment="com.android.settings.vpn2.VpnSettings"
diff --git a/res/xml/zen_mode_calls_settings.xml b/res/xml/zen_mode_calls_settings.xml
index 74b6986..4616cf8 100644
--- a/res/xml/zen_mode_calls_settings.xml
+++ b/res/xml/zen_mode_calls_settings.xml
@@ -19,7 +19,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:key="zen_mode_calls_settings_page"
-    android:title="@string/zen_mode_calls" >
+    android:title="@string/zen_mode_calls_title" >
 
    <PreferenceCategory
        android:title="@string/zen_mode_settings_category"
@@ -27,8 +27,8 @@
       <!-- Calls -->
       <ListPreference
           android:key="zen_mode_calls"
-          android:title="@string/zen_mode_calls_title"
-          android:entries="@array/zen_mode_contacts_entries"
+          android:title="@string/zen_mode_calls"
+          android:entries="@array/zen_mode_contacts_calls_entries"
           android:entryValues="@array/zen_mode_contacts_values"/>
 
       <Preference
diff --git a/res/xml/zen_mode_messages_settings.xml b/res/xml/zen_mode_messages_settings.xml
index 4ca6c92..2d0129e 100644
--- a/res/xml/zen_mode_messages_settings.xml
+++ b/res/xml/zen_mode_messages_settings.xml
@@ -18,7 +18,7 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:key="zen_mode_messages_settings_page"
-    android:title="@string/zen_mode_messages" >
+    android:title="@string/zen_mode_messages_title" >
 
     <PreferenceCategory
         android:title="@string/zen_mode_settings_category"
@@ -26,8 +26,8 @@
         <!-- Messages -->
         <ListPreference
             android:key="zen_mode_messages"
-            android:title="@string/zen_mode_messages_title"
-            android:entries="@array/zen_mode_contacts_entries"
+            android:title="@string/zen_mode_messages"
+            android:entries="@array/zen_mode_contacts_messages_entries"
             android:entryValues="@array/zen_mode_contacts_values"/>
 
         <Preference
diff --git a/res/xml/zen_mode_sound_vibration_settings.xml b/res/xml/zen_mode_sound_vibration_settings.xml
index 30e2abb..73b5b05 100644
--- a/res/xml/zen_mode_sound_vibration_settings.xml
+++ b/res/xml/zen_mode_sound_vibration_settings.xml
@@ -27,13 +27,13 @@
         <!-- Calls -->
         <Preference
             android:key="zen_mode_calls_settings"
-            android:title="@string/zen_mode_calls_title"
+            android:title="@string/zen_mode_calls"
             android:fragment="com.android.settings.notification.ZenModeCallsSettings" />
 
         <!-- Messages -->
         <Preference
             android:key="zen_mode_messages_settings"
-            android:title="@string/zen_mode_messages_title"
+            android:title="@string/zen_mode_messages"
             android:fragment="com.android.settings.notification.ZenModeMessagesSettings" />
 
         <!-- Alarms -->
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 6b2fb91..c2db019 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -67,11 +67,14 @@
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.Filter;
 import android.widget.FrameLayout;
+import android.widget.SearchView;
 import android.widget.Spinner;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
+import androidx.annotation.WorkerThread;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
@@ -140,7 +143,7 @@
  * intent.
  */
 public class ManageApplications extends InstrumentedFragment
-        implements View.OnClickListener, OnItemSelectedListener {
+        implements View.OnClickListener, OnItemSelectedListener, SearchView.OnQueryTextListener {
 
     static final String TAG = "ManageApplications";
     static final boolean DEBUG = true;
@@ -196,6 +199,7 @@
 
     private View mListContainer;
     private RecyclerView mRecyclerView;
+    private SearchView mSearchView;
 
     // Size resource used for packages whose size computation failed for some reason
     CharSequence mInvalidSizeStr;
@@ -599,6 +603,13 @@
         mOptionsMenu = menu;
         inflater.inflate(R.menu.manage_apps, menu);
 
+        final MenuItem searchMenuItem = menu.findItem(R.id.search_app_list_menu);
+        if (searchMenuItem != null) {
+            mSearchView = (SearchView) searchMenuItem.getActionView();
+            mSearchView.setQueryHint(getText(R.string.search_settings));
+            mSearchView.setOnQueryTextListener(this);
+        }
+
         updateOptionsMenu();
     }
 
@@ -724,6 +735,17 @@
     public void onNothingSelected(AdapterView<?> parent) {
     }
 
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        return false;
+    }
+
+    @Override
+    public boolean onQueryTextChange(String newText) {
+        mApplications.filterSearch(newText);
+        return false;
+    }
+
     public void updateView() {
         updateOptionsMenu();
         final Activity host = getActivity();
@@ -859,6 +881,7 @@
 
         private AppFilterItem mAppFilter;
         private ArrayList<ApplicationsState.AppEntry> mEntries;
+        private ArrayList<ApplicationsState.AppEntry> mOriginalEntries;
         private boolean mResumed;
         private int mLastSortMode = -1;
         private int mWhichSize = SIZE_TOTAL;
@@ -866,6 +889,7 @@
         private boolean mHasReceivedLoadEntries;
         private boolean mHasReceivedBridgeCallback;
         private FileViewHolderController mExtraViewController;
+        private SearchFilter mSearchFilter;
 
         // This is to remember and restore the last scroll position when this
         // fragment is paused. We need this special handling because app entries are added gradually
@@ -1100,6 +1124,13 @@
             });
         }
 
+        public void filterSearch(String query) {
+            if (mSearchFilter == null) {
+                mSearchFilter = new SearchFilter();
+            }
+            mSearchFilter.filter(query);
+        }
+
         @VisibleForTesting
         static boolean shouldUseStableItemHeight(int listType) {
             return true;
@@ -1146,6 +1177,7 @@
                 entries = removeDuplicateIgnoringUser(entries);
             }
             mEntries = entries;
+            mOriginalEntries = entries;
             notifyDataSetChanged();
             if (getItemCount() == 0) {
                 mManageApplications.mRecyclerView.setVisibility(View.GONE);
@@ -1153,6 +1185,14 @@
             } else {
                 mManageApplications.mEmptyView.setVisibility(View.GONE);
                 mManageApplications.mRecyclerView.setVisibility(View.VISIBLE);
+
+                if (mManageApplications.mSearchView != null
+                        && mManageApplications.mSearchView.isVisibleToUser()) {
+                    final CharSequence query = mManageApplications.mSearchView.getQuery();
+                    if (!TextUtils.isEmpty(query)) {
+                        filterSearch(query.toString());
+                    }
+                }
             }
             // Restore the last scroll position if the number of entries added so far is bigger than
             // it.
@@ -1405,6 +1445,38 @@
                 }
             }
         }
+
+        /**
+         * An array filter that constrains the content of the array adapter with a substring.
+         * Item that does not contains the specified substring will be removed from the list.</p>
+         */
+        private class SearchFilter extends Filter {
+            @WorkerThread
+            @Override
+            protected FilterResults performFiltering(CharSequence query) {
+                final ArrayList<ApplicationsState.AppEntry> matchedEntries;
+                if (TextUtils.isEmpty(query)) {
+                    matchedEntries = mOriginalEntries;
+                } else {
+                    matchedEntries = new ArrayList<>();
+                    for (ApplicationsState.AppEntry entry : mOriginalEntries) {
+                        if (entry.label.toLowerCase().contains(query.toString().toLowerCase())) {
+                            matchedEntries.add(entry);
+                        }
+                    }
+                }
+                final FilterResults results = new FilterResults();
+                results.values = matchedEntries;
+                results.count = matchedEntries.size();
+                return results;
+            }
+
+            @Override
+            protected void publishResults(CharSequence constraint, FilterResults results) {
+                mEntries = (ArrayList<ApplicationsState.AppEntry>) results.values;
+                notifyDataSetChanged();
+            }
+        }
     }
 
     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
diff --git a/src/com/android/settings/core/PreferenceXmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java
index 9fdeeef..ce5c505 100644
--- a/src/com/android/settings/core/PreferenceXmlParserUtils.java
+++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java
@@ -55,6 +55,8 @@
     private static final List<String> SUPPORTED_PREF_TYPES = Arrays.asList(
             "Preference", "PreferenceCategory", "PreferenceScreen",
             "com.android.settings.widget.WorkOnlyCategory");
+    public static final int PREPEND_VALUE = 0;
+    public static final int APPEND_VALUE = 1;
 
     /**
      * Flag definition to indicate which metadata should be extracted when
@@ -84,6 +86,7 @@
         int FLAG_NEED_KEYWORDS = 1 << 8;
         int FLAG_NEED_SEARCHABLE = 1 << 9;
         int FLAG_ALLOW_DYNAMIC_SUMMARY_IN_SLICE = 1 << 10;
+        int FLAG_NEED_PREF_APPEND = 1 << 11;
     }
 
     public static final String METADATA_PREF_TYPE = "type";
@@ -97,6 +100,7 @@
     public static final String METADATA_SEARCHABLE = "searchable";
     public static final String METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE =
             "allow_dynamic_summary_in_slice";
+    public static final String METADATA_APPEND = "staticPreferenceLocation";
 
     private static final String ENTRIES_SEPARATOR = "|";
 
@@ -184,14 +188,13 @@
             // Parse next until start tag is found
         }
         final int outerDepth = parser.getDepth();
-
+        final boolean hasPrefScreenFlag = hasFlag(flags, MetadataFlag.FLAG_INCLUDE_PREF_SCREEN);
         do {
             if (type != XmlPullParser.START_TAG) {
                 continue;
             }
             final String nodeName = parser.getName();
-            if (!hasFlag(flags, MetadataFlag.FLAG_INCLUDE_PREF_SCREEN)
-                    && TextUtils.equals(PREF_SCREEN_TAG, nodeName)) {
+            if (!hasPrefScreenFlag && TextUtils.equals(PREF_SCREEN_TAG, nodeName)) {
                 continue;
             }
             if (!SUPPORTED_PREF_TYPES.contains(nodeName) && !nodeName.endsWith("Preference")) {
@@ -199,8 +202,14 @@
             }
             final Bundle preferenceMetadata = new Bundle();
             final AttributeSet attrs = Xml.asAttributeSet(parser);
+
             final TypedArray preferenceAttributes = context.obtainStyledAttributes(attrs,
                     R.styleable.Preference);
+            TypedArray preferenceScreenAttributes = null;
+            if (hasPrefScreenFlag) {
+                preferenceScreenAttributes = context.obtainStyledAttributes(
+                        attrs, R.styleable.PreferenceScreen);
+            }
 
             if (hasFlag(flags, MetadataFlag.FLAG_NEED_PREF_TYPE)) {
                 preferenceMetadata.putString(METADATA_PREF_TYPE, nodeName);
@@ -236,6 +245,10 @@
                 preferenceMetadata.putBoolean(METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE,
                         isDynamicSummaryAllowed(preferenceAttributes));
             }
+            if (hasFlag(flags, MetadataFlag.FLAG_NEED_PREF_APPEND) && hasPrefScreenFlag) {
+                preferenceMetadata.putBoolean(METADATA_APPEND,
+                        isAppended(preferenceScreenAttributes));
+            }
             metadata.add(preferenceMetadata);
 
             preferenceAttributes.recycle();
@@ -325,7 +338,12 @@
                 false /* default */);
     }
 
-    private static String getKeywords(TypedArray styleAttributes) {
-        return styleAttributes.getString(R.styleable.Preference_keywords);
+    private static String getKeywords(TypedArray styledAttributes) {
+        return styledAttributes.getString(R.styleable.Preference_keywords);
+    }
+
+    private static boolean isAppended(TypedArray styledAttributes) {
+        return styledAttributes.getInt(R.styleable.PreferenceScreen_staticPreferenceLocation,
+            PREPEND_VALUE) == APPEND_VALUE;
     }
 }
diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
index 0fcec05..95e663b 100644
--- a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
@@ -66,6 +66,25 @@
         }
     }
 
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        super.onDeveloperOptionsSwitchDisabled();
+        final boolean offloadSupported =
+                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false);
+        if (offloadSupported) {
+            ((SwitchPreference) mPreference).setChecked(false);
+            SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, "false");
+        }
+    }
+
+    public boolean isDefaultValue() {
+        final boolean offloadSupported =
+                SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false);
+        final boolean offloadDisabled =
+                    SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
+        return offloadSupported ? !offloadDisabled : true;
+    }
+
     public void onA2dpHwDialogConfirmed() {
         final boolean offloadDisabled =
                 SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 762686a..4ddcc36 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -221,7 +221,16 @@
             if (isChecked) {
                 EnableDevelopmentSettingWarningDialog.show(this /* host */);
             } else {
-                disableDeveloperOptions();
+                final BluetoothA2dpHwOffloadPreferenceController controller =
+                        getDevelopmentOptionsController(
+                                BluetoothA2dpHwOffloadPreferenceController.class);
+                // If A2DP hardware offload isn't default value, we must reboot after disable
+                // developer options. Show a dialog for the user to confirm.
+                if (controller == null || controller.isDefaultValue()) {
+                    disableDeveloperOptions();
+                } else {
+                    DisableDevSettingsDialogFragment.show(this /* host */);
+                }
             }
         }
     }
@@ -380,6 +389,15 @@
         mSwitchBar.setChecked(false);
     }
 
+    void onDisableDevelopmentOptionsConfirmed() {
+        disableDeveloperOptions();
+    }
+
+    void onDisableDevelopmentOptionsRejected() {
+        // Reset the toggle
+        mSwitchBar.setChecked(true);
+    }
+
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Activity activity, Lifecycle lifecycle, DevelopmentSettingsDashboardFragment fragment,
             BluetoothA2dpConfigStore bluetoothA2dpConfigStore) {
diff --git a/src/com/android/settings/development/DisableDevSettingsDialogFragment.java b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
new file mode 100644
index 0000000..9b3ba58
--- /dev/null
+++ b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.util.Log;
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+public class DisableDevSettingsDialogFragment extends InstrumentedDialogFragment
+        implements DialogInterface.OnClickListener {
+
+    public static final String TAG = "DisableDevSettingDlg";
+
+    @VisibleForTesting
+    static DisableDevSettingsDialogFragment newInstance() {
+        final DisableDevSettingsDialogFragment dialog = new DisableDevSettingsDialogFragment();
+        return dialog;
+    }
+
+    public static void show(DevelopmentSettingsDashboardFragment host) {
+        final DisableDevSettingsDialogFragment dialog = new DisableDevSettingsDialogFragment();
+        dialog.setTargetFragment(host, 0 /* requestCode */);
+        final FragmentManager manager = host.getActivity().getSupportFragmentManager();
+        dialog.show(manager, TAG);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.DIALOG_DISABLE_DEVELOPMENT_OPTIONS;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Reuse the same text of disable_a2dp_hw_offload_dialog.
+        // The text is generic enough to be used for turning off Dev options.
+        return new AlertDialog.Builder(getActivity())
+                .setMessage(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message)
+                .setTitle(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title)
+                .setPositiveButton(
+                        R.string.bluetooth_disable_a2dp_hw_offload_dialog_confirm, this)
+                .setNegativeButton(
+                        R.string.bluetooth_disable_a2dp_hw_offload_dialog_cancel, this)
+                .create();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        Fragment fragment = getTargetFragment();
+        if (!(fragment instanceof DevelopmentSettingsDashboardFragment)){
+            Log.e(TAG, "getTargetFragment return unexpected type");
+        }
+
+        final DevelopmentSettingsDashboardFragment host =
+                (DevelopmentSettingsDashboardFragment) fragment;
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            host.onDisableDevelopmentOptionsConfirmed();
+            PowerManager pm = getContext().getSystemService(PowerManager.class);
+            pm.reboot(null);
+        } else {
+            host.onDisableDevelopmentOptionsRejected();
+        }
+    }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
index e437e2b..32a86e8 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
@@ -16,8 +16,10 @@
 
 package com.android.settings.homepage.contextualcards;
 
+import android.annotation.NonNull;
 import android.content.Context;
 import android.content.Intent;
+import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -25,6 +27,7 @@
 import androidx.slice.widget.EventInfo;
 
 import com.android.settings.R;
+import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;
 
 import java.util.List;
 
@@ -38,10 +41,6 @@
     // Contextual card shows, log card name and rank
     private static final int CONTEXTUAL_CARD_SHOW = 39;
 
-    // Contextual card is eligible to be shown, but doesn't rank high
-    // enough, log card name and score
-    private static final int CONTEXTUAL_CARD_NOT_SHOW = 40;
-
     // Contextual card is dismissed, log card name
     private static final int CONTEXTUAL_CARD_DISMISS = 41;
 
@@ -67,6 +66,11 @@
     // log type
     private static final String EXTRA_CONTEXTUALCARD_ACTION_TYPE = "type";
 
+    // displayed contextual cards
+    private static final String EXTRA_CONTEXTUALCARD_VISIBLE = "visible";
+
+    // hidden contextual cards
+    private static final String EXTRA_CONTEXTUALCARD_HIDDEN = "hidden";
 
     // Contextual card tap target
     private static final int TARGET_DEFAULT = 0;
@@ -82,6 +86,10 @@
 
     @Override
     public void logHomepageDisplay(Context context, Long latency) {
+        final Intent intent = new Intent();
+        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW);
+        intent.putExtra(EXTRA_LATENCY, latency);
+        sendBroadcast(context, intent);
     }
 
     @Override
@@ -94,8 +102,13 @@
     }
 
     @Override
-    public void logContextualCardDisplay(Context context, List<ContextualCard> showCards,
+    public void logContextualCardDisplay(Context context, List<ContextualCard> visibleCards,
             List<ContextualCard> hiddenCards) {
+        final Intent intent = new Intent();
+        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_SHOW);
+        intent.putExtra(EXTRA_CONTEXTUALCARD_VISIBLE, serialize(visibleCards));
+        intent.putExtra(EXTRA_CONTEXTUALCARD_HIDDEN, serialize(hiddenCards));
+        sendBroadcast(context, intent);
     }
 
     @Override
@@ -116,7 +129,7 @@
         final String action = context.getString(R.string.config_settingsintelligence_log_action);
         if (!TextUtils.isEmpty(action)) {
             intent.setAction(action);
-            context.sendBroadcast(intent);
+            context.sendBroadcastAsUser(intent, UserHandle.ALL);
         }
     }
 
@@ -133,4 +146,16 @@
                 return TARGET_DEFAULT;
         }
     }
+
+    @VisibleForTesting
+    @NonNull
+    byte[] serialize(List<ContextualCard> cards) {
+        final ContextualCardList.Builder builder = ContextualCardList.newBuilder();
+        cards.stream().forEach(card -> builder.addCard(
+                com.android.settings.intelligence.ContextualCardProto.ContextualCard.newBuilder()
+                        .setSliceUri(card.getSliceUri().toString())
+                        .setCardName(card.getName())
+                        .build()));
+        return builder.build().toByteArray();
+    }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 3ef4653..6373519 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -20,6 +20,9 @@
 
 import static androidx.slice.widget.SliceLiveData.SUPPORTED_SPECS;
 
+import static com.android.settings.slices.CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI;
+import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
+
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -34,7 +37,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.slice.Slice;
 
-import com.android.settings.slices.CustomSliceRegistry;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.utils.AsyncLoaderCompat;
 
 import java.util.ArrayList;
@@ -103,27 +106,50 @@
         return getFinalDisplayableCards(result);
     }
 
+    // Get final displayed cards and log what cards will be displayed/hidden
     @VisibleForTesting
     List<ContextualCard> getFinalDisplayableCards(List<ContextualCard> candidates) {
-        List<ContextualCard> eligibleCards = filterEligibleCards(candidates);
-        eligibleCards = eligibleCards.stream().limit(DEFAULT_CARD_COUNT).collect(
-                Collectors.toList());
+        final List<ContextualCard> eligibleCards = filterEligibleCards(candidates);
+        final List<ContextualCard> visibleCards = new ArrayList<>();
+        final List<ContextualCard> hiddenCards = new ArrayList<>();
 
-        if (eligibleCards.size() <= 2 || getNumberOfLargeCard(eligibleCards) == 0) {
-            return eligibleCards;
+        final int size = eligibleCards.size();
+        for (int i = 0; i < size; i++) {
+            if (i < DEFAULT_CARD_COUNT) {
+                visibleCards.add(eligibleCards.get(i));
+            } else {
+                hiddenCards.add(eligibleCards.get(i));
+            }
         }
 
-        if (eligibleCards.size() == DEFAULT_CARD_COUNT) {
-            eligibleCards.remove(eligibleCards.size() - 1);
+        try {
+            // The maximum cards are four small cards OR
+            // one large card with two small cards OR
+            // two large cards
+            if (visibleCards.size() <= 2 || getNumberOfLargeCard(visibleCards) == 0) {
+                // four small cards
+                return visibleCards;
+            }
+
+            if (visibleCards.size() == DEFAULT_CARD_COUNT) {
+                hiddenCards.add(visibleCards.remove(visibleCards.size() - 1));
+            }
+
+            if (getNumberOfLargeCard(visibleCards) == 1) {
+                // One large card with two small cards
+                return visibleCards;
+            }
+
+            hiddenCards.add(visibleCards.remove(visibleCards.size() - 1));
+
+            // Two large cards
+            return visibleCards;
+        } finally {
+            final ContextualCardFeatureProvider contextualCardFeatureProvider =
+                    FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider();
+            contextualCardFeatureProvider.logContextualCardDisplay(mContext, visibleCards,
+                    hiddenCards);
         }
-
-        if (getNumberOfLargeCard(eligibleCards) == 1) {
-            return eligibleCards;
-        }
-
-        eligibleCards.remove(eligibleCards.size() - 1);
-
-        return eligibleCards;
     }
 
     @VisibleForTesting
@@ -169,8 +195,8 @@
 
     private int getNumberOfLargeCard(List<ContextualCard> cards) {
         return (int) cards.stream()
-                .filter(card -> card.getSliceUri().equals(CustomSliceRegistry.WIFI_SLICE_URI)
-                        || card.getSliceUri().equals(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI))
+                .filter(card -> card.getSliceUri().equals(WIFI_SLICE_URI)
+                        || card.getSliceUri().equals(CONNECTED_DEVICE_SLICE_URI))
                 .count();
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index 5f397d7..28ad0d3 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -16,8 +16,7 @@
 
 package com.android.settings.homepage.contextualcards;
 
-import static com.android.settings.homepage.contextualcards.ContextualCardLoader
-        .CARD_CONTENT_LOADER_ID;
+import static com.android.settings.homepage.contextualcards.ContextualCardLoader.CARD_CONTENT_LOADER_ID;
 
 import static java.util.stream.Collectors.groupingBy;
 
@@ -33,6 +32,7 @@
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
 
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 
@@ -72,6 +72,7 @@
     private final List<LifecycleObserver> mLifecycleObservers;
 
     private ContextualCardUpdateListener mListener;
+    private long mStartTime;
 
     public ContextualCardManager(Context context, Lifecycle lifecycle) {
         mContext = context;
@@ -86,6 +87,7 @@
     }
 
     void loadContextualCards(ContextualCardsFragment fragment) {
+        mStartTime = System.currentTimeMillis();
         final CardContentLoaderCallbacks cardContentLoaderCallbacks =
                 new CardContentLoaderCallbacks(mContext);
         cardContentLoaderCallbacks.setListener(this);
@@ -168,6 +170,10 @@
     @Override
     public void onFinishCardLoading(List<ContextualCard> cards) {
         onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType)));
+        final long elapsedTime = System.currentTimeMillis() - mStartTime;
+        final ContextualCardFeatureProvider contextualCardFeatureProvider =
+                FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider();
+        contextualCardFeatureProvider.logHomepageDisplay(mContext, elapsedTime);
     }
 
     public ControllerRendererPool getControllerRendererPool() {
diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java
index b0d6963..5271e12 100644
--- a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java
+++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.homepage.contextualcards.deviceinfo;
 
-import static com.android.settings.slices.CustomSliceRegistry.BATTERY_INFO_SLICE_URI;
-
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -37,6 +35,7 @@
 import com.android.settings.Utils;
 import com.android.settings.fuelgauge.BatteryInfo;
 import com.android.settings.fuelgauge.PowerUsageSummary;
+import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.CustomSliceable;
 import com.android.settings.slices.SliceBuilderUtils;
 
@@ -66,7 +65,8 @@
         final CharSequence title = mContext.getText(R.string.power_usage_summary_title);
         final SliceAction primarySliceAction = SliceAction.createDeeplink(getPrimaryAction(), icon,
                 ListBuilder.ICON_IMAGE, title);
-        final Slice slice = new ListBuilder(mContext, BATTERY_INFO_SLICE_URI, ListBuilder.INFINITY)
+        final Slice slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_INFO_SLICE_URI,
+                ListBuilder.INFINITY)
                 .setAccentColor(Utils.getColorAccentDefaultColor(mContext))
                 .setHeader(new ListBuilder.HeaderBuilder().setTitle(title))
                 .addRow(new ListBuilder.RowBuilder()
@@ -81,7 +81,7 @@
 
     @Override
     public Uri getUri() {
-        return BATTERY_INFO_SLICE_URI;
+        return CustomSliceRegistry.BATTERY_INFO_SLICE_URI;
     }
 
     @Override
@@ -95,7 +95,8 @@
         return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
                 PowerUsageSummary.class.getName(), "" /* key */, screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.BATTERY_INFO_SLICE_URI);
     }
 
     @Override
diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java
index bb78586..6e94f6d 100644
--- a/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java
@@ -94,7 +94,8 @@
         return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
                 DataUsageSummary.class.getName(), "" /* key */, screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.DATA_USAGE_SLICE_URI);
     }
 
     private PendingIntent getPrimaryAction() {
diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java
index 694336d..1f75ab1 100644
--- a/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java
@@ -85,7 +85,8 @@
         return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
                 MyDeviceInfoFragment.class.getName(), "" /* key */, screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.DEVICE_INFO_SLICE_URI);
     }
 
     private PendingIntent getPrimaryAction() {
diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java
index eba831a..799a701 100644
--- a/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java
@@ -80,7 +80,8 @@
         return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
                 StorageDashboardFragment.class.getName(), "" /* key */, screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.STORAGE_SLICE_URI);
     }
 
     private PendingIntent getPrimaryAction() {
diff --git a/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java b/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java
index 0c79b6b..4ee8ff5 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java
@@ -17,6 +17,7 @@
 package com.android.settings.homepage.contextualcards.slices;
 
 import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothAdapter;
 import android.content.Context;
 import android.content.Intent;
@@ -48,7 +49,6 @@
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.core.instrumentation.Instrumentable;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -147,7 +147,8 @@
                 ConnectedDeviceDashboardFragment.class.getName(), "" /* key */,
                 screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI);
     }
 
     @Override
@@ -193,7 +194,7 @@
         subSettingLauncher.setDestination(BluetoothDeviceDetailsFragment.class.getName())
                 .setArguments(args)
                 .setTitleRes(R.string.device_details_title)
-                .setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN);
+                .setSourceMetricsCategory(SettingsEnums.BLUETOOTH_DEVICE_DETAILS);
 
         // The requestCode should be unique, use the hashcode of device as request code.
         return PendingIntent
diff --git a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java
index 3cbbb0c..e0f3116 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java
@@ -110,7 +110,8 @@
                 StorageSettings.class.getName(), "" /* key */,
                 screenTitle,
                 MetricsProto.MetricsEvent.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName());
+                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
+                .setData(CustomSliceRegistry.LOW_STORAGE_SLICE_URI);
     }
 
     private RowBuilder buildRowBuilder(CharSequence title, String summary, IconCompat icon) {
diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java
index 633fc45..a16be66 100644
--- a/src/com/android/settings/network/ApnEditor.java
+++ b/src/com/android/settings/network/ApnEditor.java
@@ -167,7 +167,7 @@
             Telephony.Carriers.ROAMING_PROTOCOL, // 20
             Telephony.Carriers.MVNO_TYPE,   // 21
             Telephony.Carriers.MVNO_MATCH_DATA,  // 22
-            Telephony.Carriers.EDITED,   // 23
+            Telephony.Carriers.EDITED_STATUS,   // 23
             Telephony.Carriers.USER_EDITABLE    //24
     };
 
@@ -1035,7 +1035,7 @@
                 callUpdate,
                 CARRIER_ENABLED_INDEX);
 
-        values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+        values.put(Telephony.Carriers.EDITED_STATUS, Telephony.Carriers.USER_EDITED);
 
         if (callUpdate) {
             final Uri uri = mApnData.getUri() == null ? mCarrierUri : mApnData.getUri();
diff --git a/src/com/android/settings/network/ApnSettings.java b/src/com/android/settings/network/ApnSettings.java
index 4bd964e..261d889 100755
--- a/src/com/android/settings/network/ApnSettings.java
+++ b/src/com/android/settings/network/ApnSettings.java
@@ -82,7 +82,7 @@
             Telephony.Carriers.TYPE,
             Telephony.Carriers.MVNO_TYPE,
             Telephony.Carriers.MVNO_MATCH_DATA,
-            Telephony.Carriers.EDITED,
+            Telephony.Carriers.EDITED_STATUS,
     };
 
     private static final int ID_INDEX = 0;
diff --git a/src/com/android/settings/network/MultiNetworkHeaderController.java b/src/com/android/settings/network/MultiNetworkHeaderController.java
new file mode 100644
index 0000000..1c0fc74
--- /dev/null
+++ b/src/com/android/settings/network/MultiNetworkHeaderController.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+
+// This controls a header at the top of the Network & internet page that only appears when there
+// are two or more active mobile subscriptions. It shows an overview of available network
+// connections with an entry for wifi (if connected) and an entry for each subscription.
+public class MultiNetworkHeaderController extends BasePreferenceController {
+
+    public MultiNetworkHeaderController(Context context, String key) {
+      super(context, key);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return UNSUPPORTED_ON_DEVICE;
+    }
+}
diff --git a/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceController.java b/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceController.java
index 615b26c..7da90c8 100644
--- a/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceController.java
@@ -73,8 +73,7 @@
                 // 2. rule was added or deleted, so reload the entire list
                 if (Objects.equals(pref.mId, sortedRules[i].getKey())) {
                     AutomaticZenRule rule = sortedRules[i].getValue();
-                    pref.setName(rule.getName());
-                    pref.setChecked(rule.isEnabled());
+                    pref.updatePreference(rule);
                 } else {
                     reloadAllRules(sortedRules);
                     break;
diff --git a/src/com/android/settings/notification/ZenModeBackend.java b/src/com/android/settings/notification/ZenModeBackend.java
index 4824825..a75f51c 100644
--- a/src/com/android/settings/notification/ZenModeBackend.java
+++ b/src/com/android/settings/notification/ZenModeBackend.java
@@ -250,15 +250,17 @@
         }
     }
 
+    protected int getAlarmsTotalSilenceCallsMessagesSummary(int category) {
+        if (category == NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES) {
+            return R.string.zen_mode_from_none_messages;
+        } else if (category == NotificationManager.Policy.PRIORITY_CATEGORY_CALLS){
+            return R.string.zen_mode_from_none_calls;
+        }
+        return 0;
+    }
+
     protected int getContactsSummary(int category) {
         int contactType = -1;
-
-        // SOURCE_NONE can be used when in total silence or alarms only
-        // (policy is based on user's preferences but the UI displayed is based on zenMode)
-        if (category == SOURCE_NONE) {
-            return R.string.zen_mode_from_none;
-        }
-
         if (category == NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES) {
             if (isPriorityCategoryEnabled(category)) {
                 contactType = getPriorityMessageSenders();
@@ -273,12 +275,16 @@
             case NotificationManager.Policy.PRIORITY_SENDERS_ANY:
                 return R.string.zen_mode_from_anyone;
             case NotificationManager.Policy.PRIORITY_SENDERS_CONTACTS:
-                return  R.string.zen_mode_from_contacts;
+                return R.string.zen_mode_from_contacts;
             case NotificationManager.Policy.PRIORITY_SENDERS_STARRED:
-                return  R.string.zen_mode_from_starred;
+                return R.string.zen_mode_from_starred;
             case SOURCE_NONE:
             default:
-                return R.string.zen_mode_from_none;
+                if (category == NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES) {
+                    return R.string.zen_mode_from_none_messages;
+                } else {
+                    return R.string.zen_mode_from_none_calls;
+                }
         }
     }
 
diff --git a/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java b/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java
index 19ee809..2e41f20 100644
--- a/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java
@@ -18,11 +18,11 @@
 
 import android.content.Context;
 
+import androidx.preference.Preference;
+
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
-import androidx.preference.Preference;
-
 public class ZenModeMessagesPreferenceController extends
         AbstractZenModePreferenceController implements PreferenceControllerMixin {
 
@@ -48,6 +48,7 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        // TODO: (b/111475013 - beverlyt) set messages summary
+
+        preference.setSummary(mSummaryBuilder.getMessagesSettingSummary(getPolicy()));
     }
 }
diff --git a/src/com/android/settings/notification/ZenModePriorityCallsPreferenceController.java b/src/com/android/settings/notification/ZenModePriorityCallsPreferenceController.java
index 44b6c24..9872188 100644
--- a/src/com/android/settings/notification/ZenModePriorityCallsPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModePriorityCallsPreferenceController.java
@@ -21,14 +21,14 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
 public class ZenModePriorityCallsPreferenceController extends AbstractZenModePreferenceController
         implements Preference.OnPreferenceChangeListener {
 
@@ -80,7 +80,8 @@
             case Settings.Global.ZEN_MODE_ALARMS:
                 mPreference.setEnabled(false);
                 mPreference.setValue(ZenModeBackend.ZEN_MODE_FROM_NONE);
-                mPreference.setSummary(mBackend.getContactsSummary(ZenModeBackend.SOURCE_NONE));
+                mPreference.setSummary(mBackend.getAlarmsTotalSilenceCallsMessagesSummary(
+                        NotificationManager.Policy.PRIORITY_CATEGORY_CALLS));
                 break;
             default:
                 preference.setEnabled(true);
diff --git a/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceController.java b/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceController.java
index 56829a7..cfda367 100644
--- a/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceController.java
@@ -21,14 +21,14 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
 public class ZenModePriorityMessagesPreferenceController extends AbstractZenModePreferenceController
         implements Preference.OnPreferenceChangeListener {
 
@@ -80,7 +80,8 @@
             case Settings.Global.ZEN_MODE_ALARMS:
                 mPreference.setEnabled(false);
                 mPreference.setValue(ZenModeBackend.ZEN_MODE_FROM_NONE);
-                mPreference.setSummary(mBackend.getContactsSummary(ZenModeBackend.SOURCE_NONE));
+                mPreference.setSummary(mBackend.getAlarmsTotalSilenceCallsMessagesSummary(
+                        NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES));
                 break;
             default:
                 preference.setEnabled(true);
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 293c429..a3f59c6 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -145,7 +145,7 @@
                             || PRIORITY_CATEGORY_REPEAT_CALLERS == category, false);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
-                return mContext.getString(R.string.zen_mode_no_exceptions);
+                return mContext.getString(R.string.zen_mode_from_none_calls);
             } else if (numCategories == 1) {
                 return mContext.getString(R.string.zen_mode_calls_summary_one,
                         enabledCategories.get(0));
@@ -156,34 +156,14 @@
             }
         }
 
-        String getMsgEventReminderSettingSummary(Policy policy) {
+        String getMessagesSettingSummary(Policy policy) {
             List<String> enabledCategories = getEnabledCategories(policy,
-                    category -> PRIORITY_CATEGORY_EVENTS == category
-                            || PRIORITY_CATEGORY_REMINDERS == category
-                            || PRIORITY_CATEGORY_MESSAGES == category, true);
+                    category -> PRIORITY_CATEGORY_MESSAGES == category, false);
             int numCategories = enabledCategories.size();
             if (numCategories == 0) {
-                return mContext.getString(R.string.zen_mode_no_exceptions);
-            } else if (numCategories == 1) {
-                return enabledCategories.get(0);
-            } else if (numCategories == 2) {
-                return mContext.getString(R.string.join_two_items, enabledCategories.get(0),
-                        enabledCategories.get(1));
-            } else if (numCategories == 3){
-                final List<String> summaries = new ArrayList<>();
-                summaries.add(enabledCategories.get(0));
-                summaries.add(enabledCategories.get(1));
-                summaries.add(enabledCategories.get(2));
-
-                return ListFormatter.getInstance().format(summaries);
+                return mContext.getString(R.string.zen_mode_from_none_messages);
             } else {
-                final List<String> summaries = new ArrayList<>();
-                summaries.add(enabledCategories.get(0));
-                summaries.add(enabledCategories.get(1));
-                summaries.add(enabledCategories.get(2));
-                summaries.add(mContext.getString(R.string.zen_mode_other_options));
-
-                return ListFormatter.getInstance().format(summaries);
+                return enabledCategories.get(0);
             }
         }
 
@@ -292,17 +272,11 @@
                 }
             } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) {
                 if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
-                    if (isFirst) {
-                        return mContext.getString(R.string.zen_mode_all_messages);
-                    } else {
-                        return mContext.getString(R.string.zen_mode_all_messages_list);
-                    }
+                    return mContext.getString(R.string.zen_mode_from_anyone);
+                } else if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_CONTACTS){
+                    return mContext.getString(R.string.zen_mode_from_contacts);
                 } else {
-                    if (isFirst) {
-                        return mContext.getString(R.string.zen_mode_selected_messages);
-                    } else {
-                        return mContext.getString(R.string.zen_mode_selected_messages_list);
-                    }
+                    return mContext.getString(R.string.zen_mode_from_starred);
                 }
             } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) {
                 if (isFirst) {
diff --git a/src/com/android/settings/notification/ZenRulePreference.java b/src/com/android/settings/notification/ZenRulePreference.java
index 48a879b..10b49eb 100644
--- a/src/com/android/settings/notification/ZenRulePreference.java
+++ b/src/com/android/settings/notification/ZenRulePreference.java
@@ -31,6 +31,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.utils.ManagedServiceSettings;
 import com.android.settings.utils.ZenServiceListing;
@@ -122,17 +123,17 @@
         return mChecked;
     }
 
-    public void setChecked(boolean checked) {
-        mChecked = checked;
-        if (mCheckBox != null) {
-            mCheckBox.setChecked(checked);
-        }
-    }
-
-    public void setName(String name) {
-        if (!Objects.equals(mName, name)) {
-            mName = name;
+    public void updatePreference(AutomaticZenRule rule) {
+        if (!mRule.getName().equals(rule.getName())) {
+            mName = rule.getName();
             setTitle(mName);
+            mRule.setName(mName.toString());
+        }
+
+        if (mRule.isEnabled() != rule.isEnabled()) {
+            mRule.setEnabled(rule.isEnabled());
+            setChecked(mRule.isEnabled());
+            setSummary(computeRuleSummary(mRule));
         }
     }
 
@@ -141,6 +142,13 @@
         mOnCheckBoxClickListener.onClick(null);
     }
 
+    private void setChecked(boolean checked) {
+        mChecked = checked;
+        if (mCheckBox != null) {
+            mCheckBox.setChecked(checked);
+        }
+    }
+
     private View.OnClickListener mOnCheckBoxClickListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
@@ -159,7 +167,7 @@
 
         try {
             ApplicationInfo info = mPm.getApplicationInfo(rule.getOwner().getPackageName(), 0);
-            setSummary(computeRuleSummary(rule, mIsSystemRule, info.loadLabel(mPm)));
+            setSummary(computeRuleSummary(rule));
         } catch (PackageManager.NameNotFoundException e) {
             appExists = false;
             return;
@@ -179,8 +187,7 @@
         setKey(mId);
     }
 
-    private String computeRuleSummary(AutomaticZenRule rule, boolean isSystemRule,
-            CharSequence providerLabel) {
+    private String computeRuleSummary(AutomaticZenRule rule) {
         return (rule == null || !rule.isEnabled())
                 ? mContext.getResources().getString(R.string.switch_off_text)
                 : mContext.getResources().getString(R.string.switch_on_text);
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index c16a8ba..d75eaa2 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -449,6 +449,12 @@
         if (iconResource == 0) {
             iconResource = R.drawable.ic_settings;
         }
-        return IconCompat.createWithResource(context, iconResource);
+        try {
+            return IconCompat.createWithResource(context, iconResource);
+        } catch (Exception e) {
+            Log.w(TAG, "Falling back to settings icon because there is an error getting slice icon "
+                    + data.getUri(), e);
+            return IconCompat.createWithResource(context, R.drawable.ic_settings);
+        }
     }
 }
diff --git a/src/com/android/settings/widget/FloatingAppBarScrollingViewBehavior.java b/src/com/android/settings/widget/FloatingAppBarScrollingViewBehavior.java
new file mode 100644
index 0000000..23f6ccd
--- /dev/null
+++ b/src/com/android/settings/widget/FloatingAppBarScrollingViewBehavior.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+
+import com.google.android.material.appbar.AppBarLayout;
+
+/**
+ * This scrolling view behavior will set the background of the {@link AppBarLayout} as
+ * transparent and without the elevation. Also make header overlapped the scrolling child view.
+ */
+public class FloatingAppBarScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior {
+    private boolean initialized;
+
+    public FloatingAppBarScrollingViewBehavior(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
+        boolean changed = super.onDependentViewChanged(parent, child, dependency);
+        if (!initialized && dependency instanceof AppBarLayout) {
+            initialized = true;
+            AppBarLayout appBarLayout = (AppBarLayout) dependency;
+            setAppBarLayoutTransparent(appBarLayout);
+        }
+        return changed;
+    }
+
+    @VisibleForTesting
+    void setAppBarLayoutTransparent(AppBarLayout appBarLayout) {
+        appBarLayout.setBackgroundColor(Color.TRANSPARENT);
+        appBarLayout.setTargetElevation(0);
+    }
+
+    @Override
+    protected boolean shouldHeaderOverlapScrollingChild() {
+        return true;
+    }
+}
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
index 89df487..50c1b58 100644
--- a/src/com/android/settings/widget/RadioButtonPickerFragment.java
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -22,10 +22,12 @@
 import android.os.UserManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import android.widget.Toast;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -34,16 +36,23 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.PreferenceXmlParserUtils;
+import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
 import com.android.settingslib.widget.CandidateInfo;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.xmlpull.v1.XmlPullParserException;
 
 public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFragment implements
         RadioButtonPreference.OnClickListener {
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     static final String EXTRA_FOR_WORK = "for_work";
+    private static final String TAG = "RadioButtonPckrFrgmt";
+    @VisibleForTesting
+    boolean mAppendStaticPreferences = false;
 
     private final Map<String, CandidateInfo> mCandidates = new ArrayMap<>();
 
@@ -69,6 +78,19 @@
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
+        try {
+            // Check if the xml specifies if static preferences should go on the top or bottom
+            final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(getContext(),
+                getPreferenceScreenResId(),
+                MetadataFlag.FLAG_INCLUDE_PREF_SCREEN |
+                MetadataFlag.FLAG_NEED_PREF_APPEND);
+            mAppendStaticPreferences = metadata.get(0)
+                    .getBoolean(PreferenceXmlParserUtils.METADATA_APPEND);
+        } catch (IOException e) {
+            Log.e(TAG, "Error trying to open xml file", e);
+        } catch (XmlPullParserException e) {
+            Log.e(TAG, "Error parsing xml", e);
+        }
         updateCandidates();
     }
 
@@ -142,7 +164,9 @@
         final String systemDefaultKey = getSystemDefaultKey();
         final PreferenceScreen screen = getPreferenceScreen();
         screen.removeAll();
-        addStaticPreferences(screen);
+        if (!mAppendStaticPreferences) {
+            addStaticPreferences(screen);
+        }
 
         final int customLayoutResId = getRadioButtonPreferenceCustomLayoutResId();
         if (shouldShowItemNone()) {
@@ -168,6 +192,9 @@
             }
         }
         mayCheckOnlyRadioButton();
+        if (mAppendStaticPreferences) {
+            addStaticPreferences(screen);
+        }
     }
 
     @VisibleForTesting
diff --git a/tests/robotests/res/xml-mcc999/battery_saver_schedule_settings.xml b/tests/robotests/res/xml-mcc999/battery_saver_schedule_settings.xml
new file mode 100644
index 0000000..f91e4ca
--- /dev/null
+++ b/tests/robotests/res/xml-mcc999/battery_saver_schedule_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/battery_saver_schedule_settings_title"
+    settings:staticPreferenceLocation="append">
+</PreferenceScreen >
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index b3f5b5e..4c9cacb 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -28,11 +28,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -48,9 +49,11 @@
 import android.os.UserManager;
 import android.view.LayoutInflater;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.SearchView;
 
 import androidx.fragment.app.FragmentActivity;
 import androidx.recyclerview.widget.RecyclerView;
@@ -159,6 +162,35 @@
     }
 
     @Test
+    public void onCreateOptionsMenu_shouldSetSearchQueryListener() {
+        final SearchView searchView = mock(SearchView.class);
+        final MenuItem searchMenu = mock(MenuItem.class);
+        final MenuItem helpMenu = mock(MenuItem.class);
+        when(searchMenu.getActionView()).thenReturn(searchView);
+        when(mMenu.findItem(R.id.search_app_list_menu)).thenReturn(searchMenu);
+        when(mMenu.add(anyInt() /* groupId */, anyInt() /* itemId */, anyInt() /* order */,
+            anyInt() /* titleRes */)).thenReturn(helpMenu);
+        doReturn("Test").when(mFragment).getText(anyInt() /* resId */);
+        doNothing().when(mFragment).updateOptionsMenu();
+
+        mFragment.onCreateOptionsMenu(mMenu, mock(MenuInflater.class));
+
+        verify(searchView).setOnQueryTextListener(mFragment);
+    }
+
+    @Test
+    public void onQueryTextChange_shouldFilterSearchInApplicationsAdapter() {
+        final ManageApplications.ApplicationsAdapter adapter =
+            mock(ManageApplications.ApplicationsAdapter.class);
+        final String query = "Test App";
+        ReflectionHelpers.setField(mFragment, "mApplications", adapter);
+
+        mFragment.onQueryTextChange(query);
+
+        verify(adapter).filterSearch(query);
+    }
+
+    @Test
     public void updateLoading_appLoaded_shouldNotDelayCallToHandleLoadingContainer() {
         ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class));
         ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class));
@@ -250,6 +282,34 @@
     }
 
     @Test
+    public void onRebuildComplete_hasSearchQuery_shouldFilterSearch() {
+        final String query = "Test";
+        final RecyclerView recyclerView = mock(RecyclerView.class);
+        final View emptyView = mock(View.class);
+        ReflectionHelpers.setField(mFragment, "mRecyclerView", recyclerView);
+        ReflectionHelpers.setField(mFragment, "mEmptyView", emptyView);
+        final SearchView searchView = mock(SearchView.class);
+        ReflectionHelpers.setField(mFragment, "mSearchView", searchView);
+        when(searchView.isVisibleToUser()).thenReturn(true);
+        when(searchView.getQuery()).thenReturn(query);
+        final View listContainer = mock(View.class);
+        when(listContainer.getVisibility()).thenReturn(View.VISIBLE);
+        ReflectionHelpers.setField(mFragment, "mListContainer", listContainer);
+        ReflectionHelpers.setField(
+            mFragment, "mFilterAdapter", mock(ManageApplications.FilterSpinnerAdapter.class));
+        final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
+        appList.add(mock(ApplicationsState.AppEntry.class));
+        final ManageApplications.ApplicationsAdapter adapter =
+            spy(new ManageApplications.ApplicationsAdapter(mState, mFragment,
+                AppFilterRegistry.getInstance().get(FILTER_APPS_ALL),
+                null /* savedInstanceState */));
+
+        adapter.onRebuildComplete(appList);
+
+        verify(adapter).filterSearch(query);
+    }
+
+    @Test
     public void notifyItemChange_recyclerViewIdle_shouldNotify() {
         final RecyclerView recyclerView = mock(RecyclerView.class);
         final ManageApplications.ApplicationsAdapter adapter =
@@ -344,6 +404,48 @@
     }
 
     @Test
+    public void applicationsAdapter_filterSearch_emptyQuery_shouldShowFullList() {
+        final ManageApplications.ApplicationsAdapter adapter =
+            new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), Bundle.EMPTY);
+        final String[] appNames = {"Apricot", "Banana", "Cantaloupe", "Fig", "Mango"};
+        ReflectionHelpers.setField(adapter, "mOriginalEntries", getTestAppList(appNames));
+
+        adapter.filterSearch("");
+
+        assertThat(adapter.getItemCount()).isEqualTo(5);
+    }
+
+    @Test
+    public void applicationsAdapter_filterSearch_noMatch_shouldShowEmptyList() {
+        final ManageApplications.ApplicationsAdapter adapter =
+            new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), Bundle.EMPTY);
+        final String[] appNames = {"Apricot", "Banana", "Cantaloupe", "Fig", "Mango"};
+        ReflectionHelpers.setField(adapter, "mOriginalEntries", getTestAppList(appNames));
+
+        adapter.filterSearch("orange");
+
+        assertThat(adapter.getItemCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void applicationsAdapter_filterSearch_shouldShowMatchedItemsOnly() {
+        final ManageApplications.ApplicationsAdapter adapter =
+            new ManageApplications.ApplicationsAdapter(
+                mState, mFragment, mock(AppFilterItem.class), Bundle.EMPTY);
+        final String[] appNames = {"Apricot", "Banana", "Cantaloupe", "Fig", "Mango"};
+        ReflectionHelpers.setField(adapter, "mOriginalEntries", getTestAppList(appNames));
+
+        adapter.filterSearch("an");
+
+        assertThat(adapter.getItemCount()).isEqualTo(3);
+        assertThat(adapter.getAppEntry(0).label).isEqualTo("Banana");
+        assertThat(adapter.getAppEntry(1).label).isEqualTo("Cantaloupe");
+        assertThat(adapter.getAppEntry(2).label).isEqualTo("Mango");
+    }
+
+    @Test
     public void sortOrderSavedOnRebuild() {
         when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{});
         ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
@@ -375,4 +477,14 @@
             return new RoboMenuItem(id);
         });
     }
+
+    private ArrayList<ApplicationsState.AppEntry> getTestAppList(String[] appNames) {
+        final ArrayList<ApplicationsState.AppEntry> appList = new ArrayList<>();
+        for (String name : appNames) {
+            final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class);
+            appEntry.label = name;
+            appList.add(appEntry);
+        }
+        return appList;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
index 3b1b5af..ebf3252 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
@@ -18,6 +18,7 @@
 
 import static com.android.settings.core.PreferenceXmlParserUtils
         .METADATA_ALLOW_DYNAMIC_SUMMARY_IN_SLICE;
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_APPEND;
 import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
 import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEYWORDS;
 import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_SEARCHABLE;
@@ -315,6 +316,32 @@
         }
     }
 
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void extractMetadata_requestAppendProperty_shouldDefaultToFalse()
+        throws Exception {
+        final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+                R.xml.display_settings,
+                MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_NEED_PREF_APPEND);
+
+        for (Bundle bundle : metadata) {
+            assertThat(bundle.getBoolean(METADATA_APPEND)).isFalse();
+        }
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void extractMetadata_requestAppendProperty_shouldReturnCorrectValue()
+        throws Exception {
+        final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+                R.xml.battery_saver_schedule_settings,
+                MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_NEED_PREF_APPEND);
+
+        for (Bundle bundle : metadata) {
+            assertThat(bundle.getBoolean(METADATA_APPEND)).isTrue();
+        }
+    }
+
     /**
      * @param resId the ID for the XML preference
      * @return an XML resource parser that points to the start tag
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index d2c9b65..5eb21bd 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -28,10 +28,15 @@
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.ToggleSwitch;
@@ -47,12 +52,14 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.androidx.fragment.FragmentController;
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.List;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = ShadowUserManager.class)
+@Config(shadows = {ShadowUserManager.class, ShadowAlertDialogCompat.class,
+        SettingsShadowResourcesImpl.class})
 public class DevelopmentSettingsDashboardFragmentTest {
 
     private ToggleSwitch mSwitch;
@@ -179,6 +186,29 @@
     }
 
     @Test
+    @Config(shadows = ShadowDisableDevSettingsDialogFragment.class)
+    public void onSwitchChanged_turnOff_andOffloadIsNotDefaultValue_shouldShowWarningDialog() {
+        final BluetoothA2dpHwOffloadPreferenceController controller =
+                mock(BluetoothA2dpHwOffloadPreferenceController.class);
+        when(mDashboard.getContext()).thenReturn(mContext);
+        when(mDashboard.getDevelopmentOptionsController(
+                BluetoothA2dpHwOffloadPreferenceController.class)).thenReturn(controller);
+        when(controller.isDefaultValue()).thenReturn(false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        mDashboard.onSwitchChanged(mSwitch, false /* isChecked */);
+
+        AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(dialog).isNotNull();
+        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+        assertThat(shadowDialog.getTitle()).isEqualTo(
+                mContext.getString(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title));
+        assertThat(shadowDialog.getMessage()).isEqualTo(
+                mContext.getString(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message));
+    }
+
+    @Test
     public void onOemUnlockDialogConfirmed_shouldCallControllerOemConfirmed() {
         final OemUnlockPreferenceController controller = mock(OemUnlockPreferenceController.class);
         doReturn(controller).when(mDashboard)
@@ -264,6 +294,18 @@
         }
     }
 
+    @Implements(DisableDevSettingsDialogFragment.class)
+    public static class ShadowDisableDevSettingsDialogFragment {
+
+        @Implementation
+        public static void show(DevelopmentSettingsDashboardFragment host) {
+            DisableDevSettingsDialogFragment mFragment =
+                    spy(DisableDevSettingsDialogFragment.newInstance());
+            FragmentController.setupFragment(mFragment, FragmentActivity.class,
+                    0 /* containerViewId */, null /* bundle */);
+        }
+    }
+
     @Implements(PictureColorModePreferenceController.class)
     public static class ShadowPictureColorModePreferenceController {
         @Implementation
diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
index 859912a..57f0ebb 100644
--- a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
@@ -209,6 +209,7 @@
 
     @Test
     public void onCreatePreferences_useNewTitle_shouldAddColorModePreferences() {
+        when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
         doNothing().when(mFragment).addPreferencesFromResource(anyInt());
         doNothing().when(mFragment).updateCandidates();
 
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java
index 08631f7..b3f9411 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java
@@ -16,13 +16,20 @@
 
 package com.android.settings.homepage.contextualcards;
 
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import android.content.Context;
 import android.content.Intent;
+import android.net.Uri;
+import android.os.UserHandle;
 
+import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -31,6 +38,9 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 public class ContextualCardFeatureProviderImplTest {
 
@@ -48,7 +58,7 @@
         final Intent intent = new Intent();
         mImpl.sendBroadcast(mContext, intent);
 
-        verify(mContext, never()).sendBroadcast(intent);
+        verify(mContext, never()).sendBroadcastAsUser(intent, UserHandle.ALL);
     }
 
     @Test
@@ -57,6 +67,37 @@
         final Intent intent = new Intent();
         mImpl.sendBroadcast(mContext, intent);
 
-        verify(mContext).sendBroadcast(intent);
+        verify(mContext).sendBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void logContextualCardDisplay_hasAction_sendBroadcast() {
+        mImpl.logContextualCardDisplay(mContext, new ArrayList<>(), new ArrayList<>());
+
+        verify(mContext).sendBroadcastAsUser(any(Intent.class), any());
+    }
+
+    @Test
+    public void serialize_hasSizeTwo_returnSizeTwo() {
+        final List<ContextualCard> cards = new ArrayList<>();
+        cards.add(new ContextualCard.Builder()
+                .setName("name1")
+                .setSliceUri(Uri.parse("uri1"))
+                .build());
+        cards.add(new ContextualCard.Builder()
+                .setName("name2")
+                .setSliceUri(Uri.parse("uri2"))
+                .build());
+
+
+        final byte[] data = mImpl.serialize(cards);
+
+        try {
+            assertThat(ContextualCardList
+                    .parseFrom(data).getCardCount()).isEqualTo(cards.size());
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
     }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
index 3eae266..b431c0a 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeAutomaticRulesPreferenceControllerTest.java
@@ -144,7 +144,7 @@
         mockGetAutomaticZenRules(NUM_RULES, rMap);
         FieldSetter.setField(mZenRulePreference, ZenRulePreference.class.getDeclaredField("mId"), testId);
         mController.updateState(mockPref);
-        verify(mZenRulePreference, times(1)).setChecked(false);
+        verify(mZenRulePreference, times(1)).updatePreference(any());
         verify(mController, never()).reloadAllRules(any());
     }
 
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModePriorityCallsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModePriorityCallsPreferenceControllerTest.java
index 36a1382..7131250 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModePriorityCallsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModePriorityCallsPreferenceControllerTest.java
@@ -30,6 +30,9 @@
 import android.content.Context;
 import android.provider.Settings;
 
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -43,9 +46,6 @@
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.util.ReflectionHelpers;
 
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 public class ZenModePriorityCallsPreferenceControllerTest {
 
@@ -86,8 +86,8 @@
 
         when(mBackend.getPriorityCallSenders())
                 .thenReturn(NotificationManager.Policy.PRIORITY_SENDERS_STARRED);
-        when(mBackend.getContactsSummary(ZenModeBackend.SOURCE_NONE))
-                .thenCallRealMethod();
+        when(mBackend.getAlarmsTotalSilenceCallsMessagesSummary(
+                NotificationManager.Policy.PRIORITY_CATEGORY_CALLS)).thenCallRealMethod();
         when(mBackend.getContactsSummary(NotificationManager.Policy.PRIORITY_CATEGORY_CALLS))
                 .thenCallRealMethod();
 
@@ -110,7 +110,7 @@
         mController.updateState(mockPref);
 
         verify(mockPref).setEnabled(false);
-        verify(mockPref).setSummary(R.string.zen_mode_from_none);
+        verify(mockPref).setSummary(R.string.zen_mode_from_none_calls);
     }
 
     @Test
@@ -121,7 +121,7 @@
         mController.updateState(mockPref);
 
         verify(mockPref).setEnabled(false);
-        verify(mockPref).setSummary(R.string.zen_mode_from_none);
+        verify(mockPref).setSummary(R.string.zen_mode_from_none_calls);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceControllerTest.java
index 75605a4..7b6698d 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModePriorityMessagesPreferenceControllerTest.java
@@ -30,6 +30,9 @@
 import android.content.Context;
 import android.provider.Settings;
 
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -43,9 +46,6 @@
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.util.ReflectionHelpers;
 
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 public class ZenModePriorityMessagesPreferenceControllerTest {
 
@@ -86,8 +86,8 @@
 
         when(mBackend.getPriorityMessageSenders())
             .thenReturn(NotificationManager.Policy.PRIORITY_SENDERS_STARRED);
-        when(mBackend.getContactsSummary(ZenModeBackend.SOURCE_NONE))
-                .thenCallRealMethod();
+        when(mBackend.getAlarmsTotalSilenceCallsMessagesSummary(
+                NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES)).thenCallRealMethod();
         when(mBackend.getContactsSummary(NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES))
                 .thenCallRealMethod();
 
@@ -110,7 +110,7 @@
         mController.updateState(mockPref);
 
         verify(mockPref).setEnabled(false);
-        verify(mockPref).setSummary(R.string.zen_mode_from_none);
+        verify(mockPref).setSummary(R.string.zen_mode_from_none_messages);
     }
 
     @Test
@@ -121,7 +121,7 @@
         mController.updateState(mockPref);
 
         verify(mockPref).setEnabled(false);
-        verify(mockPref).setSummary(R.string.zen_mode_from_none);
+        verify(mockPref).setSummary(R.string.zen_mode_from_none_messages);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
index 4fc7d57..53032ac 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
@@ -71,20 +71,20 @@
     @Test
     public void testGetCallsSettingSummary_none() {
         Policy policy = new Policy(0, 0, 0, 0);
-        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("None");
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("Don\u2019t allow any calls");
     }
 
     @Test
     public void testGetCallsSettingSummary_contacts() {
         Policy policy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS | Policy.PRIORITY_CATEGORY_CALLS,
                 Policy.PRIORITY_SENDERS_CONTACTS, 0, 0);
-        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("From contacts");
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("Allow from contacts");
     }
 
     @Test
     public void testGetCallsSettingSummary_repeatCallers() {
         Policy policy = new Policy(Policy.PRIORITY_CATEGORY_REPEAT_CALLERS, 0, 0, 0);
-        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("From repeat callers");
+        assertThat(mBuilder.getCallsSettingSummary(policy)).isEqualTo("Allow from repeat callers");
     }
 
     @Test
@@ -93,7 +93,7 @@
                 Policy.PRIORITY_CATEGORY_REPEAT_CALLERS | Policy.PRIORITY_CATEGORY_CALLS,
                 Policy.PRIORITY_SENDERS_STARRED, 0, 0);
         assertThat(mBuilder.getCallsSettingSummary(policy))
-                .isEqualTo("From starred contacts and repeat callers");
+                .isEqualTo("Allow from starred contacts and repeat callers");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index f9937f4..821d383 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -505,6 +505,19 @@
         assertThat(actualIconResource).isEqualTo(settingsIcon);
     }
 
+    @Test
+    public void getSafeIcon_invalidResource_shouldFallbackToSettingsIcon() {
+        final int settingsIcon = R.drawable.ic_settings;
+        final int badIcon = 0x12345678;
+        final SliceData data = getDummyData(TOGGLE_CONTROLLER, SliceData.SliceType.SWITCH,
+                badIcon);
+
+        final IconCompat actualIcon = SliceBuilderUtils.getSafeIcon(mContext, data);
+
+        final int actualIconResource = actualIcon.toIcon().getResId();
+        assertThat(actualIconResource).isEqualTo(settingsIcon);
+    }
+
     private SliceData getDummyData() {
         return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
                 ICON, IS_DYNAMIC_SUMMARY_ALLOWED);
diff --git a/tests/robotests/src/com/android/settings/widget/FloatingAppBarScrollingViewBehaviorTest.java b/tests/robotests/src/com/android/settings/widget/FloatingAppBarScrollingViewBehaviorTest.java
new file mode 100644
index 0000000..6acc4d9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/FloatingAppBarScrollingViewBehaviorTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import com.google.android.material.appbar.AppBarLayout;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class FloatingAppBarScrollingViewBehaviorTest {
+
+    private FloatingAppBarScrollingViewBehavior mScrollingViewBehavior;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mScrollingViewBehavior = new FloatingAppBarScrollingViewBehavior(mContext,
+                Robolectric.buildAttributeSet().build());
+    }
+
+    @Test
+    public void shouldHeaderOverlapScrollingChild_returnTrue() {
+        assertThat(mScrollingViewBehavior.shouldHeaderOverlapScrollingChild()).isTrue();
+    }
+
+    @Test
+    public void setAppBarLayoutTransparent_backgroundDefaultAsWhite_shouldBeTransparent() {
+        mContext.setTheme(R.style.Theme_Settings_Home);
+        final AppBarLayout appBarLayout = new AppBarLayout(mContext);
+        appBarLayout.setBackgroundColor(Color.WHITE);
+        mScrollingViewBehavior.setAppBarLayoutTransparent(appBarLayout);
+        assertThat(((ColorDrawable) appBarLayout.getBackground()).getColor()).isEqualTo(
+                Color.TRANSPARENT);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
index 64352d9..55d212f 100644
--- a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
@@ -18,6 +18,7 @@
 
 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.spy;
 import static org.mockito.Mockito.verify;
@@ -37,7 +38,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
+import org.mockito.InOrder;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 
@@ -99,6 +102,26 @@
     }
 
     @Test
+    public void staticPreferencesPrepended_addedFirst() {
+        mFragment.mAppendStaticPreferences = false;
+        mFragment.updateCandidates();
+
+        InOrder inOrder = Mockito.inOrder(mFragment);
+        inOrder.verify(mFragment).addStaticPreferences(any());
+        inOrder.verify(mFragment).getRadioButtonPreferenceCustomLayoutResId();
+    }
+
+    @Test
+    public void staticPreferencesAppended_addedLast() {
+        mFragment.mAppendStaticPreferences = true;
+        mFragment.updateCandidates();
+
+        InOrder inOrder = Mockito.inOrder(mFragment);
+        inOrder.verify(mFragment).mayCheckOnlyRadioButton();
+        inOrder.verify(mFragment).addStaticPreferences(any());
+    }
+
+    @Test
     public void shouldHaveNoCustomPreferenceLayout() {
         assertThat(mFragment.getRadioButtonPreferenceCustomLayoutResId()).isEqualTo(0);
     }