Loading packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +44 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.RoutingSessionInfo; import android.os.Build; import android.text.TextUtils; Loading Loading @@ -83,6 +84,7 @@ public class LocalMediaManager implements BluetoothCallback { private InfoMediaManager mInfoMediaManager; private String mPackageName; private MediaDevice mOnTransferBluetoothDevice; private AudioManager mAudioManager; @VisibleForTesting List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); Loading Loading @@ -126,6 +128,7 @@ public class LocalMediaManager implements BluetoothCallback { mPackageName = packageName; mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */ null); mAudioManager = context.getSystemService(AudioManager.class); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mLocalBluetoothManager == null) { Log.e(TAG, "Bluetooth is not supported on this device"); Loading @@ -148,6 +151,7 @@ public class LocalMediaManager implements BluetoothCallback { mInfoMediaManager = infoMediaManager; mPackageName = packageName; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mAudioManager = context.getSystemService(AudioManager.class); } /** Loading Loading @@ -527,13 +531,16 @@ public class LocalMediaManager implements BluetoothCallback { synchronized (mMediaDevicesLock) { mMediaDevices.clear(); mMediaDevices.addAll(devices); // Add disconnected bluetooth devices only when phone output device is available. // Add muting expected bluetooth devices only when phone output device is available. for (MediaDevice device : devices) { final int type = device.getDeviceType(); if (type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE) { mMediaDevices.addAll(buildDisconnectedBluetoothDevice()); MediaDevice mutingExpectedDevice = getMutingExpectedDevice(); if (mutingExpectedDevice != null) { mMediaDevices.add(mutingExpectedDevice); } break; } } Loading @@ -552,6 +559,34 @@ public class LocalMediaManager implements BluetoothCallback { } } private MediaDevice getMutingExpectedDevice() { if (mBluetoothAdapter == null || mAudioManager.getMutingExpectedDevice() == null) { Log.w(TAG, "BluetoothAdapter is null or muting expected device not exist"); return null; } final List<BluetoothDevice> bluetoothDevices = mBluetoothAdapter.getMostRecentlyConnectedDevices(); final CachedBluetoothDeviceManager cachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager(); for (BluetoothDevice device : bluetoothDevices) { final CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device); if (isBondedMediaDevice(cachedDevice) && isMutingExpectedDevice(cachedDevice)) { return new BluetoothMediaDevice(mContext, cachedDevice, null, null, mPackageName); } } return null; } private boolean isMutingExpectedDevice(CachedBluetoothDevice cachedDevice) { return mAudioManager.getMutingExpectedDevice() != null && cachedDevice.getAddress().equals( mAudioManager.getMutingExpectedDevice().getAddress()); } private List<MediaDevice> buildDisconnectedBluetoothDevice() { if (mBluetoothAdapter == null) { Log.w(TAG, "buildDisconnectedBluetoothDevice() BluetoothAdapter is null"); Loading Loading @@ -595,6 +630,13 @@ public class LocalMediaManager implements BluetoothCallback { return new ArrayList<>(mDisconnectedMediaDevices); } private boolean isBondedMediaDevice(CachedBluetoothDevice cachedDevice) { return cachedDevice != null && cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected() && isMediaDevice(cachedDevice); } private boolean isMediaDevice(CachedBluetoothDevice device) { for (LocalBluetoothProfile profile : device.getConnectableProfiles()) { if (profile instanceof A2dpProfile || profile instanceof HearingAidProfile || Loading packages/SystemUI/res/values/strings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -2297,8 +2297,8 @@ <string name="media_output_dialog_disconnected">(disconnected)</string> <!-- Summary for connecting error message [CHAR LIMIT=NONE] --> <string name="media_output_dialog_connect_failed">Can\'t switch. Tap to try again.</string> <!-- Title for pairing item [CHAR LIMIT=60] --> <string name="media_output_dialog_pairing_new">Pair new device</string> <!-- Title for connecting item [CHAR LIMIT=60] --> <string name="media_output_dialog_pairing_new">Connect a device</string> <!-- Title for launch app [CHAR LIMIT=60] --> <string name="media_output_dialog_launch_app_text">To cast this session, please open the app.</string> <!-- App name when can't get app name [CHAR LIMIT=60] --> Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +4 −7 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public void onBindViewHolder(@NonNull MediaDeviceBaseViewHolder viewHolder, int position) { final int size = mController.getMediaDevices().size(); if (position == size && mController.isZeroMode()) { if (position == size) { viewHolder.onBind(CUSTOMIZED_ITEM_PAIR_NEW, false /* topMargin */, true /* bottomMargin */); } else if (position < size) { Loading @@ -75,7 +75,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public long getItemId(int position) { final int size = mController.getMediaDevices().size(); if (position == size && mController.isZeroMode()) { if (position == size) { return -1; } else if (position < size) { return ((List<MediaDevice>) (mController.getMediaDevices())) Loading @@ -88,12 +88,9 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public int getItemCount() { if (mController.isZeroMode()) { // Add extra one for "pair new" or dynamic group // Add extra one for "pair new" return mController.getMediaDevices().size() + 1; } return mController.getMediaDevices().size(); } class MediaDeviceViewHolder extends MediaDeviceBaseViewHolder { Loading packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +5 −18 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package com.android.systemui.media.dialog; import static android.provider.Settings.ACTION_BLUETOOTH_PAIRING_SETTINGS; import static android.provider.Settings.ACTION_BLUETOOTH_SETTINGS; import android.annotation.CallbackExecutor; import android.app.AlertDialog; Loading Loading @@ -300,6 +300,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return; } try { synchronized (mMediaDevicesLock) { mMediaDevices.removeIf(MediaDevice::isMutingExpectedDevice); } mAudioManager.cancelMuteAwaitConnection(mAudioManager.getMutingExpectedDevice()); } catch (Exception e) { Log.d(TAG, "Unable to cancel mute await connection"); Loading Loading @@ -711,22 +714,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return false; } boolean isZeroMode() { synchronized (mMediaDevicesLock) { if (mMediaDevices.size() == 1) { final MediaDevice device = mMediaDevices.iterator().next(); // Add "pair new" only when local output device exists final int type = device.getDeviceType(); if (type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE) { return true; } } return false; } } void launchBluetoothPairing(View view) { ActivityLaunchAnimator.Controller controller = mDialogLaunchAnimator.createActivityLaunchController(view); Loading @@ -736,7 +723,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } Intent launchIntent = new Intent(ACTION_BLUETOOTH_PAIRING_SETTINGS) new Intent(ACTION_BLUETOOTH_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); final Intent deepLinkIntent = new Intent(Settings.ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY); Loading packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java +2 −22 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { when(mMediaOutputController.getMediaDevices()).thenReturn(mMediaDevices); when(mMediaOutputController.hasAdjustVolumeUserRestriction()).thenReturn(false); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.isTransferring()).thenReturn(false); when(mMediaOutputController.getDeviceIconCompat(mMediaDevice1)).thenReturn(mIconCompat); when(mMediaOutputController.getDeviceIconCompat(mMediaDevice2)).thenReturn(mIconCompat); Loading @@ -98,28 +97,12 @@ public class MediaOutputAdapterTest extends SysuiTestCase { } @Test public void getItemCount_nonZeroMode_isDeviceSize() { assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size()); } @Test public void getItemCount_zeroMode_containExtraOneForPairNew() { when(mMediaOutputController.isZeroMode()).thenReturn(true); public void getItemCount_containExtraOneForPairNew() { assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size() + 1); } @Test public void getItemCount_withDynamicGroup_containExtraOneForGroup() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size()); } @Test public void onBindViewHolder_zeroMode_bindPairNew_verifyView() { when(mMediaOutputController.isZeroMode()).thenReturn(true); public void onBindViewHolder_bindPairNew_verifyView() { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); Loading @@ -133,7 +116,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_bindGroup_withSessionName_verifyView() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.getSessionName()).thenReturn(TEST_SESSION_NAME); mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); Loading @@ -148,7 +130,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_bindGroup_noSessionName_verifyView() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.getSessionName()).thenReturn(null); mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); Loading Loading @@ -257,7 +238,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onItemClick_clickPairNew_verifyLaunchBluetoothPairing() { when(mMediaOutputController.isZeroMode()).thenReturn(true); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); mViewHolder.mContainerLayout.performClick(); Loading Loading
packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +44 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.RoutingSessionInfo; import android.os.Build; import android.text.TextUtils; Loading Loading @@ -83,6 +84,7 @@ public class LocalMediaManager implements BluetoothCallback { private InfoMediaManager mInfoMediaManager; private String mPackageName; private MediaDevice mOnTransferBluetoothDevice; private AudioManager mAudioManager; @VisibleForTesting List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); Loading Loading @@ -126,6 +128,7 @@ public class LocalMediaManager implements BluetoothCallback { mPackageName = packageName; mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */ null); mAudioManager = context.getSystemService(AudioManager.class); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mLocalBluetoothManager == null) { Log.e(TAG, "Bluetooth is not supported on this device"); Loading @@ -148,6 +151,7 @@ public class LocalMediaManager implements BluetoothCallback { mInfoMediaManager = infoMediaManager; mPackageName = packageName; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mAudioManager = context.getSystemService(AudioManager.class); } /** Loading Loading @@ -527,13 +531,16 @@ public class LocalMediaManager implements BluetoothCallback { synchronized (mMediaDevicesLock) { mMediaDevices.clear(); mMediaDevices.addAll(devices); // Add disconnected bluetooth devices only when phone output device is available. // Add muting expected bluetooth devices only when phone output device is available. for (MediaDevice device : devices) { final int type = device.getDeviceType(); if (type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE) { mMediaDevices.addAll(buildDisconnectedBluetoothDevice()); MediaDevice mutingExpectedDevice = getMutingExpectedDevice(); if (mutingExpectedDevice != null) { mMediaDevices.add(mutingExpectedDevice); } break; } } Loading @@ -552,6 +559,34 @@ public class LocalMediaManager implements BluetoothCallback { } } private MediaDevice getMutingExpectedDevice() { if (mBluetoothAdapter == null || mAudioManager.getMutingExpectedDevice() == null) { Log.w(TAG, "BluetoothAdapter is null or muting expected device not exist"); return null; } final List<BluetoothDevice> bluetoothDevices = mBluetoothAdapter.getMostRecentlyConnectedDevices(); final CachedBluetoothDeviceManager cachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager(); for (BluetoothDevice device : bluetoothDevices) { final CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device); if (isBondedMediaDevice(cachedDevice) && isMutingExpectedDevice(cachedDevice)) { return new BluetoothMediaDevice(mContext, cachedDevice, null, null, mPackageName); } } return null; } private boolean isMutingExpectedDevice(CachedBluetoothDevice cachedDevice) { return mAudioManager.getMutingExpectedDevice() != null && cachedDevice.getAddress().equals( mAudioManager.getMutingExpectedDevice().getAddress()); } private List<MediaDevice> buildDisconnectedBluetoothDevice() { if (mBluetoothAdapter == null) { Log.w(TAG, "buildDisconnectedBluetoothDevice() BluetoothAdapter is null"); Loading Loading @@ -595,6 +630,13 @@ public class LocalMediaManager implements BluetoothCallback { return new ArrayList<>(mDisconnectedMediaDevices); } private boolean isBondedMediaDevice(CachedBluetoothDevice cachedDevice) { return cachedDevice != null && cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected() && isMediaDevice(cachedDevice); } private boolean isMediaDevice(CachedBluetoothDevice device) { for (LocalBluetoothProfile profile : device.getConnectableProfiles()) { if (profile instanceof A2dpProfile || profile instanceof HearingAidProfile || Loading
packages/SystemUI/res/values/strings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -2297,8 +2297,8 @@ <string name="media_output_dialog_disconnected">(disconnected)</string> <!-- Summary for connecting error message [CHAR LIMIT=NONE] --> <string name="media_output_dialog_connect_failed">Can\'t switch. Tap to try again.</string> <!-- Title for pairing item [CHAR LIMIT=60] --> <string name="media_output_dialog_pairing_new">Pair new device</string> <!-- Title for connecting item [CHAR LIMIT=60] --> <string name="media_output_dialog_pairing_new">Connect a device</string> <!-- Title for launch app [CHAR LIMIT=60] --> <string name="media_output_dialog_launch_app_text">To cast this session, please open the app.</string> <!-- App name when can't get app name [CHAR LIMIT=60] --> Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +4 −7 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public void onBindViewHolder(@NonNull MediaDeviceBaseViewHolder viewHolder, int position) { final int size = mController.getMediaDevices().size(); if (position == size && mController.isZeroMode()) { if (position == size) { viewHolder.onBind(CUSTOMIZED_ITEM_PAIR_NEW, false /* topMargin */, true /* bottomMargin */); } else if (position < size) { Loading @@ -75,7 +75,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public long getItemId(int position) { final int size = mController.getMediaDevices().size(); if (position == size && mController.isZeroMode()) { if (position == size) { return -1; } else if (position < size) { return ((List<MediaDevice>) (mController.getMediaDevices())) Loading @@ -88,12 +88,9 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override public int getItemCount() { if (mController.isZeroMode()) { // Add extra one for "pair new" or dynamic group // Add extra one for "pair new" return mController.getMediaDevices().size() + 1; } return mController.getMediaDevices().size(); } class MediaDeviceViewHolder extends MediaDeviceBaseViewHolder { Loading
packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +5 −18 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package com.android.systemui.media.dialog; import static android.provider.Settings.ACTION_BLUETOOTH_PAIRING_SETTINGS; import static android.provider.Settings.ACTION_BLUETOOTH_SETTINGS; import android.annotation.CallbackExecutor; import android.app.AlertDialog; Loading Loading @@ -300,6 +300,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return; } try { synchronized (mMediaDevicesLock) { mMediaDevices.removeIf(MediaDevice::isMutingExpectedDevice); } mAudioManager.cancelMuteAwaitConnection(mAudioManager.getMutingExpectedDevice()); } catch (Exception e) { Log.d(TAG, "Unable to cancel mute await connection"); Loading Loading @@ -711,22 +714,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return false; } boolean isZeroMode() { synchronized (mMediaDevicesLock) { if (mMediaDevices.size() == 1) { final MediaDevice device = mMediaDevices.iterator().next(); // Add "pair new" only when local output device exists final int type = device.getDeviceType(); if (type == MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE || type == MediaDevice.MediaDeviceType.TYPE_USB_C_AUDIO_DEVICE) { return true; } } return false; } } void launchBluetoothPairing(View view) { ActivityLaunchAnimator.Controller controller = mDialogLaunchAnimator.createActivityLaunchController(view); Loading @@ -736,7 +723,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } Intent launchIntent = new Intent(ACTION_BLUETOOTH_PAIRING_SETTINGS) new Intent(ACTION_BLUETOOTH_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); final Intent deepLinkIntent = new Intent(Settings.ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY); Loading
packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java +2 −22 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { when(mMediaOutputController.getMediaDevices()).thenReturn(mMediaDevices); when(mMediaOutputController.hasAdjustVolumeUserRestriction()).thenReturn(false); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.isTransferring()).thenReturn(false); when(mMediaOutputController.getDeviceIconCompat(mMediaDevice1)).thenReturn(mIconCompat); when(mMediaOutputController.getDeviceIconCompat(mMediaDevice2)).thenReturn(mIconCompat); Loading @@ -98,28 +97,12 @@ public class MediaOutputAdapterTest extends SysuiTestCase { } @Test public void getItemCount_nonZeroMode_isDeviceSize() { assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size()); } @Test public void getItemCount_zeroMode_containExtraOneForPairNew() { when(mMediaOutputController.isZeroMode()).thenReturn(true); public void getItemCount_containExtraOneForPairNew() { assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size() + 1); } @Test public void getItemCount_withDynamicGroup_containExtraOneForGroup() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaDevices.size()); } @Test public void onBindViewHolder_zeroMode_bindPairNew_verifyView() { when(mMediaOutputController.isZeroMode()).thenReturn(true); public void onBindViewHolder_bindPairNew_verifyView() { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); Loading @@ -133,7 +116,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_bindGroup_withSessionName_verifyView() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.getSessionName()).thenReturn(TEST_SESSION_NAME); mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); Loading @@ -148,7 +130,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onBindViewHolder_bindGroup_noSessionName_verifyView() { when(mMediaOutputController.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mMediaOutputController.isZeroMode()).thenReturn(false); when(mMediaOutputController.getSessionName()).thenReturn(null); mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); Loading Loading @@ -257,7 +238,6 @@ public class MediaOutputAdapterTest extends SysuiTestCase { @Test public void onItemClick_clickPairNew_verifyLaunchBluetoothPairing() { when(mMediaOutputController.isZeroMode()).thenReturn(true); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); mViewHolder.mContainerLayout.performClick(); Loading