Merge "Show connecting and connected messages on the header subtext of Wi-Fi slice"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6744b41..b708471 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1648,7 +1648,7 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="com.android.settings.suggested.category.FIRST_IMPRESSION" />
             </intent-filter>
-            <meta-data android:name="com.android.settings.dismiss" android:value="2," />
+            <meta-data android:name="com.android.settings.dismiss" android:value="14" />
             <meta-data android:name="com.android.settings.require_feature"
                 android:value="android.hardware.fingerprint" />
             <meta-data android:name="com.android.settings.title"
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/values/strings.xml b/res/values/strings.xml
index 5e882fa..2593bd0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7682,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] -->
@@ -7691,7 +7703,9 @@
     <string name="notification_badging_title">Allow notification dots</string>
 
     <!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] -->
-    <string name="notification_bubbles_title">Allow notification bubbles</string>
+    <string name="notification_bubbles_title">Allow bubbles</string>
+    <!-- Configure Notifications: Summary for the notification bubbles option. [CHAR LIMIT=NONE] -->
+    <string name="notification_bubbles_summary">Allow apps to show some notifications as bubbles</string>
 
     <!-- Configure notifications: title for swipe direction [CHAR LIMIT=60] -->
     <string name="swipe_direction_title">Swipe actions</string>
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 38fa060..e48ddc1 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"
@@ -61,6 +73,7 @@
         <SwitchPreference
             android:key="notification_bubbles"
             android:title="@string/notification_bubbles_title"
+            android:summary="@string/notification_bubbles_summary"
             settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
 
         <!-- Pulse notification light -->
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/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 5c1fbdd..a760eff 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -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/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/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/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
index 704d1e5..7c55b51 100644
--- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
+++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
@@ -182,10 +182,10 @@
         return barViewInfos;
     }
 
-    private Drawable getPermissionGroupIcon(CharSequence permissionGroup) {
+    private Drawable getPermissionGroupIcon(String permissionGroup) {
         Drawable icon = null;
         try {
-            icon = mPackageManager.getPermissionGroupInfo(permissionGroup.toString(), 0)
+            icon = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
                     .loadIcon(mPackageManager);
             icon.setTintList(Utils.getColorAttr(mContext, android.R.attr.textColorSecondary));
         } catch (PackageManager.NameNotFoundException e) {
@@ -195,10 +195,10 @@
         return icon;
     }
 
-    private CharSequence getPermissionGroupLabel(CharSequence permissionGroup) {
+    private CharSequence getPermissionGroupLabel(String permissionGroup) {
         CharSequence label = null;
         try {
-            label = mPackageManager.getPermissionGroupInfo(permissionGroup.toString(), 0)
+            label = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
                     .loadLabel(mPackageManager);
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, "Cannot find group label for " + permissionGroup, e);
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/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);
+    }
+}
+