Merge "[Audiosharing] Avoid dialog when onPlaybackStarted after call ends" into main

This commit is contained in:
Yiyi Shen
2024-09-02 05:24:06 +00:00
committed by Android (Google) Code Review
2 changed files with 51 additions and 8 deletions

View File

@@ -201,6 +201,19 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
+ reason + reason
+ ", broadcastId = " + ", broadcastId = "
+ broadcastId); + broadcastId);
if (mAssistant == null
|| mAssistant.getAllConnectedDevices().stream()
.anyMatch(
device -> BluetoothUtils
.hasActiveLocalBroadcastSourceForBtDevice(
device, mBtManager))) {
Log.d(
TAG,
"Skip handleOnBroadcastReady: null assistant or "
+ "sink has active local source.");
cleanUp();
return;
}
handleOnBroadcastReady(); handleOnBroadcastReady();
} }
@@ -554,8 +567,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
mGroupedConnectedDevices.getOrDefault( mGroupedConnectedDevices.getOrDefault(
mDeviceItemsForSharing.get(0).getGroupId(), ImmutableList.of()), mDeviceItemsForSharing.get(0).getGroupId(), ImmutableList.of()),
mBtManager); mBtManager);
mGroupedConnectedDevices.clear(); cleanUp();
mDeviceItemsForSharing.clear();
// TODO: Add metric for auto add by intent // TODO: Add metric for auto add by intent
return; return;
} }
@@ -565,8 +577,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
StartIntentHandleStage.HANDLED.ordinal()); StartIntentHandleStage.HANDLED.ordinal());
if (mFragment == null) { if (mFragment == null) {
Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment."); Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment.");
mGroupedConnectedDevices.clear(); cleanUp();
mDeviceItemsForSharing.clear();
return; return;
} }
showDialog(eventData); showDialog(eventData);
@@ -581,14 +592,12 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
mGroupedConnectedDevices.getOrDefault( mGroupedConnectedDevices.getOrDefault(
item.getGroupId(), ImmutableList.of()), item.getGroupId(), ImmutableList.of()),
mBtManager); mBtManager);
mGroupedConnectedDevices.clear(); cleanUp();
mDeviceItemsForSharing.clear();
} }
@Override @Override
public void onCancelClick() { public void onCancelClick() {
mGroupedConnectedDevices.clear(); cleanUp();
mDeviceItemsForSharing.clear();
} }
}; };
AudioSharingUtils.postOnMainThread( AudioSharingUtils.postOnMainThread(
@@ -657,6 +666,11 @@ public class AudioSharingSwitchBarController extends BasePreferenceController
}); });
} }
private void cleanUp() {
mGroupedConnectedDevices.clear();
mDeviceItemsForSharing.clear();
}
private enum StartIntentHandleStage { private enum StartIntentHandleStage {
TO_HANDLE, TO_HANDLE,
HANDLE_AUTO_ADD, HANDLE_AUTO_ADD,

View File

@@ -443,6 +443,7 @@ public class AudioSharingSwitchBarControllerTest {
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
when(mBtnView.isEnabled()).thenReturn(true); when(mBtnView.isEnabled()).thenReturn(true);
when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1)); when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1));
when(mAssistant.getAllSources(any(BluetoothDevice.class))).thenReturn(ImmutableList.of());
when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata); when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata);
doNothing().when(mBroadcast).startPrivateBroadcast(); doNothing().when(mBroadcast).startPrivateBroadcast();
mController = mController =
@@ -468,12 +469,38 @@ public class AudioSharingSwitchBarControllerTest {
assertThat(childFragments).isEmpty(); assertThat(childFragments).isEmpty();
} }
@Test
public void onPlaybackStarted_hasLocalSource_noDialog() {
FeatureFlagUtils.setEnabled(
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
when(mBtnView.isEnabled()).thenReturn(true);
when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1));
BluetoothLeBroadcastReceiveState state = mock(BluetoothLeBroadcastReceiveState.class);
when(state.getBroadcastId()).thenReturn(1);
when(mBroadcast.getLatestBroadcastId()).thenReturn(1);
when(mAssistant.getAllSources(mDevice2)).thenReturn(ImmutableList.of(state));
when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata);
doNothing().when(mBroadcast).startPrivateBroadcast();
mController.onCheckedChanged(mBtnView, /* isChecked= */ true);
verify(mBroadcast).startPrivateBroadcast();
mController.mBroadcastCallback.onPlaybackStarted(0, 0);
shadowOf(Looper.getMainLooper()).idle();
verify(mAssistant, never()).addSource(any(), any(), anyBoolean());
verify(mFeatureFactory.metricsFeatureProvider, never())
.action(any(Context.class), eq(SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING));
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
assertThat(childFragments).isEmpty();
}
@Test @Test
public void onPlaybackStarted_showJoinAudioSharingDialog() { public void onPlaybackStarted_showJoinAudioSharingDialog() {
FeatureFlagUtils.setEnabled( FeatureFlagUtils.setEnabled(
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
when(mBtnView.isEnabled()).thenReturn(true); when(mBtnView.isEnabled()).thenReturn(true);
when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1)); when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1));
when(mAssistant.getAllSources(any(BluetoothDevice.class))).thenReturn(ImmutableList.of());
doNothing().when(mBroadcast).startPrivateBroadcast(); doNothing().when(mBroadcast).startPrivateBroadcast();
mController.onCheckedChanged(mBtnView, /* isChecked= */ true); mController.onCheckedChanged(mBtnView, /* isChecked= */ true);
when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata); when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata);
@@ -519,6 +546,7 @@ public class AudioSharingSwitchBarControllerTest {
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
when(mBtnView.isEnabled()).thenReturn(true); when(mBtnView.isEnabled()).thenReturn(true);
when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1)); when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1));
when(mAssistant.getAllSources(any(BluetoothDevice.class))).thenReturn(ImmutableList.of());
when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata); when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata);
doNothing().when(mBroadcast).startPrivateBroadcast(); doNothing().when(mBroadcast).startPrivateBroadcast();
mController.onCheckedChanged(mBtnView, /* isChecked= */ true); mController.onCheckedChanged(mBtnView, /* isChecked= */ true);
@@ -545,6 +573,7 @@ public class AudioSharingSwitchBarControllerTest {
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
when(mBtnView.isEnabled()).thenReturn(true); when(mBtnView.isEnabled()).thenReturn(true);
when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1)); when(mAssistant.getAllConnectedDevices()).thenReturn(ImmutableList.of(mDevice2, mDevice1));
when(mAssistant.getAllSources(any(BluetoothDevice.class))).thenReturn(ImmutableList.of());
when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata); when(mBroadcast.getLatestBluetoothLeBroadcastMetadata()).thenReturn(mMetadata);
doNothing().when(mBroadcast).startPrivateBroadcast(); doNothing().when(mBroadcast).startPrivateBroadcast();
mController.onCheckedChanged(mBtnView, /* isChecked= */ true); mController.onCheckedChanged(mBtnView, /* isChecked= */ true);