From 3cfd4cf7fd32b3d875189ea51bc9f731bba4f714 Mon Sep 17 00:00:00 2001 From: Yiyi Shen Date: Fri, 16 Aug 2024 17:27:25 +0800 Subject: [PATCH] [Audiosharing] Route to audio sharing page to start broadcast. Since we already support auto start sharing and add source from QS pill click. We can reuse the intent when user click on the second LEA headset to start audio sharing from Connected devices page. Test: atest Bug: 331892035 Flag: com.android.settingslib.flags.enable_le_audio_sharing Change-Id: I83f7ae25ed96bbddb3c631b69b409f09577f421b --- .../AudioSharingDialogHandler.java | 50 ++++------- .../AudioSharingDialogHandlerTest.java | 84 +++++++------------ 2 files changed, 47 insertions(+), 87 deletions(-) diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java index 14c19decb6f..6f55a137ba2 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java @@ -16,7 +16,7 @@ package com.android.settings.connecteddevice.audiosharing; -import static java.util.stream.Collectors.toList; +import static com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast.EXTRA_START_LE_AUDIO_SHARING; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothCsipSetCoordinator; @@ -25,6 +25,7 @@ import android.bluetooth.BluetoothLeBroadcast; import android.bluetooth.BluetoothLeBroadcastMetadata; import android.bluetooth.BluetoothLeBroadcastReceiveState; import android.content.Context; +import android.os.Bundle; import android.util.Log; import android.util.Pair; @@ -34,6 +35,7 @@ import androidx.annotation.VisibleForTesting; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; +import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; @@ -63,8 +65,6 @@ public class AudioSharingDialogHandler { @Nullable private final LocalBluetoothLeBroadcast mBroadcast; @Nullable private final LocalBluetoothLeBroadcastAssistant mAssistant; private final MetricsFeatureProvider mMetricsFeatureProvider; - // The target sinks to join broadcast onPlaybackStarted - @Nullable private List mTargetSinks; private boolean mIsStoppingBroadcast = false; @VisibleForTesting @@ -83,15 +83,6 @@ public class AudioSharingDialogHandler { @Override public void onBroadcastStartFailed(int reason) { Log.d(TAG, "onBroadcastStartFailed(), reason = " + reason); - if (mTargetSinks != null) { - mMetricsFeatureProvider.action( - mContext, - SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, - SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); - AudioSharingUtils.toastMessage( - mContext, "Fail to start broadcast, reason " + reason); - mTargetSinks = null; - } } @Override @@ -113,6 +104,9 @@ public class AudioSharingDialogHandler { + reason + ", broadcastId = " + broadcastId); + AudioSharingUtils.toastMessage( + mContext, + mContext.getString(R.string.audio_sharing_sharing_stopped_label)); mIsStoppingBroadcast = false; } @@ -144,18 +138,6 @@ public class AudioSharingDialogHandler { + reason + ", broadcastId = " + broadcastId); - if (mTargetSinks != null) { - AudioSharingUtils.addSourceToTargetSinks(mTargetSinks, mLocalBtManager); - new SubSettingLauncher(mContext) - .setDestination(AudioSharingDashboardFragment.class.getName()) - .setSourceMetricsCategory( - (mHostFragment instanceof DashboardFragment) - ? ((DashboardFragment) mHostFragment) - .getMetricsCategory() - : SettingsEnums.PAGE_UNKNOWN) - .launch(); - mTargetSinks = null; - } } @Override @@ -375,14 +357,18 @@ public class AudioSharingDialogHandler { new AudioSharingJoinDialogFragment.DialogEventListener() { @Override public void onShareClick() { - mTargetSinks = - groupedDevices.values().stream() - .flatMap(items -> items.stream()) - .collect(toList()); - Log.d(TAG, "Start broadcast with sinks = " + mTargetSinks.size()); - if (mBroadcast != null) { - mBroadcast.startPrivateBroadcast(); - } + Bundle args = new Bundle(); + args.putBoolean(EXTRA_START_LE_AUDIO_SHARING, true); + new SubSettingLauncher(mContext) + .setDestination( + AudioSharingDashboardFragment.class.getName()) + .setSourceMetricsCategory( + (mHostFragment instanceof DashboardFragment) + ? ((DashboardFragment) mHostFragment) + .getMetricsCategory() + : SettingsEnums.PAGE_UNKNOWN) + .setArguments(args) + .launch(); } @Override diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java index 1bff78bc7c2..4933c430c15 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java @@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -37,6 +38,8 @@ import android.bluetooth.BluetoothLeBroadcastMetadata; import android.bluetooth.BluetoothLeBroadcastReceiveState; import android.bluetooth.BluetoothStatusCodes; import android.content.Context; +import android.content.Intent; +import android.os.Bundle; import android.os.Looper; import android.platform.test.flag.junit.SetFlagsRule; import android.util.Pair; @@ -45,6 +48,7 @@ import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import com.android.settings.SettingsActivity; import com.android.settings.bluetooth.Utils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; @@ -67,6 +71,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -132,7 +137,7 @@ public class AudioSharingDialogHandlerTest { FragmentActivity.class, 0 /* containerViewId */, null /* bundle */); - mContext = mParentFragment.getContext(); + mContext = spy(mParentFragment.getContext()); ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager; mLocalBtManager = Utils.getLocalBtManager(mContext); ShadowBluetoothAdapter shadowBluetoothAdapter = @@ -294,7 +299,17 @@ public class AudioSharingDialogHandlerTest { AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); assertThat(listener).isNotNull(); listener.onShareClick(); - verify(mBroadcast).startPrivateBroadcast(); + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mContext).startActivity(argumentCaptor.capture()); + Intent intent = argumentCaptor.getValue(); + assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) + .isEqualTo(AudioSharingDashboardFragment.class.getName()); + assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)) + .isNotNull(); + Bundle args = intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); + assertThat(args).isNotNull(); + assertThat(args.getBoolean(LocalBluetoothLeBroadcast.EXTRA_START_LE_AUDIO_SHARING)) + .isTrue(); listener.onCancelClick(); verify(mCachedDevice1).setActive(); } @@ -500,7 +515,17 @@ public class AudioSharingDialogHandlerTest { AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); assertThat(listener).isNotNull(); listener.onShareClick(); - verify(mBroadcast).startPrivateBroadcast(); + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mContext).startActivity(argumentCaptor.capture()); + Intent intent = argumentCaptor.getValue(); + assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) + .isEqualTo(AudioSharingDashboardFragment.class.getName()); + assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)) + .isNotNull(); + Bundle args = intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); + assertThat(args).isNotNull(); + assertThat(args.getBoolean(LocalBluetoothLeBroadcast.EXTRA_START_LE_AUDIO_SHARING)) + .isTrue(); listener.onCancelClick(); verify(mCachedDevice1, never()).setActive(); } @@ -726,58 +751,6 @@ public class AudioSharingDialogHandlerTest { verify(mBroadcast).unregisterServiceCallBack(any(BluetoothLeBroadcast.Callback.class)); } - @Test - public void onBroadcastStartFailed_logAction() { - setUpBroadcast(false); - ImmutableList deviceList = ImmutableList.of(mDevice1, mDevice3); - when(mAssistant.getAllConnectedDevices()).thenReturn(deviceList); - when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of()); - mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false); - shadowOf(Looper.getMainLooper()).idle(); - List childFragments = mParentFragment.getChildFragmentManager().getFragments(); - assertThat(childFragments) - .comparingElementsUsing(TAG_EQUALS) - .containsExactly(AudioSharingJoinDialogFragment.tag()); - AudioSharingJoinDialogFragment fragment = - (AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments); - AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); - assertThat(listener).isNotNull(); - listener.onShareClick(); - - mHandler.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1); - verify(mFeatureFactory.metricsFeatureProvider) - .action( - mContext, - SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, - SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); - } - - @Test - public void onPlaybackStarted_addSource() { - setUpBroadcast(false); - ImmutableList deviceList = ImmutableList.of(mDevice1, mDevice3); - when(mAssistant.getAllConnectedDevices()).thenReturn(deviceList); - when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of()); - mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ true); - shadowOf(Looper.getMainLooper()).idle(); - List childFragments = mParentFragment.getChildFragmentManager().getFragments(); - assertThat(childFragments) - .comparingElementsUsing(TAG_EQUALS) - .containsExactly(AudioSharingJoinDialogFragment.tag()); - AudioSharingJoinDialogFragment fragment = - (AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments); - AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); - assertThat(listener).isNotNull(); - listener.onShareClick(); - - setUpBroadcast(true); - mHandler.mBroadcastCallback.onPlaybackStarted(/* reason= */ 1, /* broadcastId= */ 1); - shadowOf(Looper.getMainLooper()).idle(); - - verify(mAssistant).addSource(mDevice1, mMetadata, /* isGroupOp= */ false); - verify(mAssistant).addSource(mDevice3, mMetadata, /* isGroupOp= */ false); - } - @Test public void onBroadcastStopFailed_logAction() { setUpBroadcast(true); @@ -808,6 +781,7 @@ public class AudioSharingDialogHandlerTest { @Test public void testBluetoothLeBroadcastCallbacks_doNothing() { mHandler.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); + mHandler.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1); mHandler.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); mHandler.mBroadcastCallback.onBroadcastUpdated(/* reason= */ 1, /* broadcastId= */ 1); mHandler.mBroadcastCallback.onPlaybackStarted(/* reason= */ 1, /* broadcastId= */ 1);