• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.connecteddevice.audiosharing;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.eq;
23 import static org.mockito.Mockito.verify;
24 import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
25 
26 import android.app.settings.SettingsEnums;
27 import android.bluetooth.BluetoothAdapter;
28 import android.bluetooth.BluetoothLeBroadcastMetadata;
29 import android.bluetooth.BluetoothStatusCodes;
30 import android.content.Context;
31 import android.platform.test.flag.junit.SetFlagsRule;
32 import android.util.Pair;
33 import android.view.View;
34 import android.widget.Button;
35 import android.widget.ImageView;
36 import android.widget.TextView;
37 
38 import androidx.annotation.NonNull;
39 import androidx.appcompat.app.AlertDialog;
40 import androidx.fragment.app.Fragment;
41 import androidx.fragment.app.FragmentActivity;
42 import androidx.recyclerview.widget.RecyclerView;
43 
44 import com.android.settings.R;
45 import com.android.settings.testutils.FakeFeatureFactory;
46 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
47 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
48 import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt;
49 import com.android.settingslib.flags.Flags;
50 
51 import org.junit.After;
52 import org.junit.Before;
53 import org.junit.Rule;
54 import org.junit.Test;
55 import org.junit.runner.RunWith;
56 import org.mockito.junit.MockitoJUnit;
57 import org.mockito.junit.MockitoRule;
58 import org.robolectric.RobolectricTestRunner;
59 import org.robolectric.annotation.Config;
60 import org.robolectric.shadow.api.Shadow;
61 import org.robolectric.shadows.androidx.fragment.FragmentController;
62 
63 import java.nio.charset.StandardCharsets;
64 import java.util.ArrayList;
65 import java.util.concurrent.atomic.AtomicBoolean;
66 
67 @RunWith(RobolectricTestRunner.class)
68 @Config(
69         shadows = {
70             ShadowAlertDialogCompat.class,
71             ShadowBluetoothAdapter.class,
72         })
73 public class AudioSharingDialogFragmentTest {
74 
75     @Rule public final MockitoRule mocks = MockitoJUnit.rule();
76     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
77 
78     private static final String TEST_DEVICE_NAME1 = "test1";
79     private static final String TEST_DEVICE_NAME2 = "test2";
80     private static final String TEST_DEVICE_NAME3 = "test3";
81     private static final AudioSharingDeviceItem TEST_DEVICE_ITEM1 =
82             new AudioSharingDeviceItem(TEST_DEVICE_NAME1, /* groupId= */ 1, /* isActive= */ false);
83     private static final AudioSharingDeviceItem TEST_DEVICE_ITEM2 =
84             new AudioSharingDeviceItem(TEST_DEVICE_NAME2, /* groupId= */ 2, /* isActive= */ false);
85     private static final AudioSharingDeviceItem TEST_DEVICE_ITEM3 =
86             new AudioSharingDeviceItem(TEST_DEVICE_NAME3, /* groupId= */ 3, /* isActive= */ false);
87     private static final AudioSharingDialogFragment.DialogEventListener EMPTY_EVENT_LISTENER =
88             new AudioSharingDialogFragment.DialogEventListener() {
89             };
90     private static final Pair<Integer, Object> TEST_EVENT_DATA = Pair.create(1, 1);
91     private static final Pair<Integer, Object>[] TEST_EVENT_DATA_LIST =
92             new Pair[] {TEST_EVENT_DATA};
93     private static final String METADATA_STR =
94             "BLUETOOTH:UUID:184F;BN:VGVzdA==;AT:1;AD:00A1A1A1A1A1;BI:1E240;BC:VGVzdENvZGU=;"
95                     + "MD:BgNwVGVzdA==;AS:1;PI:A0;NS:1;BS:3;NB:2;SM:BQNUZXN0BARlbmc=;;";
96     private static final String METADATA_STR_NO_PASSWORD =
97             "BLUETOOTH:UUID:184F;BN:SG9ja2V5;AT:0;AD:AABBCC001122;BI:DE51E9;SQ:1;AS:1;PI:FFFF;"
98                     + "NS:1;BS:1;NB:1;;";
99     private static final BluetoothLeBroadcastMetadata METADATA =
100             BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata(METADATA_STR);
101     private static final BluetoothLeBroadcastMetadata METADATA_NO_PASSWORD =
102             BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata(
103                     METADATA_STR_NO_PASSWORD);
104 
105     private Fragment mParent;
106     private FakeFeatureFactory mFeatureFactory;
107 
108     @Before
setUp()109     public void setUp() {
110         ShadowAlertDialogCompat.reset();
111         ShadowBluetoothAdapter shadowBluetoothAdapter =
112                 Shadow.extract(BluetoothAdapter.getDefaultAdapter());
113         shadowBluetoothAdapter.setEnabled(true);
114         shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
115                 BluetoothStatusCodes.FEATURE_SUPPORTED);
116         shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
117                 BluetoothStatusCodes.FEATURE_SUPPORTED);
118         mFeatureFactory = FakeFeatureFactory.setupForTest();
119         mParent = new Fragment();
120         FragmentController.setupFragment(
121                 mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
122     }
123 
124     @After
tearDown()125     public void tearDown() {
126         ShadowAlertDialogCompat.reset();
127     }
128 
129     @Test
getMetricsCategory_correctValue()130     public void getMetricsCategory_correctValue() {
131         AudioSharingDialogFragment fragment = new AudioSharingDialogFragment();
132         assertThat(fragment.getMetricsCategory())
133                 .isEqualTo(SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE);
134     }
135 
136     @Test
onCreateDialog_flagOff_dialogNotExist()137     public void onCreateDialog_flagOff_dialogNotExist() {
138         mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
139         AudioSharingDialogFragment.show(
140                 mParent, new ArrayList<>(), null, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
141         shadowMainLooper().idle();
142         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
143         assertThat(dialog).isNull();
144     }
145 
146     @Test
onCreateDialog_unattachedFragment_dialogNotExist()147     public void onCreateDialog_unattachedFragment_dialogNotExist() {
148         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
149         AudioSharingDialogFragment.show(
150                 new Fragment(), new ArrayList<>(), null, EMPTY_EVENT_LISTENER,
151                 TEST_EVENT_DATA_LIST);
152         shadowMainLooper().idle();
153         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
154         assertThat(dialog).isNull();
155     }
156 
157     @Test
onCreateDialog_flagOn_qrCodeBitmapNull_noExtraConnectedDevice()158     public void onCreateDialog_flagOn_qrCodeBitmapNull_noExtraConnectedDevice() {
159         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
160         AudioSharingDialogFragment.show(
161                 mParent, new ArrayList<>(), null, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
162         shadowMainLooper().idle();
163 
164         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
165         assertThat(dialog).isNotNull();
166         TextView description = dialog.findViewById(R.id.description_text);
167         assertThat(description).isNotNull();
168         ImageView image = dialog.findViewById(R.id.description_image);
169         assertThat(image).isNotNull();
170         Button positiveBtn = dialog.findViewById(R.id.positive_btn);
171         assertThat(positiveBtn).isNotNull();
172         Button negativeBtn = dialog.findViewById(R.id.negative_btn);
173         assertThat(negativeBtn).isNotNull();
174         assertThat(dialog.isShowing()).isTrue();
175         assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
176         assertThat(description.getText().toString())
177                 .isEqualTo(mParent.getString(R.string.audio_sharing_dialog_connect_device_content));
178         assertThat(image.getVisibility()).isEqualTo(View.VISIBLE);
179         assertThat(positiveBtn.getVisibility()).isEqualTo(View.VISIBLE);
180         assertThat(positiveBtn.getText().toString())
181                 .isEqualTo(mParent.getString(R.string.audio_sharing_pair_button_label));
182         assertThat(negativeBtn.getVisibility()).isEqualTo(View.VISIBLE);
183         assertThat(negativeBtn.getText().toString())
184                 .isEqualTo(mParent.getString(R.string.audio_sharing_qrcode_button_label));
185     }
186 
187     @Test
onCreateDialog_noExtraConnectedDevice_pairNewDevice()188     public void onCreateDialog_noExtraConnectedDevice_pairNewDevice() {
189         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
190         AtomicBoolean isPairBtnClicked = new AtomicBoolean(false);
191         AudioSharingDialogFragment.show(
192                 mParent,
193                 new ArrayList<>(),
194                 null,
195                 new AudioSharingDialogFragment.DialogEventListener() {
196                     @Override
197                     public void onPositiveClick() {
198                         isPairBtnClicked.set(true);
199                     }
200                 },
201                 TEST_EVENT_DATA_LIST);
202         shadowMainLooper().idle();
203         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
204         assertThat(dialog).isNotNull();
205         Button pairBtn = dialog.findViewById(R.id.positive_btn);
206         assertThat(pairBtn).isNotNull();
207         pairBtn.performClick();
208         shadowMainLooper().idle();
209 
210         verify(mFeatureFactory.metricsFeatureProvider)
211                 .action(
212                         any(Context.class),
213                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
214                         eq(TEST_EVENT_DATA));
215         assertThat(isPairBtnClicked.get()).isTrue();
216         assertThat(dialog.isShowing()).isFalse();
217     }
218 
219     @Test
onCreateDialog_noExtraConnectedDevice_showQRCodeButton()220     public void onCreateDialog_noExtraConnectedDevice_showQRCodeButton() {
221         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
222         AtomicBoolean isQrCodeBtnClicked = new AtomicBoolean(false);
223         AudioSharingDialogFragment.show(
224                 mParent,
225                 new ArrayList<>(),
226                 null,
227                 new AudioSharingDialogFragment.DialogEventListener() {
228                     @Override
229                     public void onCancelClick() {
230                         isQrCodeBtnClicked.set(true);
231                     }
232                 },
233                 TEST_EVENT_DATA_LIST);
234         shadowMainLooper().idle();
235         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
236         assertThat(dialog).isNotNull();
237         Button qrCodeBtn = dialog.findViewById(R.id.negative_btn);
238         assertThat(qrCodeBtn).isNotNull();
239         assertThat(qrCodeBtn.getText().toString())
240                 .isEqualTo(mParent.getString(R.string.audio_sharing_qrcode_button_label));
241         qrCodeBtn.performClick();
242         shadowMainLooper().idle();
243 
244         verify(mFeatureFactory.metricsFeatureProvider)
245                 .action(
246                         any(Context.class),
247                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
248                         eq(TEST_EVENT_DATA));
249         assertThat(isQrCodeBtnClicked.get()).isTrue();
250         assertThat(dialog.isShowing()).isFalse();
251     }
252 
253     @Test
onCreateDialog_noExtraConnectedDevice_hasMetadata_showCancelButton()254     public void onCreateDialog_noExtraConnectedDevice_hasMetadata_showCancelButton() {
255         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
256         AtomicBoolean isCancelBtnClicked = new AtomicBoolean(false);
257         AudioSharingDialogFragment.show(
258                 mParent,
259                 new ArrayList<>(),
260                 METADATA,
261                 new AudioSharingDialogFragment.DialogEventListener() {
262                     @Override
263                     public void onCancelClick() {
264                         isCancelBtnClicked.set(true);
265                     }
266                 },
267                 TEST_EVENT_DATA_LIST);
268         shadowMainLooper().idle();
269         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
270         assertThat(dialog).isNotNull();
271         ImageView image = dialog.findViewById(R.id.description_image);
272         assertThat(image).isNotNull();
273         TextView text = dialog.findViewById(R.id.description_text);
274         assertThat(text).isNotNull();
275         assertThat(METADATA).isNotNull();
276         assertThat(text.getText().toString()).isEqualTo(
277                 mParent.getString(R.string.audio_sharing_dialog_qr_code_content,
278                         METADATA.getBroadcastName(), new String(
279                                 METADATA.getBroadcastCode(),
280                                 StandardCharsets.UTF_8)));
281         TextView textBottom = dialog.findViewById(R.id.description_text_2);
282         assertThat(textBottom).isNotNull();
283         assertThat(textBottom.getText().toString()).isEqualTo(
284                 mParent.getString(R.string.audio_sharing_dialog_pair_new_device_content));
285         Button cancelBtn = dialog.findViewById(R.id.negative_btn);
286         assertThat(cancelBtn).isNotNull();
287         cancelBtn.performClick();
288         shadowMainLooper().idle();
289 
290         verify(mFeatureFactory.metricsFeatureProvider)
291                 .action(
292                         any(Context.class),
293                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
294                         eq(TEST_EVENT_DATA));
295         assertThat(isCancelBtnClicked.get()).isTrue();
296         assertThat(dialog.isShowing()).isFalse();
297     }
298 
299     @Test
onCreateDialog_noExtraConnectedDevice_hasMetadataNoPassword_showCancelButton()300     public void onCreateDialog_noExtraConnectedDevice_hasMetadataNoPassword_showCancelButton() {
301         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
302         AtomicBoolean isCancelBtnClicked = new AtomicBoolean(false);
303         AudioSharingDialogFragment.show(
304                 mParent,
305                 new ArrayList<>(),
306                 METADATA_NO_PASSWORD,
307                 new AudioSharingDialogFragment.DialogEventListener() {
308                     @Override
309                     public void onCancelClick() {
310                         isCancelBtnClicked.set(true);
311                     }
312                 },
313                 TEST_EVENT_DATA_LIST);
314         shadowMainLooper().idle();
315         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
316         assertThat(dialog).isNotNull();
317         ImageView image = dialog.findViewById(R.id.description_image);
318         assertThat(image).isNotNull();
319         TextView text = dialog.findViewById(R.id.description_text);
320         assertThat(text).isNotNull();
321         assertThat(METADATA_NO_PASSWORD).isNotNull();
322         assertThat(text.getText().toString()).isEqualTo(
323                 mParent.getString(R.string.audio_sharing_dialog_qr_code_content_no_password,
324                         METADATA_NO_PASSWORD.getBroadcastName()));
325         TextView textBottom = dialog.findViewById(R.id.description_text_2);
326         assertThat(textBottom).isNotNull();
327         assertThat(textBottom.getText().toString()).isEqualTo(
328                 mParent.getString(R.string.audio_sharing_dialog_pair_new_device_content));
329         Button cancelBtn = dialog.findViewById(R.id.negative_btn);
330         assertThat(cancelBtn).isNotNull();
331         cancelBtn.performClick();
332         shadowMainLooper().idle();
333 
334         verify(mFeatureFactory.metricsFeatureProvider)
335                 .action(
336                         any(Context.class),
337                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
338                         eq(TEST_EVENT_DATA));
339         assertThat(isCancelBtnClicked.get()).isTrue();
340         assertThat(dialog.isShowing()).isFalse();
341     }
342 
343     @Test
onCreateDialog_flagOn_singleExtraConnectedDevice()344     public void onCreateDialog_flagOn_singleExtraConnectedDevice() {
345         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
346         ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
347         list.add(TEST_DEVICE_ITEM1);
348         AudioSharingDialogFragment.show(mParent, list, null, EMPTY_EVENT_LISTENER,
349                 TEST_EVENT_DATA_LIST);
350         shadowMainLooper().idle();
351 
352         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
353         assertThat(dialog).isNotNull();
354         TextView title = dialog.findViewById(R.id.title_text);
355         assertThat(title).isNotNull();
356         TextView description = dialog.findViewById(R.id.description_text);
357         assertThat(description).isNotNull();
358         ImageView image = dialog.findViewById(R.id.description_image);
359         assertThat(image).isNotNull();
360         Button positiveBtn = dialog.findViewById(R.id.positive_btn);
361         assertThat(positiveBtn).isNotNull();
362         Button negativeBtn = dialog.findViewById(R.id.negative_btn);
363         assertThat(negativeBtn).isNotNull();
364         assertThat(dialog.isShowing()).isTrue();
365         assertThat(title.getText().toString())
366                 .isEqualTo(
367                         mParent.getString(
368                                 R.string.audio_sharing_share_with_dialog_title, TEST_DEVICE_NAME1));
369         assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
370         assertThat(description.getText().toString())
371                 .isEqualTo(mParent.getString(R.string.audio_sharing_dialog_share_content));
372         assertThat(image.getVisibility()).isEqualTo(View.GONE);
373         assertThat(positiveBtn.getVisibility()).isEqualTo(View.VISIBLE);
374         assertThat(positiveBtn.getText().toString())
375                 .isEqualTo(mParent.getString(R.string.audio_sharing_share_button_label));
376         assertThat(negativeBtn.getVisibility()).isEqualTo(View.VISIBLE);
377         assertThat(negativeBtn.getText().toString())
378                 .isEqualTo(mParent.getString(R.string.audio_sharing_no_thanks_button_label));
379     }
380 
381     @Test
onCreateDialog_singleExtraConnectedDevice_dialogDismiss()382     public void onCreateDialog_singleExtraConnectedDevice_dialogDismiss() {
383         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
384         ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
385         list.add(TEST_DEVICE_ITEM1);
386         AudioSharingDialogFragment.show(mParent, list, null, EMPTY_EVENT_LISTENER,
387                 TEST_EVENT_DATA_LIST);
388         shadowMainLooper().idle();
389 
390         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
391         assertThat(dialog).isNotNull();
392         View btnView = dialog.findViewById(R.id.negative_btn);
393         assertThat(btnView).isNotNull();
394         btnView.performClick();
395         shadowMainLooper().idle();
396 
397         assertThat(dialog.isShowing()).isFalse();
398         verify(mFeatureFactory.metricsFeatureProvider)
399                 .action(
400                         any(Context.class),
401                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
402                         eq(TEST_EVENT_DATA));
403     }
404 
405     @Test
onCreateDialog_singleExtraConnectedDevice_shareClicked()406     public void onCreateDialog_singleExtraConnectedDevice_shareClicked() {
407         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
408         ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
409         list.add(TEST_DEVICE_ITEM1);
410         AtomicBoolean isShareBtnClicked = new AtomicBoolean(false);
411         AudioSharingDialogFragment.show(
412                 mParent,
413                 list,
414                 null,
415                 new AudioSharingDialogFragment.DialogEventListener() {
416                     @Override
417                     public void onItemClick(@NonNull AudioSharingDeviceItem item) {
418                         isShareBtnClicked.set(true);
419                     }
420                 },
421                 TEST_EVENT_DATA_LIST);
422         shadowMainLooper().idle();
423 
424         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
425         assertThat(dialog).isNotNull();
426         View btnView = dialog.findViewById(R.id.positive_btn);
427         assertThat(btnView).isNotNull();
428         btnView.performClick();
429         shadowMainLooper().idle();
430 
431         assertThat(dialog.isShowing()).isFalse();
432         assertThat(isShareBtnClicked.get()).isTrue();
433         verify(mFeatureFactory.metricsFeatureProvider)
434                 .action(
435                         any(Context.class),
436                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
437                         eq(TEST_EVENT_DATA));
438     }
439 
440     @Test
onCreateDialog_flagOn_multipleExtraConnectedDevice()441     public void onCreateDialog_flagOn_multipleExtraConnectedDevice() {
442         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
443         ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
444         list.add(TEST_DEVICE_ITEM1);
445         list.add(TEST_DEVICE_ITEM2);
446         list.add(TEST_DEVICE_ITEM3);
447         AudioSharingDialogFragment.show(mParent, list, null, EMPTY_EVENT_LISTENER,
448                 TEST_EVENT_DATA_LIST);
449         shadowMainLooper().idle();
450 
451         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
452         assertThat(dialog).isNotNull();
453         TextView description = dialog.findViewById(R.id.description_text);
454         assertThat(description).isNotNull();
455         ImageView image = dialog.findViewById(R.id.description_image);
456         assertThat(image).isNotNull();
457         Button shareBtn = dialog.findViewById(R.id.positive_btn);
458         assertThat(shareBtn).isNotNull();
459         Button cancelBtn = dialog.findViewById(R.id.negative_btn);
460         assertThat(cancelBtn).isNotNull();
461         RecyclerView recyclerView = dialog.findViewById(R.id.device_btn_list);
462         assertThat(recyclerView).isNotNull();
463         assertThat(dialog.isShowing()).isTrue();
464         assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
465         assertThat(description.getText().toString())
466                 .isEqualTo(mParent.getString(R.string.audio_sharing_dialog_share_more_content));
467         assertThat(image.getVisibility()).isEqualTo(View.GONE);
468         assertThat(shareBtn.getVisibility()).isEqualTo(View.GONE);
469         assertThat(cancelBtn.getVisibility()).isEqualTo(View.VISIBLE);
470         assertThat(cancelBtn.getText().toString())
471                 .isEqualTo(mParent.getString(com.android.settings.R.string.cancel));
472         assertThat(recyclerView.getVisibility()).isEqualTo(View.VISIBLE);
473         assertThat(recyclerView.getAdapter().getItemCount()).isEqualTo(3);
474     }
475 
476     @Test
onCreateDialog_multipleExtraConnectedDevice_dialogDismiss()477     public void onCreateDialog_multipleExtraConnectedDevice_dialogDismiss() {
478         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
479         ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
480         list.add(TEST_DEVICE_ITEM1);
481         list.add(TEST_DEVICE_ITEM2);
482         list.add(TEST_DEVICE_ITEM3);
483         AtomicBoolean isCancelBtnClicked = new AtomicBoolean(false);
484         AudioSharingDialogFragment.show(
485                 mParent,
486                 list,
487                 null,
488                 new AudioSharingDialogFragment.DialogEventListener() {
489                     @Override
490                     public void onCancelClick() {
491                         isCancelBtnClicked.set(true);
492                     }
493                 },
494                 TEST_EVENT_DATA_LIST);
495         shadowMainLooper().idle();
496 
497         AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
498         assertThat(dialog).isNotNull();
499         View btnView = dialog.findViewById(R.id.negative_btn);
500         assertThat(btnView).isNotNull();
501         btnView.performClick();
502         shadowMainLooper().idle();
503 
504         assertThat(dialog.isShowing()).isFalse();
505         assertThat(isCancelBtnClicked.get()).isTrue();
506         verify(mFeatureFactory.metricsFeatureProvider)
507                 .action(
508                         any(Context.class),
509                         eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
510                         eq(TEST_EVENT_DATA));
511     }
512 }
513