diff --git a/TEST_MAPPING b/TEST_MAPPING
index fd6bcbf..f84565f 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -15,6 +15,9 @@
         {
           "include-filter": "com.android.settings.password"
         },
+	 {
+          "include-filter": "com.android.settings.privatespace"
+        },
         {
           "include-filter": "com.android.settings.safetycenter"
         },
diff --git a/res/layout/apn_preference_layout.xml b/res/layout/apn_preference_layout.xml
index a958da1..d536234 100644
--- a/res/layout/apn_preference_layout.xml
+++ b/res/layout/apn_preference_layout.xml
@@ -57,14 +57,19 @@
 
     </RelativeLayout>
 
-    <RadioButton
-        android:id="@+id/apn_radiobutton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dip"
-        android:layout_marginEnd="8dip"
-        android:layout_gravity="center_vertical"
-        android:focusable="true"
-        android:clickable="true" />
+    <FrameLayout
+        android:id="@+id/apn_radio_button_frame"
+        android:layout_width="@dimen/min_tap_target_size"
+        android:layout_height="@dimen/min_tap_target_size"
+        android:layout_margin="8dp">
+
+        <RadioButton
+            android:id="@+id/apn_radiobutton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:clickable="false"
+            android:focusable="false" />
+    </FrameLayout>
 
 </LinearLayout>
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 04f1b6f..fb3435b 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -98,6 +98,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:text="@string/bluetooth_pairing_phonebook_toggle_details"
+                    android:hyphenationFrequency="normalFast"
                     android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Caption" />
             </LinearLayout>
             <Switch
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f8c58ce..cbd9772 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3325,7 +3325,7 @@
 
     <!-- _satellite_setting_preference_layout -->
     <!-- _satellite_setting_preference_layout screen title-->
-    <string name="satellite_setting">Satellite Messaging</string>
+    <string name="satellite_setting">Satellite messaging</string>
 
     <!-- APN Settings -->
     <!-- APN settings screen title -->
@@ -4865,33 +4865,45 @@
     <!-- Accessibility label for paging indicator in accessibility tutorial page. [CHAR LIMIT=NONE] -->
     <string name="accessibility_tutorial_pager">Page <xliff:g id="current_page" example="2">%1$d</xliff:g> of <xliff:g id="num_pages" example="3">%2$d</xliff:g></string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with button. [CHAR LIMIT=50] -->
-    <string name="accessibility_tutorial_dialog_title_button">Use accessibility button to open</string>
+    <string name="accessibility_tutorial_dialog_title_button">Accessibility button shortcut</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_title_volume">Hold volume keys to open</string>
+    <string name="accessibility_tutorial_dialog_title_volume">Volume keys shortcut</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_title_triple">Triple tap screen to open</string>
+    <string name="accessibility_tutorial_dialog_title_triple">Triple tap shortcut</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with two finger double tap. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_title_two_finger_double">Two finger double tap screen to open</string>
+    <string name="accessibility_tutorial_dialog_title_two_finger_double">%1$d-finger double tap shortcut</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with quick setting shortcut. [CHAR LIMIT=100] -->
     <string name="accessibility_tutorial_dialog_title_quick_setting">Quick Settings shortcut</string>
     <!-- Title for the accessibility tutorial dialog in accessibility service with gesture. [CHAR LIMIT=50] -->
-    <string name="accessibility_tutorial_dialog_title_gesture">Use gesture to open</string>
+    <string name="accessibility_tutorial_dialog_title_gesture">Accessibility gesture shortcut</string>
     <!-- Title for the accessibility tutorial dialog in gesture navigation settings. [CHAR LIMIT=50] -->
     <string name="accessibility_tutorial_dialog_title_gesture_settings">Use accessibility gesture</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using the 3-button nav bar. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_tutorial_dialog_message_button">To use this feature, tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> on the bottom of your screen.\n\nTo switch between features, touch &amp; hold the accessibility button.</string>
+    <string name="accessibility_tutorial_dialog_message_button">To use this feature, tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> at the bottom of your screen.\n\nTo switch between features, touch &amp; hold the accessibility button.</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using the accessibility floating button. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_message_floating_button">To use this feature, tap the accessibility button on your screen.</string>
+    <string name="accessibility_tutorial_dialog_message_floating_button">To use this feature, tap the accessibility button on your screen</string>
     <!-- Instruction for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_message_volume">To use this feature, press &amp; hold both volume keys.</string>
-    <!-- Instruction for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
+    <string name="accessibility_tutorial_dialog_message_volume">To use this feature, press &amp; hold both volume keys</string>
+    <!-- Instruction for the accessibility tutorial dialog for the screen magnification feature with triple tap. [CHAR LIMIT=100] -->
     <string name="accessibility_tutorial_dialog_message_triple">To start and stop magnification, triple-tap anywhere on your screen.</string>
-    <!-- Instruction for the accessibility tutorial dialog in accessibility service with two finger double tap. [CHAR LIMIT=100] -->
-    <string name="accessibility_tutorial_dialog_message_two_finger_triple">To start and stop magnification, double-tap anywhere on your screen with two fingers.</string>
-    <!-- Instruction for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=NONE]-->
-    <string name="accessibility_tutorial_dialog_message_quick_setting">To use this feature, swipe down from the top of your screen.</string>
+    <!-- Instruction for the accessibility tutorial dialog for the screen magnification feature with triple tap shortcut. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_tutorial_dialog_tripletap_instruction">To start and stop magnification, quickly tap the screen %1$d times</string>
+    <!-- Instruction for the accessibility tutorial dialog for the screen magnification feature with two finger double tap. [CHAR LIMIT=100] -->
+    <string name="accessibility_tutorial_dialog_twofinger_doubletap_instruction">To start and stop magnification, quickly tap the screen twice with %1$d fingers</string>
+    <!-- Instruction for the accessibility tutorial dialog in accessibility service with quick settings shortcut. [CHAR LIMIT=NONE]-->
+    <string name="accessibility_tutorial_dialog_message_quick_setting">{count, plural,
+      =1    {To use this feature, swipe down from the top of your screen. Then, find the {featureName} tile.}
+      other {To use this feature, swipe down from the top of your screen with # fingers. Then, find the {featureName} tile.}
+    }</string>
+    <!-- Warning for the accessibility shortcut type that is not available immediately during device setup when chosen, but will be available after setup. [CHAR LIMIT=NONE]-->
+    <string name="accessibility_tutorial_dialog_shortcut_unavailable_in_suw">This shortcut will be available after you finish device setup.</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is not enabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_tutorial_dialog_message_gesture">To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
+    <!-- Instruction for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_tutorial_dialog_gesture_shortcut_instruction">{count, plural,
+      =1    {To use this feature, swipe up from the bottom of your screen}
+      other {To use this feature, swipe up with # fingers from the bottom of your screen}
+    }</string>
     <!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is enabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_tutorial_dialog_message_gesture_talkback">To use this feature, swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
     <!-- Message for the accessibility tutorial dialog when user chooses gesture navigation in navigation settings, an accessibility service is using the accessibility button, and touch exploration is disabled. [CHAR LIMIT=NONE] -->
@@ -4901,7 +4913,9 @@
     <!-- Button for the accessibility tutorial dialog to dismiss the dialog when user clicks it. [CHAR LIMIT=10] -->
     <string name="accessibility_tutorial_dialog_button">Got it</string>
     <!-- Button for the accessibility tutorial dialog to open the Accessibility button settings page. [CHAR LIMIT=30] -->
-    <string name="accessibility_tutorial_dialog_link_button">Button settings</string>
+    <string name="accessibility_tutorial_dialog_link_button">Customize button</string>
+    <!-- Button for the accessibility tutorial dialog to open a page to select the different software shortcut type. [CHAR LIMIT=30] -->
+    <string name="accessibility_tutorial_dialog_configure_software_shortcut_type">More options</string>
     <!-- Title for accessibility shortcut preference for accessibility apps. [CHAR LIMIT=40] -->
     <string name="accessibility_shortcut_title"><xliff:g id="service" example="Select to Speak">%1$s</xliff:g> shortcut</string>
     <!-- Shown as one of the item in the chosen accessibility shortcut types list presented as a label next to the shortcut toggle. [CHAR LIMIT=NONE] -->
@@ -4912,16 +4926,23 @@
     <string name="accessibility_shortcut_edit_dialog_title_software_gesture">Swipe up with 2 fingers</string>
     <!-- Title for software shortcut in gesture mode in accessibility edit shortcut dialog while using gesture navigation and touch exploration are enabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_title_software_gesture_talkback">Swipe up with 3 fingers</string>
-    <!-- Summary for accessibility shortcut preference for software shortcut type. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_edit_dialog_title_software">Tap accessibility button</string>
-    <!-- Summary for accessibility shortcut preference for software shortcut gesture type. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_edit_dialog_title_software_by_gesture">Use accessibility gesture</string>
+    <!-- Title for accessibility shortcut preference for software shortcut type. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_dialog_title_software">Accessibility button</string>
+    <!-- Summary for accessibility shortcut preference for floating button shortcut type. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_dialog_summary_floating_button">Tap the floating button</string>
+    <!-- Title for accessibility shortcut preference for software shortcut gesture type. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_dialog_title_software_by_gesture">Accessibility gesture</string>
     <!-- Summary for software shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_edit_dialog_summary_software">Tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> at the bottom of your screen.\n\nTo switch between features, touch &amp; hold the accessibility button.</string>
+    <string name="accessibility_shortcut_edit_dialog_summary_software">Tap the accessibility button <xliff:g id="accessibility_icon" example="[Icon]">%s</xliff:g> at the bottom of your screen. To switch between features, touch &amp; hold the accessibility button.</string>
     <!-- Summary for software shortcut in gesture mode in accessibility edit shortcut dialog while using gesture navigation is enabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_software_gesture">Swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
     <!-- Summary for software shortcut in gesture mode in accessibility edit shortcut dialog while using gesture navigation and touch exploration are enabled [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_software_gesture_talkback">Swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.</string>
+    <!-- Summary for gesture shortcut option -->
+    <string name="accessibility_shortcut_edit_dialog_summary_gesture">{count, plural,
+      =1      {Swipe up from the bottom of your screen. To switch between features, swipe up and hold.}
+      other   {Swipe up with # fingers from the bottom of your screen. To switch between features, swipe up with # fingers and hold.}
+    }</string>
     <!-- Summary for software shortcut in accessibility edit shortcut dialog when user had enabled the accessibility floating button mode (Floating over other apps). [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_software_floating"><annotation id="link">More options</annotation></string>
     <!-- Footer to show help link content description. [CHAR LIMIT=NONE] -->
@@ -4929,25 +4950,41 @@
     <!-- Title for quick settings shortcut option in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_title_quick_settings">Quick Settings</string>
     <!-- Summary for quick settings shortcut option in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_edit_dialog_summary_quick_settings">Swipe down from the top of your screen</string>
+    <string name="accessibility_shortcut_edit_dialog_summary_quick_settings">{count, plural,
+      =1      {Swipe down from the top of your screen}
+      other   {Swipe down with # fingers from the top of your screen}
+    }</string>
+    <!-- Summary for quick settings shortcut option in accessibility edit shortcut dialog in Setup Wizard. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_dialog_summary_quick_settings_suw">{count, plural,
+      =1      {Swipe down from the top of your screen. This shortcut will be available after you finish device setup.}
+      other   {Swipe down with # fingers from the top of your screen. This shortcut will be available after you finish device setup.}
+    }</string>
     <!-- Shown as one of the item in the chosen accessibility shortcut types list presented as a label next to the shortcut toggle. [CHAR LIMIT=NONE] -->
     <string name="accessibility_feature_shortcut_setting_summary_quick_settings">Quick Settings</string>
     <!-- Title for hardware shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_edit_dialog_title_hardware">Hold volume keys</string>
+    <string name="accessibility_shortcut_edit_dialog_title_hardware">Volume keys</string>
     <!-- Part of list to compose user's accessibility shortcut list. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_hardware_keyword">hold volume keys</string>
+    <string name="accessibility_shortcut_hardware_keyword">volume keys</string>
     <!-- Summary for hardware shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_hardware">Press &amp; hold both volume keys</string>
     <!-- Title for two finger double tap shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_title_two_finger_double_tap">Two-finger double-tap screen</string>
-    <!-- Part of list to compose user's accessibility shortcut list. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_two_finger_double_tap_keyword">two-finger double-tap screen</string>
+    <!-- Title for 2-finger double tap shortcut in accessibility edit shortcut screen. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_screen_title_two_finger_double_tap">%1$d-finger double tap</string>
+    <!-- Summary for 2-finger double tap shortcut in accessibility edit shortcut screen. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_screen_summary_two_finger_double_tap">Quickly tap the screen twice with %1$d fingers</string>
+    <!-- Title for triple tap shortcut in accessibility edit shortcut screen. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_screen_title_triple_tap">Triple tap</string>
+    <!-- Summary for triple tap shortcut in accessibility edit shortcut screen. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_edit_screen_summary_triple_tap">Quickly tap the screen %1$d times. This may slow down your device.</string>
+    <!-- 2-finger double tap is shown as part of list to compose user's accessibility shortcut list. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_shortcut_two_finger_double_tap_keyword">%1$d-finger double tap</string>
     <!-- Summary for two finger double tap shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_two_finger_double_tap">Quickly tap screen {0,number,integer} times with two fingers</string>
     <!-- Title for triple tap shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_title_triple_tap">Triple-tap screen</string>
     <!-- Part of list to compose user's accessibility shortcut list. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_shortcut_triple_tap_keyword">triple-tap screen</string>
+    <string name="accessibility_shortcut_triple_tap_keyword">triple tap</string>
     <!-- Summary for triple tap shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
     <string name="accessibility_shortcut_edit_dialog_summary_triple_tap">Quickly tap screen {0,number,integer} times. This shortcut may slow down your device</string>
     <!-- Title for the accessibility edit shortcut dialog to save the preference when user clicks it. [CHAR LIMIT=20] -->
@@ -11654,7 +11691,7 @@
     <!-- Summary for satellite supported service [CHAR_LIMIT=NONE] -->
     <string name="summary_supported_service">You can text anyone, including emergency services. Your phone will reconnect to a mobile network when available.</string>
     <!-- learn more text - more about satellite messaging [CHAR_LIMIT=NONE] -->
-    <string name="satellite_setting_summary_more_information">Satellite messaging may take longer and is available only in some areas, Weather and certain structures may affect your satellite connection. Calling by satellite isn\u2019t available.\n\nIt may take some time for changes to your account to show in Settings. Contact <xliff:g id="carrier_name" example="T-Mobile">%1$s</xliff:g> for details.</string>
+    <string name="satellite_setting_summary_more_information">Satellite messaging may take longer and is available only in some areas. Weather and certain structures may affect your satellite connection. Calling by satellite isn\u2019t available. Emergency calls may still connect.\n\nIt may take some time for account changes to show in Settings. Contact your carrier for details.</string>
     <!-- more about satellite messaging [CHAR_LIMIT=NONE] -->
     <string name="more_about_satellite_messaging">More about satellite messaging</string>
     <!-- URL for more info about satellite messaging [CHAR LIMIT=60] -->
diff --git a/res/xml/accessibility_edit_shortcuts.xml b/res/xml/accessibility_edit_shortcuts.xml
index 37e25af..bb55527 100644
--- a/res/xml/accessibility_edit_shortcuts.xml
+++ b/res/xml/accessibility_edit_shortcuts.xml
@@ -24,7 +24,7 @@
         android:selectable="false"
         settings:allowDividerAbove="false"
         settings:allowDividerBelow="false"/>
-
+    <!-- LINT.IfChange(shortcut_type_ui_order) -->
     <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
         android:key="@string/accessibility_shortcut_quick_settings_pref"
         android:persistent="false"
@@ -90,4 +90,11 @@
         settings:allowDividerAbove="false"
         settings:allowDividerBelow="false"
         settings:controller="com.android.settings.accessibility.shortcuts.TripleTapShortcutOptionController" />
+    <!--
+        LINT.ThenChange(
+            /src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java:shortcut_type_ui_order,
+            /src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java:shortcut_type_ui_order,
+            /src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java:shortcut_type_ui_order
+        )
+    -->
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index 4b394a0..3bb03de 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -29,12 +29,14 @@
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
 import android.text.style.ImageSpan;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.widget.Button;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -57,6 +59,7 @@
 import com.android.server.accessibility.Flags;
 import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
+import com.android.settingslib.utils.StringUtil;
 import com.android.settingslib.widget.LottieColorUtils;
 
 import com.airbnb.lottie.LottieAnimationView;
@@ -66,6 +69,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Utility class for creating the dialog that guides users for gesture navigation for
@@ -117,12 +121,17 @@
         return createDialog(context, DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE);
     }
 
-    static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) {
-        return createAccessibilityTutorialDialog(context, shortcutTypes, mOnClickListener);
+    static AlertDialog createAccessibilityTutorialDialog(
+            @NonNull Context context, int shortcutTypes, @NonNull CharSequence featureName) {
+        return createAccessibilityTutorialDialog(
+                context, shortcutTypes, mOnClickListener, featureName);
     }
 
-    static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes,
-            @Nullable DialogInterface.OnClickListener actionButtonListener) {
+    static AlertDialog createAccessibilityTutorialDialog(
+            @NonNull Context context,
+            int shortcutTypes,
+            @Nullable DialogInterface.OnClickListener actionButtonListener,
+            @NonNull CharSequence featureName) {
 
         final int category = SettingsEnums.SWITCH_SHORTCUT_DIALOG_ACCESSIBILITY_BUTTON_SETTINGS;
         final DialogInterface.OnClickListener linkButtonListener =
@@ -138,46 +147,59 @@
                         linkButtonListener)
                 .create();
 
-        final List<TutorialPage> tutorialPages =
-                createShortcutTutorialPages(context, shortcutTypes);
+        final List<TutorialPage> tutorialPages = createShortcutTutorialPages(
+                context, shortcutTypes, featureName, /* isInSetupWizard= */ false);
         Preconditions.checkArgument(!tutorialPages.isEmpty(),
                 /* errorMessage= */ "Unexpected tutorial pages size");
 
-        final TutorialPageChangeListener.OnPageSelectedCallback callback = index -> {
-            final int pageType = tutorialPages.get(index).getType();
-            alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(
-                    pageType == UserShortcutType.SOFTWARE ? VISIBLE : GONE);
-        };
+        final TutorialPageChangeListener.OnPageSelectedCallback callback =
+                index -> updateTutorialNegativeButtonTextAndVisibility(
+                        alertDialog, tutorialPages, index);
 
         alertDialog.setView(createShortcutNavigationContentView(context, tutorialPages, callback));
 
         // Showing first page won't invoke onPageSelectedCallback. Need to check the first tutorial
         // page type manually to set correct visibility of the link button.
-        alertDialog.setOnShowListener(dialog -> {
-            final int firstPageType = tutorialPages.get(0).getType();
-            alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(
-                    firstPageType == UserShortcutType.SOFTWARE ? VISIBLE : GONE);
-        });
+        alertDialog.setOnShowListener(
+                dialog -> updateTutorialNegativeButtonTextAndVisibility(
+                        alertDialog, tutorialPages, /* selectedPageIndex= */ 0));
 
         return alertDialog;
     }
 
-    static AlertDialog createAccessibilityTutorialDialogForSetupWizard(Context context,
-            int shortcutTypes) {
-        return createAccessibilityTutorialDialogForSetupWizard(context, shortcutTypes,
-                mOnClickListener);
+    private static void updateTutorialNegativeButtonTextAndVisibility(
+            AlertDialog dialog, List<TutorialPage> pages, int selectedPageIndex) {
+        final Button button = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        final int pageType = pages.get(selectedPageIndex).getType();
+        final int buttonVisibility = pageType == UserShortcutType.SOFTWARE ? VISIBLE : GONE;
+        button.setVisibility(buttonVisibility);
+        if (buttonVisibility == VISIBLE) {
+            final int textResId = AccessibilityUtil.isFloatingMenuEnabled(dialog.getContext())
+                    ? R.string.accessibility_tutorial_dialog_link_button
+                    : R.string.accessibility_tutorial_dialog_configure_software_shortcut_type;
+            button.setText(textResId);
+        }
     }
 
     static AlertDialog createAccessibilityTutorialDialogForSetupWizard(Context context,
-            int shortcutTypes, @Nullable DialogInterface.OnClickListener actionButtonListener) {
+            int shortcutTypes, CharSequence featureName) {
+        return createAccessibilityTutorialDialogForSetupWizard(context, shortcutTypes,
+                mOnClickListener, featureName);
+    }
+
+    static AlertDialog createAccessibilityTutorialDialogForSetupWizard(
+            @NonNull Context context,
+            int shortcutTypes,
+            @Nullable DialogInterface.OnClickListener actionButtonListener,
+            @NonNull CharSequence featureName) {
 
         final AlertDialog alertDialog = new AlertDialog.Builder(context)
                 .setPositiveButton(R.string.accessibility_tutorial_dialog_button,
                         actionButtonListener)
                 .create();
 
-        final List<TutorialPage> tutorialPages =
-                createShortcutTutorialPages(context, shortcutTypes);
+        final List<TutorialPage> tutorialPages = createShortcutTutorialPages(
+                context, shortcutTypes, featureName, /* inSetupWizard= */ true);
         Preconditions.checkArgument(!tutorialPages.isEmpty(),
                 /* errorMessage= */ "Unexpected tutorial pages size");
 
@@ -403,8 +425,8 @@
         final View image =
                 createIllustrationViewWithImageRawResource(context,
                         R.raw.a11y_shortcut_type_triple_tap);
-        final CharSequence instruction =
-                context.getText(R.string.accessibility_tutorial_dialog_message_triple);
+        final CharSequence instruction = context.getString(
+                R.string.accessibility_tutorial_dialog_tripletap_instruction, 3);
         final ImageView indicatorIcon =
                 createImageView(context, R.drawable.ic_accessibility_page_indicator);
         indicatorIcon.setEnabled(false);
@@ -413,15 +435,16 @@
     }
 
     private static TutorialPage createTwoFingerTripleTapTutorialPage(@NonNull Context context) {
-        // TODO(b/308088945): Update tutorial string and image when UX provides them
         final int type = UserShortcutType.TWOFINGER_DOUBLETAP;
-        final CharSequence title =
-                context.getText(R.string.accessibility_tutorial_dialog_title_two_finger_double);
+        final int numFingers = 2;
+        final CharSequence title = context.getString(
+                R.string.accessibility_tutorial_dialog_title_two_finger_double, numFingers);
+        // TODO(b/308088945): Update tutorial image when UX provides them
         final View image =
                 createIllustrationViewWithImageRawResource(context,
                         R.raw.a11y_shortcut_type_triple_tap);
-        final CharSequence instruction =
-                context.getText(R.string.accessibility_tutorial_dialog_message_two_finger_triple);
+        final CharSequence instruction = context.getString(
+                R.string.accessibility_tutorial_dialog_twofinger_doubletap_instruction, numFingers);
         final ImageView indicatorIcon =
                 createImageView(context, R.drawable.ic_accessibility_page_indicator);
         indicatorIcon.setEnabled(false);
@@ -429,30 +452,50 @@
         return new TutorialPage(type, title, image, indicatorIcon, instruction);
     }
 
-    private static TutorialPage createQuickSettingTutorialPage(@NonNull Context context) {
+    private static TutorialPage createQuickSettingsTutorialPage(
+            @NonNull Context context, @NonNull CharSequence featureName, boolean inSetupWizard) {
         final int type = UserShortcutType.QUICK_SETTINGS;
         final CharSequence title =
                 context.getText(R.string.accessibility_tutorial_dialog_title_quick_setting);
         final View image =
                 createIllustrationView(context,
                         R.drawable.a11y_shortcut_type_quick_settings);
-        final CharSequence instruction =
-                context.getText(R.string.accessibility_tutorial_dialog_message_quick_setting);
+        final int numFingers = AccessibilityUtil.isTouchExploreEnabled(context) ? 2 : 1;
+        Map<String, Object> arguments = new ArrayMap<>();
+        arguments.put("count", numFingers);
+        arguments.put("featureName", featureName);
+        final CharSequence instruction = StringUtil.getIcuPluralsString(context,
+                arguments,
+                R.string.accessibility_tutorial_dialog_message_quick_setting);
+        final SpannableStringBuilder tutorialText = new SpannableStringBuilder();
+        if (inSetupWizard) {
+            tutorialText.append(context.getText(
+                            R.string.accessibility_tutorial_dialog_shortcut_unavailable_in_suw))
+                    .append("\n\n");
+        }
+        tutorialText.append(instruction);
         final ImageView indicatorIcon =
                 createImageView(context, R.drawable.ic_accessibility_page_indicator);
         indicatorIcon.setEnabled(false);
 
-        return new TutorialPage(type, title, image, indicatorIcon, instruction);
+        return new TutorialPage(type, title, image, indicatorIcon, tutorialText);
     }
 
+    /**
+     * Create the tutorial pages for selected shortcut types in the same order as shown in the
+     * edit shortcut screen.
+     */
     @VisibleForTesting
-    static List<TutorialPage> createShortcutTutorialPages(@NonNull Context context,
-            int shortcutTypes) {
+    static List<TutorialPage> createShortcutTutorialPages(
+            @NonNull Context context, int shortcutTypes, @NonNull CharSequence featureName,
+            boolean inSetupWizard) {
+        // LINT.IfChange(shortcut_type_ui_order)
         final List<TutorialPage> tutorialPages = new ArrayList<>();
         if (android.view.accessibility.Flags.a11yQsShortcut()) {
             if ((shortcutTypes & UserShortcutType.QUICK_SETTINGS)
                     == UserShortcutType.QUICK_SETTINGS) {
-                tutorialPages.add(createQuickSettingTutorialPage(context));
+                tutorialPages.add(
+                        createQuickSettingsTutorialPage(context, featureName, inSetupWizard));
             }
         }
         if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
@@ -463,10 +506,6 @@
             tutorialPages.add(createHardwareTutorialPage(context));
         }
 
-        if ((shortcutTypes & UserShortcutType.TRIPLETAP) == UserShortcutType.TRIPLETAP) {
-            tutorialPages.add(createTripleTapTutorialPage(context));
-        }
-
         if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
             if ((shortcutTypes & UserShortcutType.TWOFINGER_DOUBLETAP)
                     == UserShortcutType.TWOFINGER_DOUBLETAP) {
@@ -474,6 +513,11 @@
             }
         }
 
+        if ((shortcutTypes & UserShortcutType.TRIPLETAP) == UserShortcutType.TRIPLETAP) {
+            tutorialPages.add(createTripleTapTutorialPage(context));
+        }
+        // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order)
+
         return tutorialPages;
     }
 
@@ -509,10 +553,11 @@
             final int resId = R.string.accessibility_tutorial_dialog_message_floating_button;
             sb.append(context.getText(resId));
         } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
-            final int resId = AccessibilityUtil.isTouchExploreEnabled(context)
-                    ? R.string.accessibility_tutorial_dialog_message_gesture_talkback
-                    : R.string.accessibility_tutorial_dialog_message_gesture;
-            sb.append(context.getText(resId));
+            final int numFingers = AccessibilityUtil.isTouchExploreEnabled(context) ? 3 : 2;
+            sb.append(StringUtil.getIcuPluralsString(
+                    context,
+                    numFingers,
+                    R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction));
         } else {
             final int resId = R.string.accessibility_tutorial_dialog_message_button;
             sb.append(getSoftwareInstructionWithIcon(context, context.getText(resId)));
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 41c5d75..603ff7a 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -223,12 +223,12 @@
                     mDialog = AccessibilityGestureNavigationTutorial
                             .createAccessibilityTutorialDialogForSetupWizard(
                                     getPrefContext(), getUserShortcutTypes(),
-                                    this::callOnTutorialDialogButtonClicked);
+                                    this::callOnTutorialDialogButtonClicked, getLabelName());
                 } else {
                     mDialog = AccessibilityGestureNavigationTutorial
                             .createAccessibilityTutorialDialog(
                                     getPrefContext(), getUserShortcutTypes(),
-                                    this::callOnTutorialDialogButtonClicked);
+                                    this::callOnTutorialDialogButtonClicked, getLabelName());
                 }
                 mDialog.setCanceledOnTouchOutside(false);
                 return mDialog;
@@ -454,6 +454,7 @@
         final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType(context,
                 getComponentName().flattenToString());
 
+        // LINT.IfChange(shortcut_type_ui_order)
         final List<CharSequence> list = new ArrayList<>();
         if (android.view.accessibility.Flags.a11yQsShortcut()) {
             if (hasShortcutType(shortcutTypes, AccessibilityUtil.UserShortcutType.QUICK_SETTINGS)) {
@@ -470,6 +471,7 @@
                     R.string.accessibility_shortcut_hardware_keyword);
             list.add(hardwareTitle);
         }
+        // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order)
 
         // Show software shortcut if first time to use.
         if (list.isEmpty()) {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index ef828db..a7fce6f 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -228,12 +228,12 @@
                     mDialog = AccessibilityGestureNavigationTutorial
                             .createAccessibilityTutorialDialogForSetupWizard(
                                     getPrefContext(), getUserShortcutTypes(),
-                                    this::callOnTutorialDialogButtonClicked);
+                                    this::callOnTutorialDialogButtonClicked, mPackageName);
                 } else {
                     mDialog = AccessibilityGestureNavigationTutorial
                             .createAccessibilityTutorialDialog(
                                     getPrefContext(), getUserShortcutTypes(),
-                                    this::callOnTutorialDialogButtonClicked);
+                                    this::callOnTutorialDialogButtonClicked, mPackageName);
                 }
                 mDialog.setCanceledOnTouchOutside(false);
                 return mDialog;
@@ -711,6 +711,7 @@
             return context.getText(R.string.accessibility_shortcut_state_off);
         }
 
+        // LINT.IfChange(shortcut_type_ui_order)
         final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType(
                 context, mComponentName.flattenToString(), getDefaultShortcutTypes());
 
@@ -730,6 +731,7 @@
                     R.string.accessibility_shortcut_hardware_keyword);
             list.add(hardwareTitle);
         }
+        // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order)
 
         // Show software shortcut if first time to use.
         if (list.isEmpty()) {
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 6ef764e..0da55af 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -484,6 +484,7 @@
         final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType(context,
                 MAGNIFICATION_CONTROLLER_NAME);
 
+        // LINT.IfChange(shortcut_type_ui_order)
         final List<CharSequence> list = new ArrayList<>();
         if (android.view.accessibility.Flags.a11yQsShortcut()) {
             if (hasShortcutType(shortcutTypes, UserShortcutType.QUICK_SETTINGS)) {
@@ -500,18 +501,19 @@
                     R.string.accessibility_shortcut_hardware_keyword);
             list.add(hardwareTitle);
         }
+        if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
+            if (hasShortcutType(shortcutTypes, UserShortcutType.TWOFINGER_DOUBLETAP)) {
+                final CharSequence twoFingerDoubleTapTitle = context.getString(
+                        R.string.accessibility_shortcut_two_finger_double_tap_keyword, 2);
+                list.add(twoFingerDoubleTapTitle);
+            }
+        }
         if (hasShortcutType(shortcutTypes, UserShortcutType.TRIPLETAP)) {
             final CharSequence tripleTapTitle = context.getText(
                     R.string.accessibility_shortcut_triple_tap_keyword);
             list.add(tripleTapTitle);
         }
-        if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
-            if (hasShortcutType(shortcutTypes, UserShortcutType.TWOFINGER_DOUBLETAP)) {
-                final CharSequence twoFingerTripleTapTitle = context.getText(
-                        R.string.accessibility_shortcut_two_finger_double_tap_keyword);
-                list.add(twoFingerTripleTapTitle);
-            }
-        }
+        // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order)
 
         // Show software shortcut if first time to use.
         if (list.isEmpty()) {
diff --git a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
index 976fffb..036190b 100644
--- a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
@@ -258,8 +258,10 @@
     @Override
     public void onResume() {
         super.onResume();
-        mTouchExplorationStateChangeListener = isTouchExplorationEnabled ->
-                refreshPreferenceController(GestureShortcutOptionController.class);
+        mTouchExplorationStateChangeListener = isTouchExplorationEnabled -> {
+            refreshPreferenceController(QuickSettingsShortcutOptionController.class);
+            refreshPreferenceController(GestureShortcutOptionController.class);
+        };
 
         final AccessibilityManager am = getSystemService(
                 AccessibilityManager.class);
diff --git a/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionController.java
index e72a85d..f3c427a 100644
--- a/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionController.java
@@ -57,9 +57,12 @@
     @Nullable
     @Override
     public CharSequence getSummary() {
-        if (isInSetupWizard()) {
-            return null;
+        final SpannableStringBuilder sb = new SpannableStringBuilder();
+        sb.append(mContext.getText(
+                R.string.accessibility_shortcut_edit_dialog_summary_floating_button));
+        if (!isInSetupWizard()) {
+            sb.append("\n\n").append(getCustomizeAccessibilityButtonLink());
         }
-        return new SpannableStringBuilder().append(getCustomizeAccessibilityButtonLink());
+        return sb;
     }
 }
diff --git a/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionController.java
index fb312c6..7ea30b6 100644
--- a/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionController.java
@@ -24,6 +24,7 @@
 
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityUtil;
+import com.android.settingslib.utils.StringUtil;
 
 /**
  * A controller handles displaying the gesture shortcut option preference and
@@ -59,13 +60,18 @@
 
     @Override
     public CharSequence getSummary() {
+        int numFingers = AccessibilityUtil.isTouchExploreEnabled(mContext) ? 3 : 2;
+        String instruction = StringUtil.getIcuPluralsString(
+                mContext,
+                numFingers,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+
         final SpannableStringBuilder sb = new SpannableStringBuilder();
-        final int resId = AccessibilityUtil.isTouchExploreEnabled(mContext)
-                ? R.string.accessibility_shortcut_edit_dialog_summary_software_gesture_talkback
-                : R.string.accessibility_shortcut_edit_dialog_summary_software_gesture;
-        sb.append(mContext.getText(resId));
-        sb.append("\n\n");
-        sb.append(getCustomizeAccessibilityButtonLink());
+        sb.append(instruction);
+        if (!isInSetupWizard()) {
+            sb.append("\n\n");
+            sb.append(getCustomizeAccessibilityButtonLink());
+        }
 
         return sb;
     }
diff --git a/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java
index 27f6bc9..f96e1b0 100644
--- a/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java
@@ -34,6 +34,8 @@
 import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.util.AccessibilityUtils;
 import com.android.settings.R;
+import com.android.settings.accessibility.AccessibilityUtil;
+import com.android.settingslib.utils.StringUtil;
 
 import java.util.List;
 import java.util.Map;
@@ -62,14 +64,23 @@
         if (preference instanceof ShortcutOptionPreference shortcutOptionPreference) {
             shortcutOptionPreference.setTitle(
                     R.string.accessibility_shortcut_edit_dialog_title_quick_settings);
-            shortcutOptionPreference.setSummary(
-                    R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
             shortcutOptionPreference.setIntroImageResId(
                     R.drawable.a11y_shortcut_type_quick_settings);
         }
     }
 
     @Override
+    public CharSequence getSummary() {
+        int numFingers = AccessibilityUtil.isTouchExploreEnabled(mContext) ? 2 : 1;
+        return StringUtil.getIcuPluralsString(
+                mContext,
+                numFingers,
+                isInSetupWizard()
+                        ? R.string.accessibility_shortcut_edit_dialog_summary_quick_settings_suw
+                        : R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+    }
+
+    @Override
     protected boolean isShortcutAvailable() {
         return Flags.a11yQsShortcut()
                 && TileService.isQuickSettingsSupported()
@@ -91,7 +102,8 @@
         }
         for (String target : getShortcutTargets()) {
             ComponentName targetComponentName = ComponentName.unflattenFromString(target);
-            if (!a11yFeatureToTileMap.containsKey(targetComponentName)) {
+            if (targetComponentName == null
+                    || !a11yFeatureToTileMap.containsKey(targetComponentName)) {
                 return false;
             }
         }
diff --git a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
index e43aeb2..a4cc70b 100644
--- a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
@@ -19,7 +19,6 @@
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 
 import android.content.Context;
-import android.icu.text.MessageFormat;
 import android.provider.Settings;
 import android.view.accessibility.Flags;
 
@@ -52,12 +51,9 @@
         final Preference preference = screen.findPreference(getPreferenceKey());
         if (preference instanceof ShortcutOptionPreference shortcutOptionPreference) {
             shortcutOptionPreference.setTitle(
-                    R.string.accessibility_shortcut_edit_dialog_title_triple_tap);
+                    R.string.accessibility_shortcut_edit_screen_title_triple_tap);
             String summary = mContext.getString(
-                    R.string.accessibility_shortcut_edit_dialog_summary_triple_tap);
-            // Format the number '3' in the summary.
-            final Object[] arguments = {3};
-            summary = MessageFormat.format(summary, arguments);
+                    R.string.accessibility_shortcut_edit_screen_summary_triple_tap, 3);
 
             shortcutOptionPreference.setSummary(summary);
             shortcutOptionPreference.setIntroImageRawResId(
diff --git a/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
index 83ba6e4..0fc9f8e 100644
--- a/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
@@ -19,7 +19,6 @@
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 
 import android.content.Context;
-import android.icu.text.MessageFormat;
 import android.provider.Settings;
 
 import androidx.preference.Preference;
@@ -54,16 +53,17 @@
         super.displayPreference(screen);
         final Preference preference = screen.findPreference(getPreferenceKey());
         if (preference instanceof ShortcutOptionPreference shortcutOptionPreference) {
-            // TODO (b/306153204): Update shortcut string and image when UX provides them
-            shortcutOptionPreference.setTitle(
-                    R.string.accessibility_shortcut_edit_dialog_title_two_finger_double_tap);
+            int numFingers = 2;
+            String title = mContext.getString(
+                    R.string.accessibility_shortcut_edit_screen_title_two_finger_double_tap,
+                    numFingers);
+            shortcutOptionPreference.setTitle(title);
             String summary = mContext.getString(
-                    R.string.accessibility_shortcut_edit_dialog_summary_two_finger_double_tap);
-            // Format the number '2' in the summary.
-            final Object[] arguments = {2};
-            summary = MessageFormat.format(summary, arguments);
+                    R.string.accessibility_shortcut_edit_screen_summary_two_finger_double_tap,
+                    numFingers);
 
             shortcutOptionPreference.setSummary(summary);
+            // TODO (b/306153204): Update shortcut image when UX provides them
             shortcutOptionPreference.setIntroImageRawResId(
                     R.raw.a11y_shortcut_type_triple_tap);
         }
diff --git a/src/com/android/settings/display/EvenDimmerPreferenceController.java b/src/com/android/settings/display/EvenDimmerPreferenceController.java
index b86c845..9f239b2 100644
--- a/src/com/android/settings/display/EvenDimmerPreferenceController.java
+++ b/src/com/android/settings/display/EvenDimmerPreferenceController.java
@@ -47,7 +47,16 @@
         // enable based on flag and config.xml
         final boolean enabledInConfig = mResources.getBoolean(
                 com.android.internal.R.bool.config_evenDimmerEnabled);
-        return (Flags.evenDimmer() && enabledInConfig) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+
+        if (Flags.evenDimmer() && enabledInConfig) {
+            return Settings.System.getInt(mContext.getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS_MODE,
+                    Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)
+                    == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC ? AVAILABLE
+                    : DISABLED_DEPENDENT_SETTING;
+        } else {
+            return UNSUPPORTED_ON_DEVICE;
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index a04d8f8..35a173b 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.fuelgauge;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -110,8 +111,9 @@
     /** Returns {@code true} if delay the hourly job when device is booting */
     boolean delayHourlyJobWhenBooting();
 
-    /** Returns {@link Bundle} for settings anomaly detection result */
-    PowerAnomalyEventList detectSettingsAnomaly(
+    /** Returns {@link Bundle} for power anomaly detection result */
+    @Nullable
+    PowerAnomalyEventList detectPowerAnomaly(
             Context context, double displayDrain, DetectRequestSourceType detectRequestSourceType);
 
     /** Gets an intent for one time bypass charge limited to resume charging. */
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 75ebabb..f0616ed 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -18,6 +18,7 @@
 
 import static com.android.settings.Utils.SYSTEMUI_PACKAGE_NAME;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -179,7 +180,8 @@
     }
 
     @Override
-    public PowerAnomalyEventList detectSettingsAnomaly(
+    @Nullable
+    public PowerAnomalyEventList detectPowerAnomaly(
             Context context, double displayDrain, DetectRequestSourceType detectRequestSourceType) {
         return null;
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
index d1bf0d2..5b1a6a7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
@@ -137,7 +137,7 @@
                                                                             .isEmpty()))) {
                                 FeatureFactory.getFeatureFactory()
                                         .getPowerUsageFeatureProvider()
-                                        .detectSettingsAnomaly(
+                                        .detectPowerAnomaly(
                                                 context,
                                                 /* displayDrain= */ 0,
                                                 DetectRequestSourceType.TYPE_DATA_LOADER);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index f5ed06d..65d941d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -262,7 +262,7 @@
                     final PowerUsageFeatureProvider powerUsageFeatureProvider =
                             FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
                     final PowerAnomalyEventList anomalyEventList =
-                            powerUsageFeatureProvider.detectSettingsAnomaly(
+                            powerUsageFeatureProvider.detectPowerAnomaly(
                                     getContext(),
                                     /* displayDrain= */ 0,
                                     DetectRequestSourceType.TYPE_USAGE_UI);
diff --git a/src/com/android/settings/network/apn/ApnPreference.java b/src/com/android/settings/network/apn/ApnPreference.java
old mode 100755
new mode 100644
index dcc50cd..7cc4823
--- a/src/com/android/settings/network/apn/ApnPreference.java
+++ b/src/com/android/settings/network/apn/ApnPreference.java
@@ -49,7 +49,7 @@
     private static CompoundButton sCurrentChecked = null;
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     private boolean mProtectFromCheckedChange = false;
-    private boolean mSelectable = true;
+    private boolean mDefaultSelectable = true;
     private boolean mHideDetails = false;
 
     /**
@@ -57,6 +57,9 @@
      */
     public ApnPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+        // Primary target and radio button could be selectable, but entire preference itself is not
+        // selectable.
+        setSelectable(false);
     }
 
     /**
@@ -80,25 +83,25 @@
         final RelativeLayout textArea = (RelativeLayout) view.findViewById(R.id.text_layout);
         textArea.setOnClickListener(this);
 
-        final View widget = view.findViewById(R.id.apn_radiobutton);
-        if ((widget != null) && widget instanceof RadioButton) {
-            final RadioButton rb = (RadioButton) widget;
-            if (mSelectable) {
-                rb.setOnCheckedChangeListener(this);
+        final RadioButton rb = view.itemView.requireViewById(R.id.apn_radiobutton);
+        if (mDefaultSelectable) {
+            view.itemView.requireViewById(R.id.apn_radio_button_frame).setOnClickListener((v) -> {
+                rb.performClick();
+            });
+            rb.setOnCheckedChangeListener(this);
 
-                final boolean isChecked = getKey().equals(sSelectedKey);
-                if (isChecked) {
-                    sCurrentChecked = rb;
-                    sSelectedKey = getKey();
-                }
-
-                mProtectFromCheckedChange = true;
-                rb.setChecked(isChecked);
-                mProtectFromCheckedChange = false;
-                rb.setVisibility(View.VISIBLE);
-            } else {
-                rb.setVisibility(View.GONE);
+            final boolean isChecked = getKey().equals(sSelectedKey);
+            if (isChecked) {
+                sCurrentChecked = rb;
+                sSelectedKey = getKey();
             }
+
+            mProtectFromCheckedChange = true;
+            rb.setChecked(isChecked);
+            mProtectFromCheckedChange = false;
+            rb.setVisibility(View.VISIBLE);
+        } else {
+            rb.setVisibility(View.GONE);
         }
     }
 
@@ -167,12 +170,8 @@
         }
     }
 
-    public boolean getSelectable() {
-        return mSelectable;
-    }
-
-    public void setSelectable(boolean selectable) {
-        mSelectable = selectable;
+    public void setDefaultSelectable(boolean defaultSelectable) {
+        mDefaultSelectable = defaultSelectable;
     }
 
     public void setSubId(int subId) {
diff --git a/src/com/android/settings/network/apn/ApnSettings.java b/src/com/android/settings/network/apn/ApnSettings.java
old mode 100755
new mode 100644
index c3feae8..be90653
--- a/src/com/android/settings/network/apn/ApnSettings.java
+++ b/src/com/android/settings/network/apn/ApnSettings.java
@@ -369,10 +369,10 @@
                     pref.setSummary(apn);
                 }
 
-                final boolean selectable =
+                final boolean defaultSelectable =
                         ((type == null) || type.contains(ApnSetting.TYPE_DEFAULT_STRING));
-                pref.setSelectable(selectable);
-                if (selectable) {
+                pref.setDefaultSelectable(defaultSelectable);
+                if (defaultSelectable) {
                     if ((mSelectedKey != null) && mSelectedKey.equals(key)) {
                         pref.setChecked();
                     }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
index edefec2..18a3c3a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
@@ -32,18 +32,27 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.text.SpannableStringBuilder;
+import android.util.ArrayMap;
 import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.Button;
+import android.widget.TextSwitcher;
+import android.widget.TextView;
 
 import androidx.appcompat.app.AlertDialog;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.server.accessibility.Flags;
+import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SubSettings;
+import com.android.settings.testutils.AccessibilityTestUtils;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.utils.StringUtil;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -54,16 +63,22 @@
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowAccessibilityManager;
 import org.robolectric.shadows.ShadowLooper;
 
+import java.util.Map;
+
 /** Tests for {@link AccessibilityGestureNavigationTutorial}. */
+@Config(shadows = SettingsShadowResources.class)
 @RunWith(RobolectricTestRunner.class)
 public final class AccessibilityGestureNavigationTutorialTest {
+    private static final String FAKE_FEATURE_NAME = "Fake Feature Name";
 
     @Rule
     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     @Mock
     private DialogInterface.OnClickListener mOnClickListener;
     @Mock
@@ -79,7 +94,7 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void createTutorialPages_shortcutListIsEmpty_throwsException() {
-        createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+        createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
     }
 
     @Test
@@ -87,36 +102,42 @@
         mShortcutTypes |= UserShortcutType.TRIPLETAP;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
 
-        assertThat(createShortcutTutorialPages(mContext,
-                mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+        assertThat(
+                createShortcutTutorialPages(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME, /* inSetupWizard= */ false)
+        ).hasSize(/* expectedSize= */ 1);
         assertThat(alertDialog).isNotNull();
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+    @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
     public void createTutorialPages_turnOnTwoFingerTripleTapShortcut_hasOnePage() {
         mShortcutTypes |= UserShortcutType.TWOFINGER_DOUBLETAP;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
 
-        assertThat(createShortcutTutorialPages(mContext,
-                mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+        assertThat(
+                createShortcutTutorialPages(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME, /* inSetupWizard= */ false)
+        ).hasSize(/* expectedSize= */ 1);
         assertThat(alertDialog).isNotNull();
     }
 
     @Test
-    @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+    @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
     public void createTutorialPages_turnOnQuickSettingShortcut_hasOnePage() {
         mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
 
-        assertThat(createShortcutTutorialPages(mContext,
-                mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+        assertThat(
+                createShortcutTutorialPages(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME, /* inSetupWizard= */ false)
+        ).hasSize(/* expectedSize= */ 1);
         assertThat(alertDialog).isNotNull();
     }
 
@@ -125,10 +146,12 @@
         mShortcutTypes |= UserShortcutType.SOFTWARE;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
 
-        assertThat(createShortcutTutorialPages(mContext,
-                mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+        assertThat(
+                createShortcutTutorialPages(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME, /* inSetupWizard= */ false)
+        ).hasSize(/* expectedSize= */ 1);
         assertThat(alertDialog).isNotNull();
     }
 
@@ -138,36 +161,69 @@
         mShortcutTypes |= UserShortcutType.HARDWARE;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
 
-        assertThat(createShortcutTutorialPages(mContext,
-                mShortcutTypes)).hasSize(/* expectedSize= */ 2);
+        assertThat(
+                createShortcutTutorialPages(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME, /* inSetupWizard= */ false)
+        ).hasSize(/* expectedSize= */ 2);
         assertThat(alertDialog).isNotNull();
     }
 
     @Test
-    public void createTutorialPages_turnOnSoftwareShortcut_linkButtonVisible() {
+    public void createTutorialPages_turnOnA11yGestureShortcut_linkButtonShownWithText() {
         mShortcutTypes |= UserShortcutType.SOFTWARE;
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false);
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
+        ShadowLooper.idleMainLooper();
 
-        assertThat(alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility())
-                .isEqualTo(View.VISIBLE);
+        Button btn = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        assertThat(btn).isNotNull();
+        assertThat(btn.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(btn.getText().toString()).isEqualTo(
+                mContext.getString(
+                        R.string.accessibility_tutorial_dialog_configure_software_shortcut_type));
     }
 
     @Test
-    public void createTutorialPages_turnOnSoftwareAndHardwareShortcut_linkButtonVisible() {
+    public void createTutorialPages_turnOnA11yNavButtonShortcut_linkButtonShownWithText() {
         mShortcutTypes |= UserShortcutType.SOFTWARE;
-        mShortcutTypes |= UserShortcutType.HARDWARE;
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ false, /* floatingButtonEnabled= */ false);
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
+        ShadowLooper.idleMainLooper();
 
-        assertThat(alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility())
-                .isEqualTo(View.VISIBLE);
+        Button btn = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        assertThat(btn).isNotNull();
+        assertThat(btn.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(btn.getText().toString()).isEqualTo(
+                mContext.getString(
+                        R.string.accessibility_tutorial_dialog_configure_software_shortcut_type));
+    }
+
+    @Test
+    public void createTutorialPages_turnOnFloatingButtonShortcut_linkButtonShownWithText() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ false, /* floatingButtonEnabled= */ true);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        Button btn = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        assertThat(btn).isNotNull();
+        assertThat(btn.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(btn.getText().toString()).isEqualTo(
+                mContext.getString(R.string.accessibility_tutorial_dialog_link_button));
     }
 
     @Test
@@ -175,7 +231,7 @@
         mShortcutTypes |= UserShortcutType.HARDWARE;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
         ShadowLooper.idleMainLooper();
 
@@ -188,20 +244,293 @@
         mShortcutTypes |= UserShortcutType.SOFTWARE;
 
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialogForSetupWizard(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialogForSetupWizard(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
+        ShadowLooper.idleMainLooper();
 
         assertThat(alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility())
                 .isEqualTo(View.GONE);
     }
 
+    @Test
+    @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void createAccessibilityTutorialDialog_qsShortcut_inSuwTalkbackOn_verifyText() {
+        mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
+        setTouchExplorationEnabled(true);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_quick_setting);
+        Map<String, Object> arguments = new ArrayMap<>();
+        arguments.put("count", 2);
+        arguments.put("featureName", FAKE_FEATURE_NAME);
+        final CharSequence instruction = StringUtil.getIcuPluralsString(mContext,
+                arguments,
+                R.string.accessibility_tutorial_dialog_message_quick_setting);
+        final SpannableStringBuilder expectedInstruction = new SpannableStringBuilder();
+        expectedInstruction
+                .append(mContext.getText(
+                        R.string.accessibility_tutorial_dialog_shortcut_unavailable_in_suw))
+                .append("\n\n");
+        expectedInstruction.append(instruction);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialogForSetupWizard(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void createAccessibilityTutorialDialog_qsShortcut_notInSuwTalkbackOn_verifyText() {
+        mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
+        setTouchExplorationEnabled(true);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_quick_setting);
+        Map<String, Object> arguments = new ArrayMap<>();
+        arguments.put("count", 2);
+        arguments.put("featureName", FAKE_FEATURE_NAME);
+        final CharSequence expectedInstruction = StringUtil.getIcuPluralsString(mContext,
+                arguments,
+                R.string.accessibility_tutorial_dialog_message_quick_setting);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void createAccessibilityTutorialDialog_qsShortcut_inSuwTalkbackOff_verifyText() {
+        mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
+        setTouchExplorationEnabled(false);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_quick_setting);
+        Map<String, Object> arguments = new ArrayMap<>();
+        arguments.put("count", 1);
+        arguments.put("featureName", FAKE_FEATURE_NAME);
+        final CharSequence instruction = StringUtil.getIcuPluralsString(mContext,
+                arguments,
+                R.string.accessibility_tutorial_dialog_message_quick_setting);
+        final SpannableStringBuilder expectedInstruction = new SpannableStringBuilder();
+        expectedInstruction.append(mContext.getText(
+                        R.string.accessibility_tutorial_dialog_shortcut_unavailable_in_suw))
+                .append("\n\n");
+        expectedInstruction.append(instruction);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialogForSetupWizard(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void createAccessibilityTutorialDialog_qsShortcut_notInSuwTalkbackOff_verifyText() {
+        mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
+        setTouchExplorationEnabled(false);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_quick_setting);
+        Map<String, Object> arguments = new ArrayMap<>();
+        arguments.put("count", 1);
+        arguments.put("featureName", FAKE_FEATURE_NAME);
+        final CharSequence expectedInstruction = StringUtil.getIcuPluralsString(mContext,
+                arguments,
+                R.string.accessibility_tutorial_dialog_message_quick_setting);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_volumeKeysShortcut_verifyText() {
+        mShortcutTypes |= UserShortcutType.HARDWARE;
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_volume);
+        final CharSequence expectedInstruction = mContext.getString(
+                R.string.accessibility_tutorial_dialog_message_volume);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_tripleTapShortcut_verifyText() {
+        mShortcutTypes |= UserShortcutType.TRIPLETAP;
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_triple);
+        final CharSequence expectedInstruction = mContext.getString(
+                R.string.accessibility_tutorial_dialog_tripletap_instruction, 3);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction.toString());
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+    public void createAccessibilityTutorialDialog_twoFingerDoubleTapShortcut_verifyText() {
+        mShortcutTypes |= UserShortcutType.TWOFINGER_DOUBLETAP;
+        final int numFingers = 2;
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_two_finger_double, numFingers);
+        final String expectedInstruction = mContext.getString(
+                R.string.accessibility_tutorial_dialog_twofinger_doubletap_instruction, numFingers);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction);
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_floatingButtonShortcut_verifyText() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ false, /* floatingButtonEnabled= */ true);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_button);
+        final String expectedInstruction = mContext.getString(
+                R.string.accessibility_tutorial_dialog_message_floating_button);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction);
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_navA11yButtonShortcut_verifyText() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ false, /* floatingButtonEnabled= */ false);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_button);
+        final String expectedInstruction = mContext.getString(
+                R.string.accessibility_tutorial_dialog_message_button);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction);
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOn_verifyText() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        setTouchExplorationEnabled(true);
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_gesture);
+        final String expectedInstruction = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 3,
+                R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction);
+    }
+
+    @Test
+    public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOff_verifyText() {
+        mShortcutTypes |= UserShortcutType.SOFTWARE;
+        setTouchExplorationEnabled(false);
+        AccessibilityTestUtils.setSoftwareShortcutMode(
+                mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false);
+        final String expectedTitle = mContext.getString(
+                R.string.accessibility_tutorial_dialog_title_gesture);
+        final String expectedInstruction = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 2,
+                R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction);
+
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, FAKE_FEATURE_NAME);
+        alertDialog.show();
+        ShadowLooper.idleMainLooper();
+
+        verifyTutorialTitleAndInstruction(
+                alertDialog,
+                expectedTitle,
+                expectedInstruction);
+    }
 
     @Test
     public void performClickOnPositiveButton_turnOnSoftwareShortcut_dismiss() {
         mShortcutTypes |= UserShortcutType.SOFTWARE;
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+                createAccessibilityTutorialDialog(mContext, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
+        ShadowLooper.idleMainLooper();
 
         alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
         ShadowLooper.idleMainLooper();
@@ -213,8 +542,10 @@
     public void performClickOnPositiveButton_turnOnSoftwareShortcut_callOnClickListener() {
         mShortcutTypes |= UserShortcutType.SOFTWARE;
         final AlertDialog alertDialog =
-                createAccessibilityTutorialDialog(mContext, mShortcutTypes, mOnClickListener);
+                createAccessibilityTutorialDialog(
+                        mContext, mShortcutTypes, mOnClickListener, FAKE_FEATURE_NAME);
         alertDialog.show();
+        ShadowLooper.idleMainLooper();
 
         alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
         ShadowLooper.idleMainLooper();
@@ -226,7 +557,8 @@
     public void performClickOnNegativeButton_turnOnSoftwareShortcut_directToSettingsPage() {
         mShortcutTypes |= UserShortcutType.SOFTWARE;
         Activity activity = Robolectric.buildActivity(Activity.class).create().get();
-        final AlertDialog alertDialog = createAccessibilityTutorialDialog(activity, mShortcutTypes);
+        final AlertDialog alertDialog =
+                createAccessibilityTutorialDialog(activity, mShortcutTypes, FAKE_FEATURE_NAME);
         alertDialog.show();
 
         alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
@@ -251,4 +583,22 @@
         assertThat(alertDialog.isShowing()).isFalse();
         verify(mOnDismissListener).onDismiss(alertDialog);
     }
+
+    private void setTouchExplorationEnabled(boolean enable) {
+        ShadowAccessibilityManager am = shadowOf(
+                mContext.getSystemService(AccessibilityManager.class));
+        am.setTouchExplorationEnabled(enable);
+    }
+
+    private void verifyTutorialTitleAndInstruction(AlertDialog alertDialog, String expectedTitle,
+            String expectedInstruction) {
+        TextSwitcher titleView = alertDialog.findViewById(R.id.title);
+        assertThat(titleView).isNotNull();
+        assertThat(((TextView) titleView.getCurrentView()).getText().toString()).isEqualTo(
+                expectedTitle);
+        TextSwitcher instructionView = alertDialog.findViewById(R.id.instruction);
+        assertThat(instructionView).isNotNull();
+        assertThat(((TextView) instructionView.getCurrentView()).getText().toString()).isEqualTo(
+                expectedInstruction);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
index 526b431..b461cab 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.accessibility.shortcuts;
 
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 import static com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment.SHORTCUT_SETTINGS;
@@ -38,10 +36,12 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.util.Pair;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
 
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.testing.FragmentScenario;
@@ -58,9 +58,11 @@
 import com.android.settings.SubSettings;
 import com.android.settings.accessibility.AccessibilityUtil;
 import com.android.settings.accessibility.PreferredShortcuts;
+import com.android.settings.testutils.AccessibilityTestUtils;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.utils.StringUtil;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
@@ -72,6 +74,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowAccessibilityManager;
 import org.robolectric.shadows.ShadowContentResolver;
 import org.robolectric.shadows.ShadowLooper;
@@ -81,6 +84,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -96,6 +100,8 @@
     private static final CharSequence SCREEN_TITLE = "Fake shortcut title";
     private static final ComponentName TARGET_FAKE_COMPONENT =
             new ComponentName("FakePackage", "FakeClass");
+    private static final ComponentName TARGET_FAKE_COMPONENT_TILE =
+            new ComponentName("FakePackage", "FakeTile");
     private static final String TARGET = MAGNIFICATION_CONTROLLER_NAME;
     private static final Set<String> TARGETS = Set.of(TARGET);
 
@@ -109,12 +115,14 @@
 
     @Before
     public void setUp() {
+        AccessibilityTestUtils.setSoftwareShortcutMode(mContext, /* gestureNavEnabled= */
+                true, /* floatingButtonEnabled= */ false);
         SettingsShadowResources.overrideResource(
-                com.android.internal.R.integer.config_navBarInteractionMode,
-                NAV_BAR_MODE_GESTURAL);
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_BUTTON_MODE,
-                Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE);
+                com.android.internal.R.bool.config_quickSettingsSupported, true);
+        com.android.settings.testutils.shadow.ShadowAccessibilityManager a11yManager =
+                Shadow.extract(mContext.getSystemService(AccessibilityManager.class));
+        a11yManager.setA11yFeatureToTileMap(
+                Map.of(TARGET_FAKE_COMPONENT, TARGET_FAKE_COMPONENT_TILE));
 
         mActivity = Robolectric.buildActivity(FragmentActivity.class).get();
     }
@@ -158,7 +166,7 @@
 
     @Test
     public void fragmentCreated_inSuw_controllersTargetsSet() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ true);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ true, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         mFragmentScenario.onFragment(fragment -> {
@@ -174,7 +182,7 @@
 
     @Test
     public void fragmentCreated_notInSuw_controllersTargetsSet() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         mFragmentScenario.onFragment(fragment -> {
@@ -195,7 +203,7 @@
             assertThat(contentResolver.getContentObservers(uri)).isEmpty();
         }
 
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         for (Uri uri : SHORTCUT_SETTINGS) {
@@ -207,7 +215,7 @@
     public void fragmentDestroyed_unregisterSettingsObserver() {
         ShadowContentResolver contentResolver = shadowOf(mContext.getContentResolver());
 
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false)
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET)
                 .moveToState(Lifecycle.State.CREATED);
         mFragmentScenario.onFragment(EditShortcutsPreferenceFragment::onDestroy);
 
@@ -218,7 +226,7 @@
 
     @Test
     public void onVolumeKeysShortcutSettingChanged_volumeKeyControllerUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         ShortcutUtils.optInValueToSettings(
@@ -233,7 +241,7 @@
 
     @Test
     public void onSoftwareShortcutSettingChanged_softwareControllersUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         ShortcutUtils.optInValueToSettings(
@@ -249,7 +257,7 @@
 
     @Test
     public void onSoftwareShortcutModeChanged_softwareControllersUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         ShortcutUtils.optInValueToSettings(
@@ -265,7 +273,7 @@
 
     @Test
     public void onTripleTapShortcutSettingChanged_tripleTapShortcutControllerUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         Settings.Secure.putInt(
@@ -283,7 +291,7 @@
 
     @Test
     public void onTwoFingersShortcutSettingChanged_twoFingersDoubleTapShortcutControllerUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
 
         Settings.Secure.putInt(
@@ -302,12 +310,12 @@
 
     @Test
     public void fragmentResumed_enableTouchExploration_gestureShortcutOptionSummaryUpdated() {
-        String expectedSummary = mContext.getString(
-                R.string.accessibility_shortcut_edit_dialog_summary_software_gesture_talkback)
+        String expectedSummary = StringUtil.getIcuPluralsString(mContext, 3,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture)
                 + "\n\n"
                 + mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+                R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
 
         ShadowAccessibilityManager am = shadowOf(
@@ -323,12 +331,12 @@
 
     @Test
     public void fragmentPaused_enableTouchExploration_gestureShortcutOptionSummaryNotUpdated() {
-        String expectedSummary = mContext.getString(
-                R.string.accessibility_shortcut_edit_dialog_summary_software_gesture)
+        String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture)
                 + "\n\n"
                 + mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+                R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.RESUMED).moveToState(Lifecycle.State.STARTED);
 
         ShadowAccessibilityManager am = shadowOf(
@@ -343,8 +351,48 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void fragmentResumed_enableTouchExploration_qsShortcutOptionSummaryUpdated() {
+        String expectedSummary = StringUtil.getIcuPluralsString(mContext, 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+        mFragmentScenario = createFragScenario(
+                /* isInSuw= */ false, TARGET_FAKE_COMPONENT.flattenToString());
+        mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
+
+        ShadowAccessibilityManager am = shadowOf(
+                mContext.getSystemService(AccessibilityManager.class));
+        am.setTouchExplorationEnabled(true);
+
+        mFragmentScenario.onFragment(fragment -> {
+            Preference preference = fragment.findPreference(
+                    mContext.getString(R.string.accessibility_shortcut_quick_settings_pref));
+            assertThat(preference.getSummary().toString()).isEqualTo(expectedSummary);
+        });
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void fragmentPaused_enableTouchExploration_qsShortcutOptionSummaryNotUpdated() {
+        String expectedSummary = StringUtil.getIcuPluralsString(mContext, 1,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+        mFragmentScenario = createFragScenario(
+                /* isInSuw= */ false, TARGET_FAKE_COMPONENT.flattenToString());
+        mFragmentScenario.moveToState(Lifecycle.State.RESUMED).moveToState(Lifecycle.State.STARTED);
+
+        ShadowAccessibilityManager am = shadowOf(
+                mContext.getSystemService(AccessibilityManager.class));
+        am.setTouchExplorationEnabled(true);
+
+        mFragmentScenario.onFragment(fragment -> {
+            Preference preference = fragment.findPreference(
+                    mContext.getString(R.string.accessibility_shortcut_quick_settings_pref));
+            assertThat(preference.getSummary().toString()).isEqualTo(expectedSummary);
+        });
+    }
+
+    @Test
     public void onAdvancedPreferenceClicked_advancedShouldBecomeInvisible() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
         mFragmentScenario.onFragment(fragment -> {
             Preference advanced = fragment.findPreference(
@@ -372,7 +420,7 @@
 
     @Test
     public void fragmentRecreated_collapsed_advancedRemainVisible() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
 
         mFragmentScenario.recreate();
@@ -386,7 +434,7 @@
 
     @Test
     public void fragmentResumed_preferredShortcutsUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.RESUMED);
         // Move the fragment to the background
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
@@ -408,7 +456,7 @@
 
     @Test
     public void onVolumeKeysShortcutSettingChanged_preferredShortcutsUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
         assertThat(
                 PreferredShortcuts.retrieveUserShortcutType(
@@ -481,22 +529,25 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onQuickSettingsShortcutSettingChanged_preferredShortcutsUpdated() {
-        mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+        final String target = TARGET_FAKE_COMPONENT.flattenToString();
+        mFragmentScenario = createFragScenario(
+                /* isInSuw= */ false, TARGET_FAKE_COMPONENT.flattenToString());
         mFragmentScenario.moveToState(Lifecycle.State.CREATED);
         int currentPreferredShortcut =
-                PreferredShortcuts.retrieveUserShortcutType(mContext, TARGET);
+                PreferredShortcuts.retrieveUserShortcutType(mContext, target);
         assertThat(currentPreferredShortcut
                 & ShortcutConstants.UserShortcutType.QUICK_SETTINGS).isEqualTo(0);
 
         ShortcutUtils.optInValueToSettings(
-                mContext, ShortcutConstants.UserShortcutType.QUICK_SETTINGS, TARGET);
+                mContext, ShortcutConstants.UserShortcutType.QUICK_SETTINGS, target);
 
         // Calls onFragment so that the change to Setting is notified to its observer
         mFragmentScenario.onFragment(fragment ->
                 assertThat(
                         PreferredShortcuts.retrieveUserShortcutType(
-                                mContext, TARGET)
+                                mContext, target)
                 ).isEqualTo(ShortcutConstants.UserShortcutType.QUICK_SETTINGS)
         );
     }
@@ -537,10 +588,11 @@
         return retControllers;
     }
 
-    private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(boolean isInSuw) {
+    private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(
+            boolean isInSuw, String target) {
         Bundle args = new Bundle();
         args.putStringArray(
-                EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS, new String[]{TARGET});
+                EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS, new String[]{target});
         FragmentScenario<EditShortcutsPreferenceFragment> scenario =
                 FragmentScenario.launch(
                         EditShortcutsPreferenceFragment.class, args,
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionControllerTest.java
index b39aa22..20f5d5d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/FloatingButtonShortcutOptionControllerTest.java
@@ -24,7 +24,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.provider.Settings;
-import android.text.TextUtils;
 
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
@@ -74,19 +73,24 @@
     }
 
     @Test
-    public void getSummary_inSuw_verifySummaryEmpty() {
+    public void getSummary_inSuw_verifySummary() {
+        String expectedSummary = mContext.getString(
+                R.string.accessibility_shortcut_edit_dialog_summary_floating_button);
         mController.setInSetupWizard(true);
 
-        assertThat(TextUtils.isEmpty(mController.getSummary())).isTrue();
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
     }
 
     @Test
     public void getSummary_notInSuw_verifySummary() {
+        String expectedSummary = mContext.getText(
+                R.string.accessibility_shortcut_edit_dialog_summary_floating_button)
+                + "\n\n"
+                + mContext.getString(
+                R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
         mController.setInSetupWizard(false);
 
-        assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_summary_software_floating));
+        assertThat(mController.getSummary().toString()).isEqualTo(expectedSummary);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
index 155cb22..0149cc3 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
@@ -34,6 +34,7 @@
 import com.android.settings.R;
 import com.android.settings.testutils.AccessibilityTestUtils;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.utils.StringUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -82,10 +83,13 @@
     }
 
     @Test
-    public void getSummary_touchExplorationDisabled_verifySummary() {
+    public void getSummary_touchExplorationDisabled_notInSuw_verifySummary() {
         enableTouchExploration(false);
-        String expected = mContext.getString(
-                R.string.accessibility_shortcut_edit_dialog_summary_software_gesture)
+        mController.setInSetupWizard(false);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture)
                 + "\n\n"
                 + mContext.getString(
                 R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
@@ -94,10 +98,25 @@
     }
 
     @Test
-    public void getSummary_touchExplorationEnabled_verifySummary() {
+    public void getSummary_touchExplorationDisabled_inSuw_verifySummary() {
+        enableTouchExploration(false);
+        mController.setInSetupWizard(true);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
+    }
+
+    @Test
+    public void getSummary_touchExplorationEnabled_notInSuw_verifySummary() {
         enableTouchExploration(true);
-        String expected = mContext.getString(
-                R.string.accessibility_shortcut_edit_dialog_summary_software_gesture_talkback)
+        mController.setInSetupWizard(false);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 3,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture)
                 + "\n\n"
                 + mContext.getString(
                 R.string.accessibility_shortcut_edit_dialog_summary_software_floating);
@@ -106,6 +125,18 @@
     }
 
     @Test
+    public void getSummary_touchExplorationEnabled_inSuw_verifySummary() {
+        enableTouchExploration(true);
+        mController.setInSetupWizard(true);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 3,
+                R.string.accessibility_shortcut_edit_dialog_summary_gesture);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
+    }
+
+    @Test
     public void isShortcutAvailable_inSuw_returnFalse() {
         mController.setInSetupWizard(true);
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java
index 6086b17..55fbd8e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.accessibility.shortcuts;
 
+import static com.android.settings.testutils.AccessibilityTestUtils.setupMockAccessibilityManager;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.spy;
@@ -40,12 +42,14 @@
 import com.android.settings.R;
 import com.android.settings.testutils.AccessibilityTestUtils;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.utils.StringUtil;
 
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 import java.util.Collections;
 import java.util.List;
@@ -55,6 +59,7 @@
 /**
  * Tests for {@link QuickSettingsShortcutOptionController}
  */
+@Config(shadows = SettingsShadowResources.class)
 @RunWith(RobolectricTestRunner.class)
 public class QuickSettingsShortcutOptionControllerTest {
     private static final String PREF_KEY = "prefKey";
@@ -87,15 +92,60 @@
     }
 
     @Test
-    public void displayPreference_verifyScreenTextSet() {
+    public void displayPreference_verifyScreenTitleSet() {
         mController.displayPreference(mPreferenceScreen);
 
         assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(
                 mContext.getString(
                         R.string.accessibility_shortcut_edit_dialog_title_quick_settings));
-        assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(
-                mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_summary_quick_settings));
+    }
+
+    @Test
+    public void getSummary_touchExplorationDisabled_inSuw_verifySummary() {
+        enableTouchExploration(false);
+        mController.setInSetupWizard(true);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 1,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings_suw);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
+    }
+
+    @Test
+    public void getSummary_touchExplorationDisabled_notInSuw_verifySummary() {
+        enableTouchExploration(false);
+        mController.setInSetupWizard(false);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 1,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
+    }
+
+    @Test
+    public void getSummary_touchExplorationEnabled_inSuw_verifySummary() {
+        enableTouchExploration(true);
+        mController.setInSetupWizard(true);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings_suw);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
+    }
+
+    @Test
+    public void getSummary_touchExplorationEnabled_notInSuw_verifySummary() {
+        enableTouchExploration(true);
+        mController.setInSetupWizard(false);
+        String expected = StringUtil.getIcuPluralsString(
+                mContext,
+                /* count= */ 2,
+                R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+
+        assertThat(mController.getSummary().toString()).isEqualTo(expected);
     }
 
     @Test
@@ -177,4 +227,9 @@
 
         assertThat(mController.isChecked()).isFalse();
     }
+
+    private void enableTouchExploration(boolean enable) {
+        AccessibilityManager am = setupMockAccessibilityManager(mContext);
+        when(am.isTouchExplorationEnabled()).thenReturn(enable);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
index b5daac5..1ffd042 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
@@ -27,7 +27,6 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.icu.text.MessageFormat;
 import android.os.UserHandle;
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
@@ -83,16 +82,16 @@
     }
 
     @Test
-    public void displayPreference_verifyScreenTestSet() {
+    public void displayPreference_verifyTitleSummaryText() {
+        String expectedTitle = mContext.getString(
+                R.string.accessibility_shortcut_edit_screen_title_triple_tap);
+        String expectedSummary = mContext.getString(
+                R.string.accessibility_shortcut_edit_screen_summary_triple_tap, 3);
+
         mController.displayPreference(mPreferenceScreen);
 
-        assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_shortcut_edit_dialog_title_triple_tap));
-        assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(
-                MessageFormat.format(
-                        mContext.getString(
-                                R.string.accessibility_shortcut_edit_dialog_summary_triple_tap),
-                        3));
+        assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(expectedTitle);
+        assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(expectedSummary);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
index 716dcdb..dde60e9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
@@ -24,7 +24,6 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.icu.text.MessageFormat;
 import android.os.UserHandle;
 import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
@@ -82,15 +81,15 @@
 
     @Test
     public void displayPreference_verifyScreenTextSet() {
+        String expectedTitle = mContext.getString(
+                R.string.accessibility_shortcut_edit_screen_title_two_finger_double_tap, 2);
+        String expectedSummary = mContext.getString(
+                R.string.accessibility_shortcut_edit_screen_summary_two_finger_double_tap, 2);
+
         mController.displayPreference(mPreferenceScreen);
 
-        assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(
-                mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_title_two_finger_double_tap));
-        assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(
-                MessageFormat.format(mContext.getString(
-                        R.string.accessibility_shortcut_edit_dialog_summary_two_finger_double_tap),
-                        2));
+        assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(expectedTitle);
+        assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(expectedSummary);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/display/EvenDimmerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/EvenDimmerPreferenceControllerTest.java
index a3cf151..af84ac0 100644
--- a/tests/robotests/src/com/android/settings/display/EvenDimmerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/EvenDimmerPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -111,4 +112,18 @@
         assertThat(Settings.Secure.getFloat(mContext.getContentResolver(),
                 Settings.Secure.EVEN_DIMMER_ACTIVATED)).isEqualTo(0.0f); // false
     }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    public void testDisabledIfAutobrightnessIsOff() {
+        // Autobrightness off
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+        // Try turn controller on
+        mController.setChecked(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                DISABLED_DEPENDENT_SETTING);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
index d6e17d4..de7792c 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
@@ -16,14 +16,15 @@
 
 package com.android.settings.testutils.shadow;
 
+import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.content.ComponentName;
+import android.util.ArrayMap;
 import android.view.accessibility.AccessibilityManager;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-import java.util.Collections;
 import java.util.Map;
 
 /**
@@ -31,12 +32,21 @@
  */
 @Implements(AccessibilityManager.class)
 public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAccessibilityManager {
+    private Map<ComponentName, ComponentName> mA11yFeatureToTileMap = new ArrayMap<>();
+
     /**
-     * Implements a hidden method {@link AccessibilityManager.getA11yFeatureToTileMap} and returns
-     * an empty map.
+     * Implements a hidden method {@link AccessibilityManager.getA11yFeatureToTileMap}
      */
     @Implementation
     public Map<ComponentName, ComponentName> getA11yFeatureToTileMap(@UserIdInt int userId) {
-        return Collections.emptyMap();
+        return mA11yFeatureToTileMap;
+    }
+
+    /**
+     * Set fake a11y feature to tile mapping
+     */
+    public void setA11yFeatureToTileMap(
+            @NonNull Map<ComponentName, ComponentName> a11yFeatureToTileMap) {
+        mA11yFeatureToTileMap = a11yFeatureToTileMap;
     }
 }
diff --git a/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
index 857135f..f6242ef 100644
--- a/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
@@ -35,6 +35,7 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -71,6 +72,7 @@
     }
 
     /** Tests that the controller is always available. */
+    @Ignore("b/323652985")
     @Test
     public void getAvailabilityStatus_whenFlagsEnabled_returnsAvailable() {
         mSetFlagsRule.enableFlags(
@@ -131,6 +133,7 @@
     }
 
     /** Tests that preference is enabled and summary is not same as device lock. */
+    @Ignore("b/323652985")
     @Test
     public void getSummary_whenSeparateProfileLock() {
         doReturn(true).when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
diff --git a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
index 5c2a15c..d029552 100644
--- a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
@@ -40,6 +40,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -82,6 +83,7 @@
 
 
     /** Tests that summary in controller is Pattern. */
+    @Ignore("b/323652985")
     @Test
     public void getSummary_whenProfileLockPattern() {
         doReturn(true)
@@ -96,6 +98,7 @@
     }
 
     /** Tests that summary in controller is PIN. */
+    @Ignore("b/323652985")
     @Test
     public void getSummary_whenProfileLockPin() {
         doReturn(true)
@@ -109,6 +112,7 @@
     }
 
     /** Tests that summary in controller is Password. */
+    @Ignore("b/323652985")
     @Test
     public void getSummary_whenProfileLockPassword() {
         doReturn(true)
