Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f8434a0 authored by Shaowei Shen's avatar Shaowei Shen Committed by Automerger Merge Worker
Browse files

Merge "[Output switcher] Filter disconnected device" into tm-qpr-dev am: 4d432885 am: 8460a6f7

parents f4c8dd05 8460a6f7
Loading
Loading
Loading
Loading
+44 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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<>();
@@ -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");
@@ -148,6 +151,7 @@ public class LocalMediaManager implements BluetoothCallback {
        mInfoMediaManager = infoMediaManager;
        mPackageName = packageName;
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mAudioManager = context.getSystemService(AudioManager.class);
    }

    /**
@@ -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;
                    }
                }
@@ -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");
@@ -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 ||
+2 −2
Original line number Diff line number Diff line
@@ -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] -->
+4 −7
Original line number Diff line number Diff line
@@ -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) {
@@ -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()))
@@ -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 {

+5 −18
Original line number Diff line number Diff line
@@ -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;
@@ -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");
@@ -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);
@@ -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);
+2 −22
Original line number Diff line number Diff line
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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