Merge "Add the error dialogs" into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cf13dfb..bcf6474 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5164,8 +5164,8 @@
     <string name="accessibility_hearingaid_instruction_continue_button">Continue</string>
     <!-- Title for the accessibility preference for hearing devices. [CHAR LIMIT=35] -->
     <string name="accessibility_hearingaid_title">Hearing devices</string>
-    <!-- Introduction for the Hearing devices page to introduce feature. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_hearingaid_intro">You can use hearing aids, cochlear implants, and other amplification devices with your phone</string>
+    <!-- Introduction for the Hearing devices page to introduce feature. [CHAR LIMIT=NONE BACKUP_MESSAGE_ID=5856992709195963850] -->
+    <string name="accessibility_hearingaid_intro">Set up and manage ASHA and LE Audio hearing aids, cochlear implants, and other amplification devices</string>
     <!-- Summary for the accessibility preference for hearing aid when not connected. [CHAR LIMIT=50] -->
     <string name="accessibility_hearingaid_not_connected_summary">No hearing devices connected</string>
     <!-- Summary for the accessibility preference for hearing aid when adding new devices. [CHAR LIMIT=50] -->
@@ -5200,6 +5200,8 @@
     <string name="accessibility_hac_mode_summary">Improves compatibility with telecoils and reduces unwanted noise</string>
     <!-- Title for accessibility hearing device page footer. [CHAR LIMIT=40] -->
     <string name="accessibility_hearing_device_about_title">About hearing devices</string>
+    <!-- Description for text in accessibility hearing aids footer. [CHAR LIMIT=NONE BACKUP_MESSAGE_ID=7451899224828040581] -->
+    <string name="accessibility_hearing_device_footer_summary">To find other hearing devices that aren’t supported by ASHA or LE Audio, tap <b>Pair new device</b> > <b>See more devices</b></string>
     <!-- Title for the pair hearing device page. [CHAR LIMIT=25] -->
     <string name="accessibility_hearing_device_pairing_page_title">Pair hearing device</string>
     <!-- Subtitle for the pair hearing device page. [CHAR LIMIT=NONE] -->
diff --git a/res/xml/accessibility_hearing_aids.xml b/res/xml/accessibility_hearing_aids.xml
index 27a4212..57a0fe2 100644
--- a/res/xml/accessibility_hearing_aids.xml
+++ b/res/xml/accessibility_hearing_aids.xml
@@ -60,4 +60,11 @@
             settings:searchable="true"
             settings:controller="com.android.settings.accessibility.HearingAidCompatibilityPreferenceController"/>
     </PreferenceCategory>
+
+    <com.android.settings.accessibility.AccessibilityFooterPreference
+        android:key="hearing_device_footer"
+        android:title="@string/accessibility_hearing_device_footer_summary"
+        android:selectable="false"
+        settings:searchable="false"
+        settings:controller="com.android.settings.accessibility.HearingDeviceFooterPreferenceController"/>
 </PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/hearing_device_pairing_fragment.xml b/res/xml/hearing_device_pairing_fragment.xml
index ce7f39f..d84f22b 100644
--- a/res/xml/hearing_device_pairing_fragment.xml
+++ b/res/xml/hearing_device_pairing_fragment.xml
@@ -38,5 +38,4 @@
             settings:useAdminDisabledSummary="true"
             settings:controller="com.android.settings.accessibility.ViewAllBluetoothDevicesPreferenceController"/>
     </PreferenceCategory>
-
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt
index e3a565a..98bb5d7 100644
--- a/src/com/android/settings/network/SimOnboardingActivity.kt
+++ b/src/com/android/settings/network/SimOnboardingActivity.kt
@@ -106,7 +106,7 @@
 
         if (onboardingService.activeSubInfoList.isEmpty()) {
             // TODO: refactor and replace the ToggleSubscriptionDialogActivity
-            Log.e(TAG, "onboardingService.activeSubInfoList is empty" +
+            Log.d(TAG, "onboardingService.activeSubInfoList is empty" +
                     ", start ToggleSubscriptionDialogActivity")
             this.startActivity(ToggleSubscriptionDialogActivity
                     .getIntent(this.applicationContext, targetSubId, true))
diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java
index 79df55a..e70cf95 100644
--- a/src/com/android/settings/notification/MediaVolumePreferenceController.java
+++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java
@@ -37,6 +37,7 @@
 import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.SliceBackgroundWorker;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.flags.Flags;
 import com.android.settingslib.media.BluetoothMediaDevice;
 import com.android.settingslib.media.MediaDevice;
 import com.android.settingslib.media.MediaOutputConstants;
@@ -94,7 +95,9 @@
 
     @VisibleForTesting
     boolean isSupportEndItem() {
-        return getWorker() != null && getWorker().isBroadcastSupported()
+        return Flags.legacyLeAudioSharing()
+                && getWorker() != null
+                && getWorker().isBroadcastSupported()
                 && (getWorker().isDeviceBroadcasting() || isConnectedBLEDevice());
     }
 
@@ -114,8 +117,9 @@
         if (mPreference != null) {
             if (mPreference.isMuted()) {
                 mPreference.updateContentDescription(
-                        mContext.getString(R.string.volume_content_description_silent_mode,
-                        mPreference.getTitle()));
+                        mContext.getString(
+                                R.string.volume_content_description_silent_mode,
+                                mPreference.getTitle()));
             } else {
                 mPreference.updateContentDescription(mPreference.getTitle());
             }
@@ -134,11 +138,16 @@
         if (getWorker().isDeviceBroadcasting()) {
             intent.setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME);
             intent.setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG);
-            intent.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
+            intent.putExtra(
+                    MediaOutputConstants.EXTRA_PACKAGE_NAME,
                     getWorker().getActiveLocalMediaController().getPackageName());
 
-            pi = PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
-                    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+            pi =
+                    PendingIntent.getBroadcast(
+                            context,
+                            0 /* requestCode */,
+                            intent,
+                            PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
         } else {
             final CachedBluetoothDevice bluetoothDevice =
                     ((BluetoothMediaDevice) mMediaDevice).getCachedDevice();
@@ -147,15 +156,21 @@
                 return null;
             }
             intent.setAction(ACTION_LAUNCH_BROADCAST_DIALOG);
-            intent.putExtra(BluetoothBroadcastDialog.KEY_APP_LABEL,
+            intent.putExtra(
+                    BluetoothBroadcastDialog.KEY_APP_LABEL,
                     Utils.getApplicationLabel(mContext, getWorker().getPackageName()));
-            intent.putExtra(BluetoothBroadcastDialog.KEY_DEVICE_ADDRESS,
-                    bluetoothDevice.getAddress());
-            intent.putExtra(BluetoothBroadcastDialog.KEY_MEDIA_STREAMING, getWorker() != null
-                    && getWorker().getActiveLocalMediaController() != null);
+            intent.putExtra(
+                    BluetoothBroadcastDialog.KEY_DEVICE_ADDRESS, bluetoothDevice.getAddress());
+            intent.putExtra(
+                    BluetoothBroadcastDialog.KEY_MEDIA_STREAMING,
+                    getWorker() != null && getWorker().getActiveLocalMediaController() != null);
 
-            pi = PendingIntent.getActivity(context, 0 /* requestCode */, intent,
-                    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+            pi =
+                    PendingIntent.getActivity(
+                            context,
+                            0 /* requestCode */,
+                            intent,
+                            PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
         }
 
         final IconCompat icon = getBroadcastIcon(context);
@@ -164,8 +179,8 @@
     }
 
     private IconCompat getBroadcastIcon(Context context) {
-        final Drawable drawable = context.getDrawable(
-                com.android.settingslib.R.drawable.settings_input_antenna);
+        final Drawable drawable =
+                context.getDrawable(com.android.settingslib.R.drawable.settings_input_antenna);
         if (drawable != null) {
             drawable.setTint(Utils.getColorAccentDefaultColor(context));
             return Utils.createIconWithDrawable(drawable);
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index 4544e73..8840994 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -136,9 +136,7 @@
         }
 
         if (Flags.isDualSimOnboardingEnabled()
-                && getProgressState() == SubscriptionActionDialogActivity.PROGRESS_IS_SHOWING
-                && (dialogType == PREFERRED_PICK
-                || dialogType == DATA_PICK
+                && (dialogType == DATA_PICK
                 || dialogType == CALLS_PICK
                 || dialogType == SMS_PICK)) {
             Log.d(TAG, "Finish the sim dialog since the sim onboarding is shown");
diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
index ed93473..a25f472 100644
--- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
@@ -31,17 +31,23 @@
 import android.media.AudioManager;
 import android.media.session.MediaController;
 import android.net.Uri;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import androidx.slice.builders.SliceAction;
 
 import com.android.settings.media.MediaOutputIndicatorWorker;
 import com.android.settings.slices.SliceBackgroundWorker;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.flags.Flags;
 import com.android.settingslib.media.BluetoothMediaDevice;
 import com.android.settingslib.media.MediaDevice;
 import com.android.settingslib.media.MediaOutputConstants;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -60,16 +66,16 @@
             "android.settings.MEDIA_BROADCAST_DIALOG";
     private static MediaOutputIndicatorWorker sMediaOutputIndicatorWorker;
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     private MediaVolumePreferenceController mController;
 
     private Context mContext;
 
-    @Mock
-    private MediaController mMediaController;
-    @Mock
-    private MediaDevice mDevice1;
-    @Mock
-    private MediaDevice mDevice2;
+    @Mock private MediaController mMediaController;
+    @Mock private MediaDevice mDevice1;
+    @Mock private MediaDevice mDevice2;
 
     @Before
     public void setUp() {
@@ -77,8 +83,8 @@
 
         mContext = RuntimeEnvironment.application;
         mController = new MediaVolumePreferenceController(mContext);
-        sMediaOutputIndicatorWorker = spy(
-                new MediaOutputIndicatorWorker(mContext, VOLUME_MEDIA_URI));
+        sMediaOutputIndicatorWorker =
+                spy(new MediaOutputIndicatorWorker(mContext, VOLUME_MEDIA_URI));
         when(mDevice1.isBLEDevice()).thenReturn(true);
         when(mDevice2.isBLEDevice()).thenReturn(false);
     }
@@ -101,8 +107,8 @@
 
     @Test
     public void isSliceableCorrectKey_returnsTrue() {
-        final MediaVolumePreferenceController controller = new MediaVolumePreferenceController(
-                mContext);
+        final MediaVolumePreferenceController controller =
+                new MediaVolumePreferenceController(mContext);
         assertThat(controller.isSliceable()).isTrue();
     }
 
@@ -112,6 +118,17 @@
     }
 
     @Test
+    @RequiresFlagsDisabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
+    public void isSupportEndItem_flagOff_returnsFalse() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
+        doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
+
+        assertThat(mController.isSupportEndItem()).isFalse();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void isSupportEndItem_withBleDevice_returnsTrue() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
@@ -121,6 +138,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void isSupportEndItem_notSupportedBroadcast_returnsFalse() {
         doReturn(false).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
@@ -129,6 +147,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void isSupportEndItem_withNonBleDevice_returnsFalse() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
@@ -138,6 +157,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void isSupportEndItem_deviceIsBroadcastingAndConnectedToNonBleDevice_returnsTrue() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
@@ -147,6 +167,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void isSupportEndItem_deviceIsNotBroadcastingAndConnectedToNonBleDevice_returnsFalse() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
@@ -155,8 +176,20 @@
         assertThat(mController.isSupportEndItem()).isFalse();
     }
 
+    @Test
+    @RequiresFlagsDisabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
+    public void getSliceEndItem_flagOff_getsNullSliceAction() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
+        doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
+
+        final SliceAction sliceAction = mController.getSliceEndItem(mContext);
+
+        assertThat(sliceAction).isNull();
+    }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void getSliceEndItem_NotSupportEndItem_getsNullSliceAction() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
@@ -168,22 +201,26 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void getSliceEndItem_deviceIsBroadcasting_getsBroadcastIntent() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
         doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
-        doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
+        doReturn(mMediaController)
+                .when(sMediaOutputIndicatorWorker)
                 .getActiveLocalMediaController();
 
         final SliceAction sliceAction = mController.getSliceEndItem(mContext);
 
         final PendingIntent endItemPendingIntent = sliceAction.getAction();
-        final PendingIntent expectedToggleIntent = getBroadcastIntent(
-                MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG);
+        final PendingIntent expectedToggleIntent =
+                getBroadcastIntent(
+                        MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG);
         assertThat(endItemPendingIntent).isEqualTo(expectedToggleIntent);
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
     public void getSliceEndItem_deviceIsNotBroadcasting_getsActivityIntent() {
         final MediaDevice device = mock(BluetoothMediaDevice.class);
         final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
@@ -192,7 +229,8 @@
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(device).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
-        doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
+        doReturn(mMediaController)
+                .when(sMediaOutputIndicatorWorker)
                 .getActiveLocalMediaController();
 
         final SliceAction sliceAction = mController.getSliceEndItem(mContext);
@@ -215,13 +253,19 @@
     private PendingIntent getBroadcastIntent(String action) {
         final Intent intent = new Intent(action);
         intent.setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME);
-        return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
+        return PendingIntent.getBroadcast(
+                mContext,
+                0 /* requestCode */,
+                intent,
                 PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
     }
 
     private PendingIntent getActivityIntent(String action) {
         final Intent intent = new Intent(action);
-        return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+        return PendingIntent.getActivity(
+                mContext,
+                0 /* requestCode */,
+                intent,
                 PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
     }
 }