diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
index 371613f..013b4d4 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiver.java
@@ -38,7 +38,7 @@
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class AudioSharingReceiver extends BroadcastReceiver {
-    private static final String TAG = "AudioSharingNotification";
+    private static final String TAG = "AudioSharingReceiver";
     private static final String ACTION_LE_AUDIO_SHARING_SETTINGS =
             "com.android.settings.BLUETOOTH_AUDIO_SHARING_SETTINGS";
     private static final String ACTION_LE_AUDIO_SHARING_STOP =
@@ -49,10 +49,6 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        if (!BluetoothUtils.isAudioSharingEnabled()) {
-            Log.w(TAG, "Skip handling received intent, flag is off.");
-            return;
-        }
         String action = intent.getAction();
         if (action == null) {
             Log.w(TAG, "Received unexpected intent with null action.");
@@ -66,13 +62,22 @@
                         intent.getIntExtra(
                                 LocalBluetoothLeBroadcast.EXTRA_LE_AUDIO_SHARING_STATE, -1);
                 if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_ON) {
+                    if (!BluetoothUtils.isAudioSharingEnabled()) {
+                        Log.w(TAG, "Skip showSharingNotification, feature disabled.");
+                        return;
+                    }
                     showSharingNotification(context);
                     metricsFeatureProvider.action(
                             context, SettingsEnums.ACTION_SHOW_AUDIO_SHARING_NOTIFICATION);
                 } else if (state == LocalBluetoothLeBroadcast.BROADCAST_STATE_OFF) {
+                    // TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
+                    //       isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
+                    //       isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
+                    //       or FEATURE_NOT_SUPPORTED when BT and BLE off
                     cancelSharingNotification(context);
                     metricsFeatureProvider.action(
-                            context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+                            context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                            LocalBluetoothLeBroadcast.ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
                 } else {
                     Log.w(
                             TAG,
@@ -80,16 +85,24 @@
                 }
                 break;
             case ACTION_LE_AUDIO_SHARING_STOP:
-                LocalBluetoothManager manager = Utils.getLocalBtManager(context);
-                if (BluetoothUtils.isBroadcasting(manager)) {
-                    AudioSharingUtils.stopBroadcasting(manager);
-                    metricsFeatureProvider.action(
-                            context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
-                } else {
-                    cancelSharingNotification(context);
-                    metricsFeatureProvider.action(
-                            context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+                if (BluetoothUtils.isAudioSharingEnabled()) {
+                    LocalBluetoothManager manager = Utils.getLocalBtManager(context);
+                    if (BluetoothUtils.isBroadcasting(manager)) {
+                        AudioSharingUtils.stopBroadcasting(manager);
+                        metricsFeatureProvider.action(
+                                context, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
+                        return;
+                    }
                 }
+                Log.w(TAG, "cancelSharingNotification, feature disabled or not in broadcast.");
+                // TODO: check BluetoothUtils#isAudioSharingEnabled() till BluetoothAdapter#
+                //       isLeAudioBroadcastSourceSupported() and BluetoothAdapter#
+                //       isLeAudioBroadcastAssistantSupported() always return FEATURE_SUPPORTED
+                //       or FEATURE_NOT_SUPPORTED when BT and BLE off
+                cancelSharingNotification(context);
+                metricsFeatureProvider.action(
+                        context, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STOP);
                 break;
             default:
                 Log.w(TAG, "Received unexpected intent " + intent.getAction());
@@ -129,15 +142,15 @@
                         PendingIntent.FLAG_IMMUTABLE);
         NotificationCompat.Action stopAction =
                 new NotificationCompat.Action.Builder(
-                                0,
-                                context.getString(R.string.audio_sharing_stop_button_label),
-                                stopPendingIntent)
+                        0,
+                        context.getString(R.string.audio_sharing_stop_button_label),
+                        stopPendingIntent)
                         .build();
         NotificationCompat.Action settingsAction =
                 new NotificationCompat.Action.Builder(
-                                0,
-                                context.getString(R.string.audio_sharing_settings_button_label),
-                                settingsPendingIntent)
+                        0,
+                        context.getString(R.string.audio_sharing_settings_button_label),
+                        settingsPendingIntent)
                         .build();
         final Bundle extras = new Bundle();
         extras.putString(
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
index db6eb8c..e720038 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingReceiverTest.java
@@ -130,7 +130,7 @@
     }
 
     @Test
-    public void broadcastReceiver_receiveAudioSharingStateChangeIntentFlagOff_doNothing() {
+    public void broadcastReceiver_receiveAudioSharingStateOn_flagOff_doNothing() {
         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
 
         Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -140,6 +140,23 @@
         audioSharingReceiver.onReceive(mContext, intent);
 
         verifyNoInteractions(mNm);
+        verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
+    }
+
+    @Test
+    public void broadcastReceiver_receiveAudioSharingStateOn_broadcastDisabled_doNothing() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+        mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+                BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
+
+        Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+        intent.setPackage(mContext.getPackageName());
+        intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_ON);
+        AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
+        audioSharingReceiver.onReceive(mContext, intent);
+
+        verifyNoInteractions(mNm);
+        verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
     }
 
     @Test
@@ -152,10 +169,11 @@
         audioSharingReceiver.onReceive(mContext, intent);
 
         verifyNoInteractions(mNm);
+        verifyNoInteractions(mFeatureFactory.metricsFeatureProvider);
     }
 
     @Test
-    public void broadcastReceiver_receiveAudioSharingStateChangeIntentOnState_showNotification() {
+    public void broadcastReceiver_receiveAudioSharingStateOn_broadcastEnabled_showNotification() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
 
         Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -171,7 +189,26 @@
 
     @Test
     public void
-            broadcastReceiver_receiveAudioSharingStateChangeIntentOffState_cancelNotification() {
+            broadcastReceiver_receiveAudioSharingStateOff_broadcastDisabled_cancelNotification() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+        mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+                BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
+
+        Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+        intent.setPackage(mContext.getPackageName());
+        intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, BROADCAST_STATE_OFF);
+        AudioSharingReceiver audioSharingReceiver = getAudioSharingReceiver(intent);
+        audioSharingReceiver.onReceive(mContext, intent);
+
+        verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
+        verify(mFeatureFactory.metricsFeatureProvider)
+                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
+    }
+
+    @Test
+    public void
+            broadcastReceiver_receiveAudioSharingStateOff_broadcastEnabled_cancelNotification() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
 
         Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
@@ -182,12 +219,15 @@
 
         verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STATE_CHANGE);
     }
 
     @Test
-    public void broadcastReceiver_receiveAudioSharingStopIntentFlagOff_doNothing() {
-        mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+    public void broadcastReceiver_receiveAudioSharingStop_broadcastDisabled_cancelNotification() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
+        mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
+                BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED);
 
         Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STOP);
         intent.setPackage(mContext.getPackageName());
@@ -195,11 +235,14 @@
         audioSharingReceiver.onReceive(mContext, intent);
 
         verifyNoInteractions(mBroadcast);
+        verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
+        verify(mFeatureFactory.metricsFeatureProvider)
+                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STOP);
     }
 
     @Test
-    public void
-            broadcastReceiver_receiveAudioSharingStopIntent_notInBroadcast_cancelNotification() {
+    public void broadcastReceiver_receiveAudioSharingStop_notInBroadcast_cancelNotification() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         when(mBroadcast.isEnabled(null)).thenReturn(false);
         int broadcastId = 1;
@@ -213,11 +256,12 @@
         verify(mBroadcast, never()).stopBroadcast(broadcastId);
         verify(mNm).cancel(R.drawable.ic_bt_le_audio_sharing);
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION);
+                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STOP);
     }
 
     @Test
-    public void broadcastReceiver_receiveAudioSharingStopIntent_inBroadcast_stopBroadcast() {
+    public void broadcastReceiver_receiveAudioSharingStop_inBroadcast_stopBroadcast() {
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
         when(mBroadcast.isEnabled(null)).thenReturn(true);
         int broadcastId = 1;
@@ -231,6 +275,10 @@
         verify(mBroadcast).stopBroadcast(broadcastId);
         verify(mFeatureFactory.metricsFeatureProvider)
                 .action(mContext, SettingsEnums.ACTION_STOP_AUDIO_SHARING_FROM_NOTIFICATION);
+        verify(mNm, never()).cancel(R.drawable.ic_bt_le_audio_sharing);
+        verify(mFeatureFactory.metricsFeatureProvider, never())
+                .action(mContext, SettingsEnums.ACTION_CANCEL_AUDIO_SHARING_NOTIFICATION,
+                        ACTION_LE_AUDIO_SHARING_STOP);
     }
 
     private AudioSharingReceiver getAudioSharingReceiver(Intent intent) {
