Merge "[Audiosharing] Update dialog btn when start sharing with no extra connected device" into main

This commit is contained in:
Yiyi Shen
2024-08-09 02:37:20 +00:00
committed by Android (Google) Code Review
4 changed files with 98 additions and 38 deletions

View File

@@ -44,6 +44,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:contentDescription="@null" android:contentDescription="@null"
android:paddingBottom="24dp"
android:visibility="gone" /> android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

View File

@@ -30,6 +30,9 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsQrCodeFragment;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.BluetoothUtils;
@@ -130,9 +133,27 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
builder.setTitle(R.string.audio_sharing_share_dialog_title) builder.setTitle(R.string.audio_sharing_share_dialog_title)
.setCustomImage(R.drawable.audio_sharing_guidance) .setCustomImage(R.drawable.audio_sharing_guidance)
.setCustomMessage(R.string.audio_sharing_dialog_connect_device_content) .setCustomMessage(R.string.audio_sharing_dialog_connect_device_content)
.setNegativeButton( .setCustomPositiveButton(
R.string.audio_sharing_close_button_label, R.string.audio_sharing_pair_button_label,
(dig, which) -> onCancelClick()); v -> {
dismiss();
new SubSettingLauncher(getContext())
.setDestination(BluetoothPairingDetail.class.getName())
.setSourceMetricsCategory(getMetricsCategory())
.launch();
logDialogPositiveBtnClick();
})
.setCustomNegativeButton(
R.string.audio_sharing_qrcode_button_label,
v -> {
dismiss();
new SubSettingLauncher(getContext())
.setTitleRes(R.string.audio_streams_qr_code_page_title)
.setDestination(AudioStreamsQrCodeFragment.class.getName())
.setSourceMetricsCategory(getMetricsCategory())
.launch();
logDialogNegativeBtnClick();
});
} else if (deviceItems.size() == 1) { } else if (deviceItems.size() == 1) {
AudioSharingDeviceItem deviceItem = Iterables.getOnlyElement(deviceItems); AudioSharingDeviceItem deviceItem = Iterables.getOnlyElement(deviceItems);
builder.setTitle( builder.setTitle(
@@ -145,11 +166,7 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
v -> { v -> {
if (sListener != null) { if (sListener != null) {
sListener.onItemClick(deviceItem); sListener.onItemClick(deviceItem);
mMetricsFeatureProvider.action( logDialogPositiveBtnClick();
getContext(),
SettingsEnums
.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED,
sEventData);
} }
dismiss(); dismiss();
}) })
@@ -165,6 +182,7 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
(AudioSharingDeviceItem item) -> { (AudioSharingDeviceItem item) -> {
if (sListener != null) { if (sListener != null) {
sListener.onItemClick(item); sListener.onItemClick(item);
logDialogPositiveBtnClick();
} }
dismiss(); dismiss();
}, },
@@ -178,11 +196,22 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
private void onCancelClick() { private void onCancelClick() {
if (sListener != null) { if (sListener != null) {
sListener.onCancelClick(); sListener.onCancelClick();
mMetricsFeatureProvider.action( logDialogNegativeBtnClick();
getContext(),
SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED,
sEventData);
} }
dismiss(); dismiss();
} }
private void logDialogPositiveBtnClick() {
mMetricsFeatureProvider.action(
getContext(),
SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED,
sEventData);
}
private void logDialogNegativeBtnClick() {
mMetricsFeatureProvider.action(
getContext(),
SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED,
sEventData);
}
} }

View File

@@ -499,7 +499,7 @@ public class AudioSharingDialogHandler {
private void removeSourceForGroup( private void removeSourceForGroup(
int groupId, Map<Integer, List<BluetoothDevice>> groupedDevices) { int groupId, Map<Integer, List<BluetoothDevice>> groupedDevices) {
if (mAssistant == null) { if (mAssistant == null) {
Log.d(TAG, "Fail to add source due to null profiles, group = " + groupId); Log.d(TAG, "Fail to remove source due to null profiles, group = " + groupId);
return; return;
} }
if (!groupedDevices.containsKey(groupId)) { if (!groupedDevices.containsKey(groupId)) {

View File

@@ -93,7 +93,6 @@ public class AudioSharingDialogFragmentTest {
new Pair[] {TEST_EVENT_DATA}; new Pair[] {TEST_EVENT_DATA};
private Fragment mParent; private Fragment mParent;
private AudioSharingDialogFragment mFragment;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
@Before @Before
@@ -107,7 +106,6 @@ public class AudioSharingDialogFragmentTest {
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported( shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
BluetoothStatusCodes.FEATURE_SUPPORTED); BluetoothStatusCodes.FEATURE_SUPPORTED);
mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory = FakeFeatureFactory.setupForTest();
mFragment = new AudioSharingDialogFragment();
mParent = new Fragment(); mParent = new Fragment();
FragmentController.setupFragment( FragmentController.setupFragment(
mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null); mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
@@ -120,7 +118,8 @@ public class AudioSharingDialogFragmentTest {
@Test @Test
public void getMetricsCategory_correctValue() { public void getMetricsCategory_correctValue() {
assertThat(mFragment.getMetricsCategory()) AudioSharingDialogFragment fragment = new AudioSharingDialogFragment();
assertThat(fragment.getMetricsCategory())
.isEqualTo(SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE); .isEqualTo(SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE);
} }
@@ -145,7 +144,7 @@ public class AudioSharingDialogFragmentTest {
} }
@Test @Test
public void onCreateDialog_flagOn_noConnectedDevice() { public void onCreateDialog_flagOn_noExtraConnectedDevice() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
AudioSharingDialogFragment.show( AudioSharingDialogFragment.show(
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST); mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
@@ -157,42 +156,67 @@ public class AudioSharingDialogFragmentTest {
assertThat(description).isNotNull(); assertThat(description).isNotNull();
ImageView image = dialog.findViewById(R.id.description_image); ImageView image = dialog.findViewById(R.id.description_image);
assertThat(image).isNotNull(); assertThat(image).isNotNull();
Button shareBtn = dialog.findViewById(R.id.positive_btn); Button positiveBtn = dialog.findViewById(R.id.positive_btn);
assertThat(shareBtn).isNotNull(); assertThat(positiveBtn).isNotNull();
Button cancelBtn = dialog.findViewById(R.id.negative_btn); Button negativeBtn = dialog.findViewById(R.id.negative_btn);
assertThat(cancelBtn).isNotNull(); assertThat(negativeBtn).isNotNull();
assertThat(dialog.isShowing()).isTrue(); assertThat(dialog.isShowing()).isTrue();
assertThat(description.getVisibility()).isEqualTo(View.VISIBLE); assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(description.getText().toString()) assertThat(description.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_dialog_connect_device_content)); .isEqualTo(mParent.getString(R.string.audio_sharing_dialog_connect_device_content));
assertThat(image.getVisibility()).isEqualTo(View.VISIBLE); assertThat(image.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(shareBtn.getVisibility()).isEqualTo(View.GONE); assertThat(positiveBtn.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(cancelBtn.getVisibility()).isEqualTo(View.GONE); assertThat(positiveBtn.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_pair_button_label));
assertThat(negativeBtn.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(negativeBtn.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_qrcode_button_label));
} }
@Test @Test
public void onCreateDialog_noConnectedDevice_dialogDismiss() { public void onCreateDialog_noExtraConnectedDevice_pairNewDevice() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
AudioSharingDialogFragment.show( AudioSharingDialogFragment.show(
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST); mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
shadowMainLooper().idle(); shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNotNull(); assertThat(dialog).isNotNull();
View btnView = dialog.findViewById(android.R.id.button2); Button pairBtn = dialog.findViewById(R.id.positive_btn);
assertThat(btnView).isNotNull(); assertThat(pairBtn).isNotNull();
btnView.performClick(); pairBtn.performClick();
shadowMainLooper().idle(); shadowMainLooper().idle();
verify(mFeatureFactory.metricsFeatureProvider)
.action(
any(Context.class),
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
eq(TEST_EVENT_DATA));
assertThat(dialog.isShowing()).isFalse(); assertThat(dialog.isShowing()).isFalse();
}
@Test
public void onCreateDialog_noExtraConnectedDevice_showQRCode() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
AudioSharingDialogFragment.show(
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
shadowMainLooper().idle();
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog).isNotNull();
Button qrCodeBtn = dialog.findViewById(R.id.negative_btn);
assertThat(qrCodeBtn).isNotNull();
qrCodeBtn.performClick();
shadowMainLooper().idle();
verify(mFeatureFactory.metricsFeatureProvider) verify(mFeatureFactory.metricsFeatureProvider)
.action( .action(
any(Context.class), any(Context.class),
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED), eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
eq(TEST_EVENT_DATA)); eq(TEST_EVENT_DATA));
assertThat(dialog.isShowing()).isFalse();
} }
@Test @Test
public void onCreateDialog_flagOn_singleConnectedDevice() { public void onCreateDialog_flagOn_singleExtraConnectedDevice() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>(); ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
list.add(TEST_DEVICE_ITEM1); list.add(TEST_DEVICE_ITEM1);
@@ -207,10 +231,10 @@ public class AudioSharingDialogFragmentTest {
assertThat(description).isNotNull(); assertThat(description).isNotNull();
ImageView image = dialog.findViewById(R.id.description_image); ImageView image = dialog.findViewById(R.id.description_image);
assertThat(image).isNotNull(); assertThat(image).isNotNull();
Button shareBtn = dialog.findViewById(R.id.positive_btn); Button positiveBtn = dialog.findViewById(R.id.positive_btn);
assertThat(shareBtn).isNotNull(); assertThat(positiveBtn).isNotNull();
Button cancelBtn = dialog.findViewById(R.id.negative_btn); Button negativeBtn = dialog.findViewById(R.id.negative_btn);
assertThat(cancelBtn).isNotNull(); assertThat(negativeBtn).isNotNull();
assertThat(dialog.isShowing()).isTrue(); assertThat(dialog.isShowing()).isTrue();
assertThat(title.getText().toString()) assertThat(title.getText().toString())
.isEqualTo( .isEqualTo(
@@ -220,12 +244,16 @@ public class AudioSharingDialogFragmentTest {
assertThat(description.getText().toString()) assertThat(description.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_dialog_share_content)); .isEqualTo(mParent.getString(R.string.audio_sharing_dialog_share_content));
assertThat(image.getVisibility()).isEqualTo(View.GONE); assertThat(image.getVisibility()).isEqualTo(View.GONE);
assertThat(shareBtn.getVisibility()).isEqualTo(View.VISIBLE); assertThat(positiveBtn.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(cancelBtn.getVisibility()).isEqualTo(View.VISIBLE); assertThat(positiveBtn.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_share_button_label));
assertThat(negativeBtn.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(negativeBtn.getText().toString())
.isEqualTo(mParent.getString(R.string.audio_sharing_no_thanks_button_label));
} }
@Test @Test
public void onCreateDialog_singleConnectedDevice_dialogDismiss() { public void onCreateDialog_singleExtraConnectedDevice_dialogDismiss() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>(); ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
list.add(TEST_DEVICE_ITEM1); list.add(TEST_DEVICE_ITEM1);
@@ -248,7 +276,7 @@ public class AudioSharingDialogFragmentTest {
} }
@Test @Test
public void onCreateDialog_singleConnectedDevice_shareClicked() { public void onCreateDialog_singleExtraConnectedDevice_shareClicked() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>(); ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
list.add(TEST_DEVICE_ITEM1); list.add(TEST_DEVICE_ITEM1);
@@ -285,7 +313,7 @@ public class AudioSharingDialogFragmentTest {
} }
@Test @Test
public void onCreateDialog_flagOn_multipleConnectedDevice() { public void onCreateDialog_flagOn_multipleExtraConnectedDevice() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>(); ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
list.add(TEST_DEVICE_ITEM1); list.add(TEST_DEVICE_ITEM1);
@@ -313,12 +341,14 @@ public class AudioSharingDialogFragmentTest {
assertThat(image.getVisibility()).isEqualTo(View.GONE); assertThat(image.getVisibility()).isEqualTo(View.GONE);
assertThat(shareBtn.getVisibility()).isEqualTo(View.GONE); assertThat(shareBtn.getVisibility()).isEqualTo(View.GONE);
assertThat(cancelBtn.getVisibility()).isEqualTo(View.VISIBLE); assertThat(cancelBtn.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(cancelBtn.getText().toString())
.isEqualTo(mParent.getString(com.android.settings.R.string.cancel));
assertThat(recyclerView.getVisibility()).isEqualTo(View.VISIBLE); assertThat(recyclerView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(recyclerView.getAdapter().getItemCount()).isEqualTo(3); assertThat(recyclerView.getAdapter().getItemCount()).isEqualTo(3);
} }
@Test @Test
public void onCreateDialog_multipleConnectedDevice_dialogDismiss() { public void onCreateDialog_multipleExtraConnectedDevice_dialogDismiss() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>(); ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
list.add(TEST_DEVICE_ITEM1); list.add(TEST_DEVICE_ITEM1);