Merge "RuntimePermissionUsageInfo.getName() now returns a String."
diff --git a/Android.mk b/Android.mk
index 283575d..e385b34 100644
--- a/Android.mk
+++ b/Android.mk
@@ -49,7 +49,6 @@
     settings-contextual-card-protos-lite \
     contextualcards \
     settings-logtags \
-    statsdprotolite \
     zxing-core-1.7
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5b78681..6744b41 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -340,7 +340,7 @@
                   android:clearTaskOnLaunch="true"
                   android:excludeFromRecents="true"
                   android:exported="true"
-                  android:permission="android.permission.CONNECTIVITY_INTERNAL"
+                  android:permission="android.permission.NETWORK_STACK"
                   android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
             <intent-filter>
                 <action android:name="android.net.conn.PROMPT_UNVALIDATED" />
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 3b34728..7ab18a4 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -1317,6 +1317,230 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_1&quot;>#48a50e0e&lt;/color> &lt;!-- 72% Material Red 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="144"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_2&quot;>#480d652d&lt;/color> &lt;!-- 72% Material Green 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="145"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_3&quot;>#48e37400&lt;/color> &lt;!-- 72% Material Yellow 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="146"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_4&quot;>#48b06000&lt;/color> &lt;!-- 72% Material Orange 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="147"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_5&quot;>#489c166b&lt;/color> &lt;!-- 72% Material Pink 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="148"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_6&quot;>#48681da8&lt;/color> &lt;!-- 72% Material Purple 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="149"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_icon_7&quot;>#48007b83&lt;/color> &lt;!-- 72% Material Cyan 900 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="150"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_1&quot;>#fad2cf&lt;/color> &lt;!-- Material Red 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="152"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_2&quot;>#ceead6&lt;/color> &lt;!-- Material Green 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="153"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_3&quot;>#feefc3&lt;/color> &lt;!-- Material Yellow 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="154"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_4&quot;>#fedfc8&lt;/color> &lt;!-- Material Orange 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="155"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_5&quot;>#fdcfe8&lt;/color> &lt;!-- Material Pink 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="156"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_6&quot;>#e9d2fd&lt;/color> &lt;!-- Material Purple 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="157"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;bt_color_bg_7&quot;>#cbf0f8&lt;/color> &lt;!-- Material Cyan 100 -->"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="158"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="                android:background=&quot;@color/lock_pattern_background&quot; />"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2537,7 +2761,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/strings.xml"
-            line="6026"
+            line="6020"
             column="36"/>
     </issue>
 
diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
index b2badf5..ca8791f 100644
--- a/res/layout/homepage_slice_tile.xml
+++ b/res/layout/homepage_slice_tile.xml
@@ -31,7 +31,6 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
-            android:animateLayoutChanges="true"
             android:importantForAccessibility="no"
             style="@style/SliceViewStyle"/>
 
diff --git a/res/layout/preference.xml b/res/layout/preference.xml
index 195671b..db96139 100644
--- a/res/layout/preference.xml
+++ b/res/layout/preference.xml
@@ -54,6 +54,10 @@
 
     </RelativeLayout>
 
+    <include
+        layout="@layout/preference_two_target_divider"
+        android:visibility="gone"/>
+
     <LinearLayout
         android:id="@android:id/widget_frame"
         android:layout_width="wrap_content"
diff --git a/res/layout/slice_preference_layout.xml b/res/layout/slice_preference_layout.xml
index ae58901..4cea9c0 100644
--- a/res/layout/slice_preference_layout.xml
+++ b/res/layout/slice_preference_layout.xml
@@ -25,5 +25,5 @@
     <androidx.slice.widget.SliceView
         android:id="@+id/slice_view"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/slice_preference_group_height"/>
+        android:layout_height="wrap_content"/>
 </FrameLayout>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 7e0ba10..521d709 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1378,4 +1378,25 @@
          <item>@string/wifi_calling_mode_cellular_preferred_summary</item>
     </string-array>
 
+    <!-- Bluetooth icon foreground colors -->
+    <integer-array name="bt_icon_fg_colors">
+        <item>@color/bt_color_icon_1</item>
+        <item>@color/bt_color_icon_2</item>
+        <item>@color/bt_color_icon_3</item>
+        <item>@color/bt_color_icon_4</item>
+        <item>@color/bt_color_icon_5</item>
+        <item>@color/bt_color_icon_6</item>
+        <item>@color/bt_color_icon_7</item>
+    </integer-array>
+
+    <!-- Bluetooth icon background colors -->
+    <integer-array name="bt_icon_bg_colors">
+        <item>@color/bt_color_bg_1</item>
+        <item>@color/bt_color_bg_2</item>
+        <item>@color/bt_color_bg_3</item>
+        <item>@color/bt_color_bg_4</item>
+        <item>@color/bt_color_bg_5</item>
+        <item>@color/bt_color_bg_6</item>
+        <item>@color/bt_color_bg_7</item>
+    </integer-array>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index acfa23f..59ed4c4 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -140,4 +140,20 @@
     <color name="qr_focused_corner_line_color">#ff1a73e8</color>
     <color name="qr_background_color">#b3ffffff</color> <!-- 70% white transparency -->
     <!-- End of QR code scanner colors -->
+
+    <color name="bt_color_icon_1">#48a50e0e</color> <!-- 72% Material Red 900 -->
+    <color name="bt_color_icon_2">#480d652d</color> <!-- 72% Material Green 900 -->
+    <color name="bt_color_icon_3">#48e37400</color> <!-- 72% Material Yellow 900 -->
+    <color name="bt_color_icon_4">#48b06000</color> <!-- 72% Material Orange 900 -->
+    <color name="bt_color_icon_5">#489c166b</color> <!-- 72% Material Pink 900 -->
+    <color name="bt_color_icon_6">#48681da8</color> <!-- 72% Material Purple 900 -->
+    <color name="bt_color_icon_7">#48007b83</color> <!-- 72% Material Cyan 900 -->
+
+    <color name="bt_color_bg_1">#fad2cf</color> <!-- Material Red 100 -->
+    <color name="bt_color_bg_2">#ceead6</color> <!-- Material Green 100 -->
+    <color name="bt_color_bg_3">#feefc3</color> <!-- Material Yellow 100 -->
+    <color name="bt_color_bg_4">#fedfc8</color> <!-- Material Orange 100 -->
+    <color name="bt_color_bg_5">#fdcfe8</color> <!-- Material Pink 100 -->
+    <color name="bt_color_bg_6">#e9d2fd</color> <!-- Material Purple 100 -->
+    <color name="bt_color_bg_7">#cbf0f8</color> <!-- Material Cyan 100 -->
 </resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ef6fc4f..248fb81 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -404,7 +404,4 @@
 
     <!-- Wi-Fi DPP fragment icon size -->
     <dimen name="wifi_dpp_fragment_icon_width_height">48dp</dimen>
-
-    <!-- Height for slice preference, which contains 6 items at most -->
-    <dimen name="slice_preference_group_height">360dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ea2a7f6..a55fca3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2220,6 +2220,8 @@
 
     <!-- Dialog text to tell the user that the selected network does not have Internet access. -->
     <string name="no_internet_access_text">This network has no internet access. Stay connected?</string>
+    <!-- Dialog text to tell the user that the selected network has incomplete Internet access. [CHAR LIMIT=100] -->
+    <string name="partial_connectivity_text">Some apps and services may not work due to limited connectivity. Use anyway?</string>
     <string name="no_internet_access_remember">Don\u2019t ask again for this network</string>
 
     <!-- Dialog text to tell the user that the selected network has lost Internet access, and asking the user whether they want to avoid this network. -->
@@ -2242,6 +2244,8 @@
     <string name="wifi_disconnect">@string/bluetooth_device_context_disconnect</string>
     <!-- Failured notification for connect -->
     <string name="wifi_failed_connect_message">Failed to connect to network</string>
+    <!-- Not in range notification for connect [CHAR LIMIT=40] -->
+    <string name="wifi_not_in_range_message">Network not in range</string>
     <!-- Button label to delete a Wi-Fi network -->
     <string name="wifi_forget">Forget</string>
     <!-- Button label to modify a Wi-Fi network -->
@@ -4190,6 +4194,8 @@
     <string name="uninstall_all_users_text">Uninstall for all users</string>
     <!-- [CHAR LIMIT=NONE] Manage applications, individual application info screen, button label under Storage heading. Button to install an application for the user. -->
     <string name="install_text">Install</string>
+    <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to disable an existing application. -->
+    <string name="disable_text">Disable</string>
     <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
     <string name="enable_text">Enable</string>
     <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for example, remove all cached emails for an Email app) -->
@@ -4328,9 +4334,9 @@
     <!-- Manage applications. application installation location summary -->
     <string name="app_install_location_summary">Change the preferred installation location for new apps</string>
     <!-- [CHAR LIMIT=30] Manage applications, label for option to disable app -->
-    <string name="app_disable_dlg_positive">Uninstall app</string>
-    <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling apps -->
-    <string name="app_disable_dlg_text">If you uninstall this app, Android and other apps may no longer function as intended.</string>
+    <string name="app_disable_dlg_positive">Disable app</string>
+    <!-- [CHAR LIMIT=NONE] Manage applications, text for dialog when disabling apps -->
+    <string name="app_disable_dlg_text">If you disable this app, Android and other apps may no longer function as intended. Keep in mind, you can\u2019t delete this app since it came pre-installed on your device. By disabling, you turn this app off and hide it on your device.</string>
     <!-- [CHAR LIMIT=30] Manage applications, title for dialog when disabling notifications for an app -->
     <string name="app_disable_notifications_dlg_title">Turn off notifications?</string>
     <!-- Manage applications, individual application info screen, section heading for information about the app installer [CHAR_LIMIT=25] -->
@@ -7057,7 +7063,7 @@
     handle actions such as open web page, making phone calls, default SMS apps [CHAR  LIMIT=40]-->
     <string name="app_default_dashboard_title">Default apps</string>
     <!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
-    <string name="system_dashboard_summary">Languages, time, backup, updates</string>
+    <string name="system_dashboard_summary">Languages, gestures, time, backup</string>
 
     <!-- Search strings -->
     <!-- Text to describe the search results fragment title [CHAR LIMIT=16] -->
@@ -7676,6 +7682,18 @@
     <string name="profile_section_header">Work notifications</string>
 
     <!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
+    <string name="asst_capability_prioritizer_title">Automatic Notification Prioritizer</string>
+
+    <!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
+    <string name="asst_capability_prioritizer_summary">Automatically silence and demote less important notifications</string>
+
+    <!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
+    <string name="asst_capabilities_actions_replies_title">Smart actions and replies</string>
+
+    <!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
+    <string name="asst_capabilities_actions_replies_summary">Automatically add contextual notification actions and quick replies to notifications</string>
+
+    <!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
     <string name="hide_silent_icons_title">Hide silent notification status icons</string>
 
     <!-- Configure Notifications: setting summary [CHAR LIMIT=NONE] -->
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 38fa060..e2517d5 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -27,6 +27,18 @@
         settings:controller="com.android.settings.notification.NotificationAssistantPreferenceController"/>
 
     <SwitchPreference
+        android:key="asst_capability_prioritizer"
+        android:title="@string/asst_capability_prioritizer_title"
+        android:summary="@string/asst_capability_prioritizer_summary"
+        settings:controller="com.android.settings.notification.AssistantCapabilityPreferenceController" />
+
+    <SwitchPreference
+        android:key="asst_capabilities_actions_replies"
+        android:title="@string/asst_capabilities_actions_replies_title"
+        android:summary="@string/asst_capabilities_actions_replies_summary"
+        settings:controller="com.android.settings.notification.AssistantCapabilityPreferenceController" />
+
+    <SwitchPreference
         android:key="hide_silent_icons"
         android:title="@string/hide_silent_icons_title"
         android:summary="@string/hide_silent_icons_summary"
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 495d35c..6f6e6c4 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -1571,7 +1571,8 @@
     }
 
     private static boolean isDsdsSupported() {
-        return TelephonyManager.getDefault().isMultisimSupported();
+        return (TelephonyManager.getDefault().isMultiSimSupported()
+            == TelephonyManager.MULTISIM_ALLOWED);
     }
 
     private static boolean isDsdsEnabled() {
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
index 1881ca7..641d8ca 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
@@ -31,6 +31,9 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle.Event;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
@@ -40,9 +43,6 @@
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
 
 import java.util.Iterator;
 import java.util.List;
@@ -53,7 +53,7 @@
  * Controller that shows and updates the bluetooth device name
  */
 public class AccessibilityHearingAidPreferenceController extends BasePreferenceController
-        implements LifecycleObserver, OnResume, OnPause {
+        implements LifecycleObserver {
     private static final String TAG = "AccessibilityHearingAidPreferenceController";
     private Preference mHearingAidPreference;
 
@@ -104,7 +104,7 @@
         return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
-    @Override
+    @OnLifecycleEvent(Event.ON_RESUME)
     public void onResume() {
         if (mHearingAidProfileSupported) {
             IntentFilter filter = new IntentFilter();
@@ -114,7 +114,7 @@
         }
     }
 
-    @Override
+    @OnLifecycleEvent(Event.ON_PAUSE)
     public void onPause() {
         if (mHearingAidProfileSupported) {
             mContext.unregisterReceiver(mHearingAidChangedReceiver);
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index c661890..e118ed6 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -559,15 +559,15 @@
         if (mHomePackages.contains(mAppEntry.info.packageName)
                 || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) {
             // Disable button for core system applications.
-            mButtonsPref.setButton2Text(R.string.uninstall_text)
+            mButtonsPref.setButton2Text(R.string.disable_text)
                     .setButton2Icon(R.drawable.ic_settings_delete);
         } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) {
-            mButtonsPref.setButton2Text(R.string.uninstall_text)
+            mButtonsPref.setButton2Text(R.string.disable_text)
                     .setButton2Icon(R.drawable.ic_settings_delete);
             disableable = !mApplicationFeatureProvider.getKeepEnabledPackages()
                     .contains(mAppEntry.info.packageName);
         } else {
-            mButtonsPref.setButton2Text(R.string.install_text)
+            mButtonsPref.setButton2Text(R.string.enable_text)
                     .setButton2Icon(R.drawable.ic_settings_install);
             disableable = true;
         }
diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java
index b836e55..1d3455b 100644
--- a/src/com/android/settings/backup/BackupSettingsHelper.java
+++ b/src/com/android/settings/backup/BackupSettingsHelper.java
@@ -25,6 +25,7 @@
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.text.TextUtils;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -91,9 +92,9 @@
      *
      * @return Label for the backup settings item.
      */
-    public String getLabelForBackupSettings() {
-        String label = getLabelFromBackupTransport();
-        if (label == null || label.isEmpty()) {
+    public CharSequence getLabelForBackupSettings() {
+        CharSequence label = getLabelFromBackupTransport();
+        if (TextUtils.isEmpty(label)) {
             label = mContext.getString(R.string.privacy_settings_title);
         }
         return label;
@@ -222,10 +223,11 @@
     }
 
     @VisibleForTesting
-    String getLabelFromBackupTransport() {
+    CharSequence getLabelFromBackupTransport() {
         try {
-            String label =
-                    mBackupManager.getDataManagementLabel(mBackupManager.getCurrentTransport());
+            CharSequence label =
+                    mBackupManager.getDataManagementLabelForUser(
+                            UserHandle.myUserId(), mBackupManager.getCurrentTransport());
             if (Log.isLoggable(TAG, Log.DEBUG)) {
                 Log.d(TAG, "Received the backup settings label from backup transport: " + label);
             }
diff --git a/src/com/android/settings/backup/BackupSettingsPreferenceController.java b/src/com/android/settings/backup/BackupSettingsPreferenceController.java
index 2a657ea..4e0e3b4 100644
--- a/src/com/android/settings/backup/BackupSettingsPreferenceController.java
+++ b/src/com/android/settings/backup/BackupSettingsPreferenceController.java
@@ -31,7 +31,7 @@
     private static final String BACKUP_SETTINGS = "backup_settings";
     private static final  String MANUFACTURER_SETTINGS = "manufacturer_backup";
     private Intent mBackupSettingsIntent;
-    private String mBackupSettingsTitle;
+    private CharSequence mBackupSettingsTitle;
     private String mBackupSettingsSummary;
     private Intent mManufacturerIntent;
     private String mManufacturerLabel;
diff --git a/src/com/android/settings/backup/DataManagementPreferenceController.java b/src/com/android/settings/backup/DataManagementPreferenceController.java
index d19b866..34d51ac 100644
--- a/src/com/android/settings/backup/DataManagementPreferenceController.java
+++ b/src/com/android/settings/backup/DataManagementPreferenceController.java
@@ -48,7 +48,7 @@
             return;
         }
         preference.setIntent(mPSCD.getManageIntent());
-        final String manageLabel = mPSCD.getManageLabel();
+        final CharSequence manageLabel = mPSCD.getManageLabel();
         if (manageLabel != null) {
             preference.setTitle(manageLabel);
         }
diff --git a/src/com/android/settings/backup/PrivacySettingsConfigData.java b/src/com/android/settings/backup/PrivacySettingsConfigData.java
index ffe05b8..8bea11b 100644
--- a/src/com/android/settings/backup/PrivacySettingsConfigData.java
+++ b/src/com/android/settings/backup/PrivacySettingsConfigData.java
@@ -27,7 +27,7 @@
     private Intent mConfigIntent;
     private String mConfigSummary;
     private Intent mManageIntent;
-    private String mManageLabel;
+    private CharSequence mManageLabel;
 
     private PrivacySettingsConfigData() {
         mBackupEnabled = false;
@@ -85,11 +85,11 @@
         mManageIntent = manageIntent;
     }
 
-    public String getManageLabel() {
+    public CharSequence getManageLabel() {
         return mManageLabel;
     }
 
-    public void setManageLabel(final String manageLabel) {
+    public void setManageLabel(final CharSequence manageLabel) {
         mManageLabel = manageLabel;
     }
 }
diff --git a/src/com/android/settings/backup/PrivacySettingsUtils.java b/src/com/android/settings/backup/PrivacySettingsUtils.java
index f8f21dd..bb1108c 100644
--- a/src/com/android/settings/backup/PrivacySettingsUtils.java
+++ b/src/com/android/settings/backup/PrivacySettingsUtils.java
@@ -97,7 +97,8 @@
             data.setConfigSummary(backupManager.getDestinationString(transport));
             data.setManageIntent(validatedActivityIntent(context,
                     backupManager.getDataManagementIntent(transport), "management"));
-            data.setManageLabel(backupManager.getDataManagementLabel(transport));
+            data.setManageLabel(
+                    backupManager.getDataManagementLabelForUser(UserHandle.myUserId(), transport));
             data.setBackupGray(false);
         } catch (RemoteException e) {
             // leave it 'false' and disable the UI; there's no backup manager
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index fd805b8..3860352 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -26,7 +26,6 @@
 
 import com.android.settings.R;
 import com.android.settings.widget.EntityHeaderController;
-import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -66,10 +65,8 @@
     }
 
     protected void setHeaderProperties() {
-        final Pair<Drawable, String> pair = BluetoothUtils
-                .getBtClassDrawableWithDescription(mContext, mCachedDevice,
-                        mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1,
-                                1));
+        final Pair<Drawable, String> pair = Utils.getBtRainbowDrawableWithDescription(mContext,
+                mCachedDevice);
         String summaryText = mCachedDevice.getConnectionSummary();
         // If both the hearing aids are connected, two device status should be shown.
         // If Second Summary is unavailable, to set it to null.
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index d4c0ed0..8d727eb 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -38,7 +38,6 @@
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.GearPreference;
-import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -130,8 +129,8 @@
         // Null check is done at the framework
         setSummary(mCachedDevice.getConnectionSummary());
 
-        final Pair<Drawable, String> pair = BluetoothUtils
-                .getBtClassDrawableWithDescription(getContext(), mCachedDevice);
+        final Pair<Drawable, String> pair = Utils
+                .getBtRainbowDrawableWithDescription(getContext(), mCachedDevice);
         if (pair.first != null) {
             setIcon(pair.first);
             contentDescription = pair.second;
@@ -246,5 +245,4 @@
                     R.string.bluetooth_pairing_error_message);
         }
     }
-
 }
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index ff4a98f..e02ddc4 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -21,8 +21,12 @@
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
 import android.provider.Settings;
 import android.util.Log;
+import android.util.Pair;
 import android.widget.Toast;
 
 import androidx.annotation.VisibleForTesting;
@@ -30,8 +34,10 @@
 
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.widget.AdaptiveIcon;
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
 
@@ -179,4 +185,25 @@
             return META_INT_ERROR;
         }
     }
+
+    /**
+     * Get colorful bluetooth icon with description
+     */
+    public static Pair<Drawable, String> getBtRainbowDrawableWithDescription(Context context,
+            CachedBluetoothDevice cachedDevice) {
+        final Pair<Drawable, String> pair = BluetoothUtils.getBtClassDrawableWithDescription(
+                context, cachedDevice);
+        final Resources resources = context.getResources();
+        final int[] iconFgColors = resources.getIntArray(R.array.bt_icon_fg_colors);
+        final int[] iconBgColors = resources.getIntArray(R.array.bt_icon_bg_colors);
+
+        // get color index based on mac address
+        final int index =  Math.abs(cachedDevice.getAddress().hashCode()) % iconBgColors.length;
+        pair.first.setColorFilter(iconFgColors[index], PorterDuff.Mode.SRC_ATOP);
+        final Drawable adaptiveIcon = new AdaptiveIcon(context, pair.first);
+        ((AdaptiveIcon) adaptiveIcon).setBackgroundColor(iconBgColors[index]);
+
+        return new Pair<>(adaptiveIcon, pair.second);
+    }
+
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 6348b91..744cbd2 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -46,7 +46,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.AdaptiveHomepageIcon;
+import com.android.settings.widget.AdaptiveIcon;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
@@ -197,8 +197,8 @@
             Drawable iconDrawable = tileIcon.loadDrawable(preference.getContext());
             if (forceRoundedIcon
                     && !TextUtils.equals(mContext.getPackageName(), tile.getPackageName())) {
-                iconDrawable = new AdaptiveHomepageIcon(mContext, iconDrawable);
-                ((AdaptiveHomepageIcon) iconDrawable).setBackgroundColor(mContext, tile);
+                iconDrawable = new AdaptiveIcon(mContext, iconDrawable);
+                ((AdaptiveIcon) iconDrawable).setBackgroundColor(mContext, tile);
             }
             preference.setIcon(iconDrawable);
         } else if (tile.getMetaData() != null
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index d95320f..a014c29 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -174,7 +174,8 @@
             return;
         }
 
-        mTelephonyManager.listen(mPhoneStateListener,
+        mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
+                .listen(mPhoneStateListener,
                 PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                         | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
                         | PhoneStateListener.LISTEN_SERVICE_STATE);
@@ -197,8 +198,8 @@
             return;
         }
 
-        mTelephonyManager.listen(mPhoneStateListener,
-                PhoneStateListener.LISTEN_NONE);
+        mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
+                .listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
 
         if (mShowLatestAreaInfo) {
             mContext.unregisterReceiver(mAreaInfoReceiver);
@@ -432,8 +433,7 @@
 
     @VisibleForTesting
     PhoneStateListener getPhoneStateListener() {
-        return new PhoneStateListener(
-                mSubscriptionInfo.getSubscriptionId()) {
+        return new PhoneStateListener() {
             @Override
             public void onDataConnectionStateChanged(int state) {
                 updateDataState(state);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index f75588c..bb69999 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -59,7 +59,7 @@
         mDatabaseHelper = AnomalyDatabaseHelper.getInstance(context);
     }
 
-    public static BatteryDatabaseManager getInstance(Context context) {
+    public static synchronized BatteryDatabaseManager getInstance(Context context) {
         if (sSingleton == null) {
             sSingleton = new BatteryDatabaseManager(context);
         }
@@ -84,15 +84,15 @@
     public synchronized boolean insertAnomaly(int uid, String packageName, int type,
             int anomalyState,
             long timestampMs) {
-        try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
-            ContentValues values = new ContentValues();
-            values.put(UID, uid);
-            values.put(PACKAGE_NAME, packageName);
-            values.put(ANOMALY_TYPE, type);
-            values.put(ANOMALY_STATE, anomalyState);
-            values.put(TIME_STAMP_MS, timestampMs);
-            return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
-        }
+        final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+        ContentValues values = new ContentValues();
+        values.put(UID, uid);
+        values.put(PACKAGE_NAME, packageName);
+        values.put(ANOMALY_TYPE, type);
+        values.put(ANOMALY_STATE, anomalyState);
+        values.put(TIME_STAMP_MS, timestampMs);
+
+        return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
     }
 
     /**
@@ -100,43 +100,41 @@
      */
     public synchronized List<AppInfo> queryAllAnomalies(long timestampMsAfter, int state) {
         final List<AppInfo> appInfos = new ArrayList<>();
-        try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
-            final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
-            final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
-            final Map<Integer, AppInfo.Builder> mAppInfoBuilders = new ArrayMap<>();
-            final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
-            final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
-                    String.valueOf(state)};
+        final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+        final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
+        final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
+        final Map<Integer, AppInfo.Builder> mAppInfoBuilders = new ArrayMap<>();
+        final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
+        final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
+                String.valueOf(state)};
 
-            try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
-                    null /* groupBy */, null /* having */, orderBy)) {
-                while (cursor.moveToNext()) {
-                    final int uid = cursor.getInt(cursor.getColumnIndex(UID));
-                    if (!mAppInfoBuilders.containsKey(uid)) {
-                        final AppInfo.Builder builder = new AppInfo.Builder()
-                                .setUid(uid)
-                                .setPackageName(
-                                        cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
-                        mAppInfoBuilders.put(uid, builder);
-                    }
-                    mAppInfoBuilders.get(uid).addAnomalyType(
-                            cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
+        try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
+                null /* groupBy */, null /* having */, orderBy)) {
+            while (cursor.moveToNext()) {
+                final int uid = cursor.getInt(cursor.getColumnIndex(UID));
+                if (!mAppInfoBuilders.containsKey(uid)) {
+                    final AppInfo.Builder builder = new AppInfo.Builder()
+                            .setUid(uid)
+                            .setPackageName(
+                                    cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
+                    mAppInfoBuilders.put(uid, builder);
                 }
+                mAppInfoBuilders.get(uid).addAnomalyType(
+                        cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
             }
+        }
 
-            for (Integer uid : mAppInfoBuilders.keySet()) {
-                appInfos.add(mAppInfoBuilders.get(uid).build());
-            }
+        for (Integer uid : mAppInfoBuilders.keySet()) {
+            appInfos.add(mAppInfoBuilders.get(uid).build());
         }
 
         return appInfos;
     }
 
     public synchronized void deleteAllAnomaliesBeforeTimeStamp(long timestampMs) {
-        try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
-            db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
-                    new String[]{String.valueOf(timestampMs)});
-        }
+        final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+        db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
+                new String[]{String.valueOf(timestampMs)});
     }
 
     /**
@@ -152,12 +150,12 @@
             for (int i = 0; i < size; i++) {
                 whereArgs[i] = appInfos.get(i).packageName;
             }
-            try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
-                final ContentValues values = new ContentValues();
-                values.put(ANOMALY_STATE, state);
-                db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
-                        Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
-            }
+
+            final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+            final ContentValues values = new ContentValues();
+            values.put(ANOMALY_STATE, state);
+            db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
+                    Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
         }
     }
 
@@ -170,21 +168,20 @@
     public synchronized SparseLongArray queryActionTime(
             @AnomalyDatabaseHelper.ActionType int type) {
         final SparseLongArray timeStamps = new SparseLongArray();
-        try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
-            final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
-            final String selection = ActionColumns.ACTION_TYPE + " = ? ";
-            final String[] selectionArgs = new String[]{String.valueOf(type)};
+        final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+        final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
+        final String selection = ActionColumns.ACTION_TYPE + " = ? ";
+        final String[] selectionArgs = new String[]{String.valueOf(type)};
 
-            try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
-                    null /* groupBy */, null /* having */, null /* orderBy */)) {
-                final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
-                final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
+        try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
+                null /* groupBy */, null /* having */, null /* orderBy */)) {
+            final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
+            final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
 
-                while (cursor.moveToNext()) {
-                    final int uid = cursor.getInt(uidIndex);
-                    final long timeStamp = cursor.getLong(timestampIndex);
-                    timeStamps.append(uid, timeStamp);
-                }
+            while (cursor.moveToNext()) {
+                final int uid = cursor.getInt(uidIndex);
+                final long timeStamp = cursor.getLong(timestampIndex);
+                timeStamps.append(uid, timeStamp);
             }
         }
 
@@ -196,14 +193,14 @@
      */
     public synchronized boolean insertAction(@AnomalyDatabaseHelper.ActionType int type,
             int uid, String packageName, long timestampMs) {
-        try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
-            final ContentValues values = new ContentValues();
-            values.put(ActionColumns.UID, uid);
-            values.put(ActionColumns.PACKAGE_NAME, packageName);
-            values.put(ActionColumns.ACTION_TYPE, type);
-            values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
-            return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
-        }
+        final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+        final ContentValues values = new ContentValues();
+        values.put(ActionColumns.UID, uid);
+        values.put(ActionColumns.PACKAGE_NAME, packageName);
+        values.put(ActionColumns.ACTION_TYPE, type);
+        values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
+
+        return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
     }
 
     /**
@@ -211,14 +208,13 @@
      */
     public synchronized boolean deleteAction(@AnomalyDatabaseHelper.ActionType int type,
             int uid, String packageName) {
-        try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
-            final String where =
-                    ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
-                            + ActionColumns.PACKAGE_NAME + " = ? ";
-            final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
-                    String.valueOf(packageName)};
+        SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+        final String where =
+                ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
+                        + ActionColumns.PACKAGE_NAME + " = ? ";
+        final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
+                String.valueOf(packageName)};
 
-            return db.delete(TABLE_ACTION, where, whereArgs) != 0;
-        }
+        return db.delete(TABLE_ACTION, where, whereArgs) != 0;
     }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 1f5f7dd..32f505e 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -17,8 +17,8 @@
 package com.android.settings.homepage.contextualcards;
 
 import static com.android.settings.slices.CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI;
+import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI;
 import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI;
-import static com.android.settings.slices.CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI;
 
 import android.content.Context;
 import android.database.ContentObserver;
@@ -208,7 +208,7 @@
     private boolean isLargeCard(ContextualCard card) {
         return card.getSliceUri().equals(CONTEXTUAL_WIFI_SLICE_URI)
                 || card.getSliceUri().equals(BLUETOOTH_DEVICES_SLICE_URI)
-                || card.getSliceUri().equals(NOTIFICATION_CHANNEL_SLICE_URI);
+                || card.getSliceUri().equals(CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI);
     }
 
     public interface CardContentLoaderListener {
diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
index 7bbe430..86fee03 100644
--- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
@@ -56,10 +56,12 @@
                         .setCardName(CustomSliceRegistry.BATTERY_FIX_SLICE_URI.toString())
                         .setCardCategory(ContextualCard.Category.IMPORTANT)
                         .build();
+        final String contextualNotificationChannelSliceUri =
+                CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI.toString();
         final ContextualCard notificationChannelCard =
                 ContextualCard.newBuilder()
-                        .setSliceUri(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI.toString())
-                        .setCardName(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI.toString())
+                        .setSliceUri(contextualNotificationChannelSliceUri)
+                        .setCardName(contextualNotificationChannelSliceUri)
                         .setCardCategory(ContextualCard.Category.POSSIBLE)
                         .build();
         final ContextualCardList cards = ContextualCardList.newBuilder()
@@ -72,4 +74,4 @@
 
         return cards;
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 99fe219..a760eff 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -46,7 +46,6 @@
 import com.android.settings.slices.CustomSliceable;
 import com.android.settings.slices.SliceBroadcastReceiver;
 import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -211,8 +210,9 @@
 
     @VisibleForTesting
     IconCompat getBluetoothDeviceIcon(CachedBluetoothDevice device) {
-        final Pair<Drawable, String> pair = BluetoothUtils
-                .getBtClassDrawableWithDescription(mContext, device);
+        final Pair<Drawable, String> pair =
+                com.android.settings.bluetooth.Utils.getBtRainbowDrawableWithDescription(mContext,
+                        device);
         final Drawable drawable = pair.first;
 
         // Use default bluetooth icon if can't get icon.
@@ -221,14 +221,6 @@
                     com.android.internal.R.drawable.ic_settings_bluetooth);
         }
 
-        // Tint icon: Accent color for connected state; Disable color for busy state.
-        @ColorInt int color = Utils.getColorAccentDefaultColor(mContext);
-        if (device.isBusy()) {
-            color = Utils.getDisabled(mContext,
-                    Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal));
-        }
-        drawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
-
         return Utils.createIconWithDrawable(drawable);
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java
new file mode 100644
index 0000000..2025a06
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 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.homepage.contextualcards.slices;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settings.R;
+import com.android.settings.slices.CustomSliceRegistry;
+
+public class ContextualNotificationChannelSlice extends NotificationChannelSlice {
+
+    public ContextualNotificationChannelSlice(Context context) {
+        super(context);
+    }
+
+    @Override
+    public Uri getUri() {
+        return CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI;
+    }
+
+    @Override
+    protected CharSequence getSubTitle(String packageName, int uid) {
+        return mContext.getText(R.string.recently_installed_app);
+    }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
index ae8b80a..c319dca 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
@@ -128,7 +128,7 @@
                 return leftChannel.getId().compareTo(rightChannel.getId());
             };
 
-    private final Context mContext;
+    protected final Context mContext;
     @VisibleForTesting
     NotificationBackend mNotificationBackend;
     private String mPackageName;
@@ -413,7 +413,7 @@
         return maxSentCountPackage;
     }
 
-    private CharSequence getSubTitle(String packageName, int uid) {
+    protected CharSequence getSubTitle(String packageName, int uid) {
         final int channelCount = mNotificationBackend.getChannelCount(packageName, uid);
 
         if (channelCount > DEFAULT_EXPANDED_ROW_COUNT) {
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
index ee63536..ef0a67d 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.homepage.contextualcards.slices;
 
-import android.animation.LayoutTransition;
 import android.content.Context;
 import android.view.View;
 
@@ -95,7 +94,6 @@
         public SliceViewHolder(View view) {
             super(view);
             sliceView = view.findViewById(R.id.slice_view);
-            sliceView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
         }
     }
 }
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index a76d381..e4c64f7 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -104,7 +104,7 @@
                         .setOnClickListener((v) -> {
                             final Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSION);
                             intent.putExtra(Intent.EXTRA_PERMISSION_NAME,
-                                    Manifest.permission_group.LOCATION);
+                                    Manifest.permission.ACCESS_FINE_LOCATION);
                             intent.putExtra(Intent.EXTRA_PACKAGE_NAME, access.packageName);
                             intent.putExtra(Intent.EXTRA_USER, access.userHandle);
                             mContext.startActivity(intent);
diff --git a/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java b/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
new file mode 100644
index 0000000..be90a04
--- /dev/null
+++ b/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.service.notification.Adjustment;
+
+import com.android.settings.core.TogglePreferenceController;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import java.util.List;
+
+public class AssistantCapabilityPreferenceController extends TogglePreferenceController {
+
+    static final String PRIORITIZER_KEY = "asst_capability_prioritizer";
+    static final String SMART_KEY = "asst_capabilities_actions_replies";
+    private NotificationBackend mBackend;
+
+    public AssistantCapabilityPreferenceController(Context context, String key) {
+        super(context, key);
+        mBackend = new NotificationBackend();
+    }
+
+    @VisibleForTesting
+    void setBackend(NotificationBackend backend) {
+        mBackend = backend;
+    }
+
+    @Override
+    public boolean isChecked() {
+        List<String> capabilities = mBackend.getAssistantCapabilities(mContext.getPackageName());
+        if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
+           return capabilities.contains(Adjustment.KEY_IMPORTANCE);
+        } else if (SMART_KEY.equals(getPreferenceKey())) {
+            return capabilities.contains(Adjustment.KEY_CONTEXTUAL_ACTIONS)
+                    && capabilities.contains(Adjustment.KEY_TEXT_REPLIES);
+        }
+        return false;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
+            mBackend.allowAssistantCapability(Adjustment.KEY_IMPORTANCE, isChecked);
+        } else if (SMART_KEY.equals(getPreferenceKey())) {
+            mBackend.allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, isChecked);
+            mBackend.allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, isChecked);
+        }
+        return true;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mBackend.getAllowedNotificationAssistant() != null
+                ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
+    }
+}
+
+
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index ba07438..4227050 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -339,6 +339,27 @@
         }
     }
 
+    public void allowAssistantCapability(String capability, boolean allowed) {
+        try {
+            if (allowed) {
+                sINM.allowAssistantCapability(capability);
+            } else {
+                sINM.disallowAssistantCapability(capability);
+            }
+        } catch (Exception e) {
+            Log.w(TAG, "Error calling NoMan", e);
+        }
+    }
+
+    public List<String> getAssistantCapabilities(String pkg) {
+        try {
+            return sINM.getAllowedAssistantCapabilities(pkg);
+        } catch (Exception e) {
+            Log.w(TAG, "Error calling NoMan", e);
+        }
+        return new ArrayList<>();
+    }
+
     protected void recordAggregatedUsageEvents(Context context, AppRow appRow) {
         long now = System.currentTimeMillis();
         long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK);
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index a222d36..20421d0 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -48,16 +48,11 @@
     private RecyclerView mPanelSlices;
 
     private PanelContent mPanel;
-    private final MetricsFeatureProvider mMetricsProvider;
+    private MetricsFeatureProvider mMetricsProvider;
 
     @VisibleForTesting
     PanelSlicesAdapter mAdapter;
 
-    public PanelFragment() {
-        final Context context = getActivity();
-        mMetricsProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-    }
-
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -83,6 +78,7 @@
                 .getPanelFeatureProvider()
                 .getPanel(activity, panelType, mediaPackageName);
 
+        mMetricsProvider = FeatureFactory.getFactory(activity).getMetricsFeatureProvider();
         // Log panel opened.
         mMetricsProvider.action(
                 0 /* attribution */,
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index b646b3b..e43c6a5 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -220,7 +220,7 @@
             Log.d(TAG, "Register for call state change");
             for (int i = 0; i < mPhoneCount; i++) {
                 int subId = mSelectableSubInfos.get(i).getSubscriptionId();
-                tm.listen(getPhoneStateListener(i, subId),
+                tm.createForSubscriptionId(subId).listen(getPhoneStateListener(i),
                         PhoneStateListener.LISTEN_CALL_STATE);
             }
         }
@@ -239,13 +239,13 @@
         }
     }
 
-    private PhoneStateListener getPhoneStateListener(int phoneId, int subId) {
+    private PhoneStateListener getPhoneStateListener(int phoneId) {
         // Disable Sim selection for Data when voice call is going on as changing the default data
         // sim causes a modem reset currently and call gets disconnected
         // ToDo : Add subtext on disabled preference to let user know that default data sim cannot
         // be changed while call is going on
         final int i = phoneId;
-        mPhoneStateListener[phoneId]  = new PhoneStateListener(subId) {
+        mPhoneStateListener[phoneId]  = new PhoneStateListener() {
             @Override
             public void onCallStateChanged(int state, String incomingNumber) {
                 if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index 6b1ead7..fe000d1 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -36,6 +36,7 @@
 import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
 import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
 import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
+import com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice;
 import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
 import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
 import com.android.settings.location.LocationSlice;
@@ -95,6 +96,16 @@
             .build();
 
     /**
+     * Backing Uri for Contextual Notification channel Slice.
+     */
+    public static final Uri CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI = new Uri.Builder()
+            .scheme(ContentResolver.SCHEME_CONTENT)
+            .authority(SettingsSliceProvider.SLICE_AUTHORITY)
+            .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+            .appendPath("contextual_notification_channel")
+            .build();
+
+    /**
      * Backing Uri for the Wifi Slice.
      */
     public static final Uri CONTEXTUAL_WIFI_SLICE_URI = new Uri.Builder()
@@ -318,6 +329,8 @@
 
         sUriToSlice.put(BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
         sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
+        sUriToSlice.put(CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI,
+                ContextualNotificationChannelSlice.class);
         sUriToSlice.put(CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
         sUriToSlice.put(DATA_USAGE_SLICE_URI, DataUsageSlice.class);
         sUriToSlice.put(DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
diff --git a/src/com/android/settings/widget/AdaptiveHomepageIcon.java b/src/com/android/settings/widget/AdaptiveIcon.java
similarity index 76%
rename from src/com/android/settings/widget/AdaptiveHomepageIcon.java
rename to src/com/android/settings/widget/AdaptiveIcon.java
index bc7aaa7..04b33ae 100644
--- a/src/com/android/settings/widget/AdaptiveHomepageIcon.java
+++ b/src/com/android/settings/widget/AdaptiveIcon.java
@@ -35,14 +35,15 @@
 import com.android.settings.homepage.AdaptiveIconShapeDrawable;
 import com.android.settingslib.drawer.Tile;
 
-public class AdaptiveHomepageIcon extends LayerDrawable {
+public class AdaptiveIcon extends LayerDrawable {
 
     private static final String TAG = "AdaptiveHomepageIcon";
 
     @VisibleForTesting(otherwise = NONE)
     int mBackgroundColor = -1;
+    private AdaptiveConstantState mAdaptiveConstantState;
 
-    public AdaptiveHomepageIcon(Context context, Drawable foreground) {
+    public AdaptiveIcon(Context context, Drawable foreground) {
         super(new Drawable[]{
                 new AdaptiveIconShapeDrawable(context.getResources()),
                 foreground
@@ -50,6 +51,7 @@
         final int insetPx = context.getResources()
                 .getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
         setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
+        mAdaptiveConstantState = new AdaptiveConstantState(context, foreground);
     }
 
     public void setBackgroundColor(Context context, Tile tile) {
@@ -85,5 +87,36 @@
         mBackgroundColor = color;
         getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
         Log.d(TAG, "Setting background color " + mBackgroundColor);
+        mAdaptiveConstantState.color = color;
+    }
+
+    @Override
+    public ConstantState getConstantState() {
+        return mAdaptiveConstantState;
+    }
+
+    @VisibleForTesting
+    static class AdaptiveConstantState extends ConstantState {
+        Context context;
+        Drawable drawable;
+        int color;
+
+        public AdaptiveConstantState(Context context, Drawable drawable) {
+            this.context = context;
+            this.drawable = drawable;
+        }
+
+        @Override
+        public Drawable newDrawable() {
+            final AdaptiveIcon icon = new AdaptiveIcon(context, drawable);
+            icon.setBackgroundColor(color);
+
+            return icon;
+        }
+
+        @Override
+        public int getChangingConfigurations() {
+            return 0;
+        }
     }
 }
diff --git a/src/com/android/settings/wifi/AddWifiNetworkPreference.java b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
index cd2e4a8..e49f2ab 100644
--- a/src/com/android/settings/wifi/AddWifiNetworkPreference.java
+++ b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
@@ -20,7 +20,6 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.util.Log;
-import android.view.View;
 import android.widget.ImageButton;
 
 import androidx.annotation.DrawableRes;
@@ -63,10 +62,6 @@
                 getContext().startActivity(
                     WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
             });
-
-            final View divider = (View) holder.findViewById(
-                    com.android.settingslib.R.id.two_target_divider);
-            divider.setVisibility(View.INVISIBLE);
         }
     }
 
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index 09360e4..28c6cb7 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -124,7 +124,7 @@
         final AlertDialog.Builder builder = new AlertDialog.Builder(context)
                 .setCustomTitle(customTitle)
                 .setAdapter(mDialogAdapter, this)
-                .setNegativeButton(R.string.cancel, (dialog, which) -> getActivity().finish())
+                .setNegativeButton(R.string.cancel, (dialog, which) -> onCancel(dialog))
                 // Do nothings, will replace the onClickListener to avoid auto closing dialog.
                 .setNeutralButton(R.string.network_connection_request_dialog_showall,
                         null /* OnClickListener */);
@@ -221,6 +221,9 @@
         if (getActivity() != null) {
             getActivity().finish();
         }
+        if (mUserSelectionCallback != null) {
+            mUserSelectionCallback.reject();
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/WifiNoInternetDialog.java b/src/com/android/settings/wifi/WifiNoInternetDialog.java
index e12529d..e33cab6 100644
--- a/src/com/android/settings/wifi/WifiNoInternetDialog.java
+++ b/src/com/android/settings/wifi/WifiNoInternetDialog.java
@@ -17,6 +17,7 @@
 package com.android.settings.wifi;
 
 import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION;
+import static android.net.ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY;
 import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 
@@ -53,8 +54,9 @@
     private String mAction;
 
     private boolean isKnownAction(Intent intent) {
-        return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) ||
-                intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION);
+        return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED)
+                || intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION)
+                || intent.getAction().equals(ACTION_PROMPT_PARTIAL_CONNECTIVITY);
     }
 
     @Override
@@ -131,6 +133,11 @@
             ap.mMessage = getString(R.string.no_internet_access_text);
             ap.mPositiveButtonText = getString(R.string.yes);
             ap.mNegativeButtonText = getString(R.string.no);
+        } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+            ap.mTitle = mNetworkName;
+            ap.mMessage = getString(R.string.partial_connectivity_text);
+            ap.mPositiveButtonText = getString(R.string.yes);
+            ap.mNegativeButtonText = getString(R.string.no);
         } else {
             ap.mTitle = getString(R.string.lost_internet_access_title);
             ap.mMessage = getString(R.string.lost_internet_access_text);
@@ -146,7 +153,8 @@
         ap.mView = checkbox;
         mAlwaysAllow = (CheckBox) checkbox.findViewById(com.android.internal.R.id.alwaysUse);
 
-        if (ACTION_PROMPT_UNVALIDATED.equals(mAction)) {
+        if (ACTION_PROMPT_UNVALIDATED.equals(mAction)
+                || ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
             mAlwaysAllow.setText(getString(R.string.no_internet_access_remember));
         } else {
             mAlwaysAllow.setText(getString(R.string.lost_internet_access_persist));
@@ -174,6 +182,11 @@
             final boolean accept = (which == BUTTON_POSITIVE);
             action = (accept ? "Connect" : "Ignore");
             mCM.setAcceptUnvalidated(mNetwork, accept, always);
+        } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+            what = "PARTIAL_CONNECTIVITY";
+            final boolean accept = (which == BUTTON_POSITIVE);
+            action = (accept ? "Connect" : "Ignore");
+            mCM.setAcceptPartialConnectivity(mNetwork, accept, always);
         } else {
             what = "LOST_INTERNET";
             final boolean avoid = (which == BUTTON_POSITIVE);
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 5588977..f328dba 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -16,6 +16,7 @@
 package com.android.settings.wifi.details;
 
 import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 
@@ -210,12 +211,14 @@
 
         @Override
         public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
-            // If the network just validated or lost Internet access, refresh network state.
-            // Don't do this on every NetworkCapabilities change because update accesspoint notify
-            // changed for accesspoint changed on the main thread, which can cause jank.
+            // If the network just validated or lost Internet access or detected partial internet
+            // connectivity, refresh network state. Don't do this on every NetworkCapabilities
+            // change because refreshNetworkState sends IPCs to the system server from the UI
+            // thread, which can cause jank.
             if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
-                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) ||
-                        hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
                     mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
                     refreshEntityHeader();
                 }
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java b/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
index 64014d9..e2566d0 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
@@ -39,6 +39,7 @@
 
     private ImageButton mImageButton;
     private Drawable mButtonIcon;
+    private View mDivider;
     private View.OnClickListener mClickListener;
     private boolean mVisible;
 
@@ -68,6 +69,8 @@
     }
 
     private void initialize() {
+        // TODO(b/129019971): use methods of divider line in parent object
+        setLayoutResource(R.layout.preference);
         setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
     }
 
@@ -82,13 +85,17 @@
                     getContext().getString(R.string.wifi_dpp_share_hotspot));
             setButtonIcon(R.drawable.ic_qrcode_24dp);
             mImageButton.setImageDrawable(mButtonIcon);
+
+            mDivider = holder.findViewById(R.id.two_target_divider);
         }
 
         if (mVisible) {
             mImageButton.setOnClickListener(mClickListener);
             mImageButton.setVisibility(View.VISIBLE);
+            mDivider.setVisibility(View.VISIBLE);
         } else {
             mImageButton.setVisibility(View.GONE);
+            mDivider.setVisibility(View.GONE);
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
index 5587783..b6ef32c 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
@@ -256,20 +256,21 @@
 
     @Test
     public void testGetLabelBackupTransport() throws Exception {
-        String label = "test_label";
+        CharSequence label = "test_label";
 
-        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+        when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
 
-        String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
+        CharSequence backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
 
         assertThat(backupLabel).isEqualTo(label);
     }
 
     @Test
     public void testGetLabelBackupTransport_RemoteException() throws Exception {
-        when(mBackupManager.getDataManagementLabel(anyString())).thenThrow(new RemoteException());
+        when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString()))
+                .thenThrow(new RemoteException());
 
-        String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
+        CharSequence backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
 
         assertThat(backupLabel).isNull();
     }
@@ -291,31 +292,31 @@
 
     @Test
     public void testGetLabelForBackupSettings_WithLabelFromTransport() throws Exception {
-        String label = "test_label";
+        CharSequence label = "test_label";
 
-        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+        when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
 
-        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+        CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
 
         assertThat(backupLabel).isEqualTo(label);
     }
 
     @Test
     public void testGetLabelForBackupSettings_WithEmptyLabelFromTransport() throws Exception {
-        String label = "";
+        CharSequence label = "";
 
-        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+        when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
 
-        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+        CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
 
         assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
     }
 
     @Test
     public void testGetLabelForBackupSettings_WithoutLabelFromTransport() throws Exception {
-        when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(null);
+        when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(null);
 
-        String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+        CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
 
         assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
     }
diff --git a/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
index ac92fb7..d3688d3 100644
--- a/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
@@ -43,7 +43,7 @@
     private DataManagementPreferenceController mController;
     private PrivacySettingsConfigData mPSCD;
     private Preference mPreference;
-    private String mTitle;
+    private CharSequence mTitle;
 
     @Mock
     private Intent mIntent;
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java
new file mode 100644
index 0000000..f2b87be
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 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.homepage.contextualcards.slices;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settings.R;
+import com.android.settings.slices.CustomSliceRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ContextualNotificationChannelSliceTest {
+
+    private Context mContext;
+    private ContextualNotificationChannelSlice mNotificationChannelSlice;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mNotificationChannelSlice = new ContextualNotificationChannelSlice(mContext);
+    }
+
+    @Test
+    public void getUri_shouldBeContextualNotificationChannelSliceUri() {
+        final Uri uri = mNotificationChannelSlice.getUri();
+
+        assertThat(uri).isEqualTo(CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI);
+    }
+
+    @Test
+    public void getSubTitle_shouldBeRecentlyInstalledApp() {
+        final CharSequence subTitle = mNotificationChannelSlice.getSubTitle("com.test.package", 0);
+
+        assertThat(subTitle).isEqualTo(mContext.getText(R.string.recently_installed_app));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
new file mode 100644
index 0000000..182ce8a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
+import static com.android.settings.notification.AssistantCapabilityPreferenceController.PRIORITIZER_KEY;
+import static com.android.settings.notification.AssistantCapabilityPreferenceController.SMART_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.service.notification.Adjustment;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+@RunWith(RobolectricTestRunner.class)
+public class AssistantCapabilityPreferenceControllerTest {
+
+    @Mock
+    private NotificationBackend mBackend;
+    @Mock
+    private PreferenceScreen mScreen;
+
+    private Context mContext;
+    private AssistantCapabilityPreferenceController mPrioritizerController;
+    private AssistantCapabilityPreferenceController mChipController;
+    private Preference mPrioritizerPreference;
+    private Preference mChipPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPrioritizerController = new AssistantCapabilityPreferenceController(
+                mContext, PRIORITIZER_KEY);
+        mPrioritizerController.setBackend(mBackend);
+        mPrioritizerPreference = new Preference(mContext);
+        mPrioritizerPreference.setKey(mPrioritizerController.getPreferenceKey());
+        when(mScreen.findPreference(
+                mPrioritizerController.getPreferenceKey())).thenReturn(mPrioritizerPreference);
+        mChipController = new AssistantCapabilityPreferenceController(mContext, SMART_KEY);
+        mChipController.setBackend(mBackend);
+        mChipPreference = new Preference(mContext);
+        mChipPreference.setKey(mChipController.getPreferenceKey());
+        when(mScreen.findPreference(
+                mChipController.getPreferenceKey())).thenReturn(mChipPreference);
+    }
+
+    @Test
+    public void getAvailabilityStatus_NAS() {
+        when(mBackend.getAllowedNotificationAssistant()).thenReturn(mock(ComponentName.class));
+        assertThat(mPrioritizerController.getAvailabilityStatus())
+                .isEqualTo(AVAILABLE);
+        assertThat(mChipController.getAvailabilityStatus())
+                .isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noNAS() {
+        when(mBackend.getAllowedNotificationAssistant()).thenReturn(null);
+        assertThat(mPrioritizerController.getAvailabilityStatus())
+                .isEqualTo(DISABLED_DEPENDENT_SETTING);
+        assertThat(mChipController.getAvailabilityStatus())
+                .isEqualTo(DISABLED_DEPENDENT_SETTING);
+    }
+
+    @Test
+    public void isChecked_prioritizerSettingIsOff_false() {
+        List<String> capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_USER_SENTIMENT);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mPrioritizerController.isChecked()).isFalse();
+    }
+
+    @Test
+    public void isChecked_prioritizerSettingIsOn_true() {
+        List<String> capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_IMPORTANCE);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mPrioritizerController.isChecked()).isTrue();
+    }
+
+    @Test
+    public void isChecked_chipSettingIsOff_false() {
+        List<String> capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_IMPORTANCE);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mChipController.isChecked()).isFalse();
+
+        capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mChipController.isChecked()).isFalse();
+
+        capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_TEXT_REPLIES);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mChipController.isChecked()).isFalse();
+    }
+
+    @Test
+    public void isChecked_chipSettingIsOn_true() {
+        List<String> capabilities = new ArrayList<>();
+        capabilities.add(Adjustment.KEY_TEXT_REPLIES);
+        capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
+        when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+        assertThat(mChipController.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChange_prioritizerOn() {
+        mPrioritizerController.onPreferenceChange(mPrioritizerPreference, true);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_IMPORTANCE, true);
+    }
+
+    @Test
+    public void onPreferenceChange_prioritizerOff() {
+        mPrioritizerController.onPreferenceChange(mPrioritizerPreference, false);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_IMPORTANCE, false);
+    }
+
+    @Test
+    public void onPreferenceChange_chipsOn() {
+        mChipController.onPreferenceChange(mChipPreference, true);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, true);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, true);
+    }
+
+    @Test
+    public void onPreferenceChange_chipsOff() {
+        mChipController.onPreferenceChange(mChipPreference, false);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, false);
+        verify(mBackend).allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, false);
+    }
+}
+
diff --git a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
similarity index 80%
rename from tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
rename to tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
index 05a9cfb..1be3332 100644
--- a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
+++ b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
@@ -48,7 +48,7 @@
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class AdaptiveHomepageIconTest {
+public class AdaptiveIconTest {
 
     private Context mContext;
     private ActivityInfo mActivityInfo;
@@ -64,8 +64,8 @@
 
     @Test
     public void createIcon_shouldSetBackgroundAndInset() {
-        final AdaptiveHomepageIcon icon =
-                new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+        final AdaptiveIcon icon =
+                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
 
         assertThat(icon.getNumberOfLayers()).isEqualTo(2);
         assertThat(icon.getDrawable(0)).isInstanceOf(AdaptiveIconShapeDrawable.class);
@@ -73,8 +73,8 @@
 
     @Test
     public void setBackgroundColor_shouldUpdateColorFilter() {
-        final AdaptiveHomepageIcon icon =
-                spy(new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK)));
+        final AdaptiveIcon icon =
+                spy(new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK)));
         final ShapeDrawable background = mock(ShapeDrawable.class);
         when(icon.getDrawable(0)).thenReturn(background);
 
@@ -89,8 +89,8 @@
         mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB, 0xff0000);
         doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
                 .when(tile).getIcon(mContext);
-        final AdaptiveHomepageIcon icon =
-                new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+        final AdaptiveIcon icon =
+                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
 
         icon.setBackgroundColor(mContext, tile);
         assertThat(icon.mBackgroundColor).isEqualTo(0xff0000);
@@ -101,8 +101,8 @@
         final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
         doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
             .when(tile).getIcon(mContext);
-        final AdaptiveHomepageIcon icon =
-            new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+        final AdaptiveIcon icon =
+            new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
 
         icon.setBackgroundColor(mContext, tile);
 
@@ -118,11 +118,24 @@
         doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
                 .when(tile).getIcon(mContext);
 
-        final AdaptiveHomepageIcon icon =
-                new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+        final AdaptiveIcon icon =
+                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
         icon.setBackgroundColor(mContext, tile);
 
         assertThat(icon.mBackgroundColor)
                 .isEqualTo(mContext.getColor(R.color.material_blue_500));
     }
+
+    @Test
+    public void getConstantState_returnCorrectState() {
+        final AdaptiveIcon icon =
+                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
+        icon.setBackgroundColor(Color.YELLOW);
+
+        final AdaptiveIcon.AdaptiveConstantState state =
+                (AdaptiveIcon.AdaptiveConstantState) icon.getConstantState();
+
+        assertThat(state.color).isEqualTo(Color.YELLOW);
+        assertThat(state.context).isEqualTo(mContext);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index d2403b9..4202143 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -330,4 +330,21 @@
         // Check
         assertThat(button.getVisibility()).isEqualTo(View.GONE);
     }
+
+    @Test
+    public void cancelDialog_callsReject() {
+        // Assert
+        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), /* tag */ null);
+        final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        final NetworkRequestUserSelectionCallback selectionCallback = mock(
+                NetworkRequestUserSelectionCallback.class);
+        networkRequestDialogFragment.onUserSelectionCallbackRegistration(selectionCallback);
+
+        // Action
+        final Button button = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
+        button.performClick();
+
+        // Check
+        verify(selectionCallback, times(1)).reject();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index db76722..574d0d6 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -649,6 +649,19 @@
         nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
         updateNetworkCapabilities(nc);
         inOrder.verify(mockHeaderController).setSummary(summary);
+
+        // UI will be refreshed when device connects to a partial connectivity network.
+        summary = "Limited connection";
+        when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockHeaderController).setSummary(summary);
+
+        // Although UI will be refreshed when network become validated. The Settings should
+        // continue to display "Limited connection" if network still provides partial connectivity.
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockHeaderController).setSummary(summary);
     }
 
     @Test