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