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

Commit 1bf67a8c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Fix null point exception on MediaDevice" into rvc-dev am: 1ecd4528

Change-Id: Idd9b01510c600b67e22f33285f6156f674fcc854
parents e4ce4b06 1ecd4528
Loading
Loading
Loading
Loading
+70 −30
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.IntDef;
import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.bluetooth.A2dpProfile;
@@ -65,6 +66,7 @@ public class LocalMediaManager implements BluetoothCallback {
    }

    private final Collection<DeviceCallback> mCallbacks = new CopyOnWriteArrayList<>();
    private final Object mMediaDevicesLock = new Object();
    @VisibleForTesting
    final MediaDeviceCallback mMediaDeviceCallback = new MediaDeviceCallback();

@@ -145,7 +147,14 @@ public class LocalMediaManager implements BluetoothCallback {
     * @param connectDevice the MediaDevice
     */
    public void connectDevice(MediaDevice connectDevice) {
        final MediaDevice device = getMediaDeviceById(mMediaDevices, connectDevice.getId());
        MediaDevice device = null;
        synchronized (mMediaDevicesLock) {
            device = getMediaDeviceById(mMediaDevices, connectDevice.getId());
        }
        if (device == null) {
            Log.w(TAG, "connectDevice() connectDevice not in the list!");
            return;
        }
        if (device instanceof BluetoothMediaDevice) {
            final CachedBluetoothDevice cachedDevice =
                    ((BluetoothMediaDevice) device).getCachedDevice();
@@ -184,15 +193,18 @@ public class LocalMediaManager implements BluetoothCallback {
     * Start scan connected MediaDevice
     */
    public void startScan() {
        synchronized (mMediaDevicesLock) {
            mMediaDevices.clear();
        }
        mInfoMediaManager.registerCallback(mMediaDeviceCallback);
        mInfoMediaManager.startScan();
    }

    void dispatchDeviceListUpdate() {
        Collections.sort(mMediaDevices, COMPARATOR);
        final List<MediaDevice> mediaDevices = new ArrayList<>(mMediaDevices);
        Collections.sort(mediaDevices, COMPARATOR);
        for (DeviceCallback callback : getCallbacks()) {
            callback.onDeviceListUpdate(new ArrayList<>(mMediaDevices));
            callback.onDeviceListUpdate(mediaDevices);
        }
    }

@@ -241,11 +253,13 @@ public class LocalMediaManager implements BluetoothCallback {
     * @return MediaDevice
     */
    public MediaDevice getMediaDeviceById(String id) {
        synchronized (mMediaDevicesLock) {
            for (MediaDevice mediaDevice : mMediaDevices) {
                if (TextUtils.equals(mediaDevice.getId(), id)) {
                    return mediaDevice;
                }
            }
        }
        Log.i(TAG, "Unable to find device " + id);
        return null;
    }
@@ -255,6 +269,7 @@ public class LocalMediaManager implements BluetoothCallback {
     *
     * @return MediaDevice
     */
    @Nullable
    public MediaDevice getCurrentConnectedDevice() {
        return mCurrentConnectedDevice;
    }
@@ -367,17 +382,19 @@ public class LocalMediaManager implements BluetoothCallback {
    }

    private MediaDevice updateCurrentConnectedDevice() {
        MediaDevice phoneMediaDevice = null;
        synchronized (mMediaDevicesLock) {
            for (MediaDevice device : mMediaDevices) {
                if (device instanceof BluetoothMediaDevice) {
                    if (isActiveDevice(((BluetoothMediaDevice) device).getCachedDevice())) {
                        return device;
                    }
                } else if (device instanceof PhoneMediaDevice) {
                phoneMediaDevice = device;
                    return device;
                }
            }
        return mMediaDevices.contains(phoneMediaDevice) ? phoneMediaDevice : null;
        }
        Log.w(TAG, "updateCurrentConnectedDevice() can't found current connected device");
        return null;
    }

    private boolean isActiveDevice(CachedBluetoothDevice device) {
@@ -392,17 +409,26 @@ public class LocalMediaManager implements BluetoothCallback {
    class MediaDeviceCallback implements MediaManager.MediaDeviceCallback {
        @Override
        public void onDeviceAdded(MediaDevice device) {
            boolean isAdded = false;
            synchronized (mMediaDevicesLock) {
                if (!mMediaDevices.contains(device)) {
                    mMediaDevices.add(device);
                    isAdded = true;
                }
            }

            if (isAdded) {
                dispatchDeviceListUpdate();
            }
        }

        @Override
        public void onDeviceListAdded(List<MediaDevice> devices) {
            synchronized (mMediaDevicesLock) {
                mMediaDevices.clear();
                mMediaDevices.addAll(devices);
                mMediaDevices.addAll(buildDisconnectedBluetoothDevice());
            }

            final MediaDevice infoMediaDevice = mInfoMediaManager.getCurrentConnectedDevice();
            mCurrentConnectedDevice = infoMediaDevice != null
@@ -469,31 +495,43 @@ public class LocalMediaManager implements BluetoothCallback {

        @Override
        public void onDeviceRemoved(MediaDevice device) {
            boolean isRemoved = false;
            synchronized (mMediaDevicesLock) {
                if (mMediaDevices.contains(device)) {
                    mMediaDevices.remove(device);
                    isRemoved = true;
                }
            }
            if (isRemoved) {
                dispatchDeviceListUpdate();
            }
        }

        @Override
        public void onDeviceListRemoved(List<MediaDevice> devices) {
            synchronized (mMediaDevicesLock) {
                mMediaDevices.removeAll(devices);
            }
            dispatchDeviceListUpdate();
        }

        @Override
        public void onConnectedDeviceChanged(String id) {
            MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id);
            MediaDevice connectDevice = null;
            synchronized (mMediaDevicesLock) {
                connectDevice = getMediaDeviceById(mMediaDevices, id);
            }
            connectDevice = connectDevice != null
                    ? connectDevice : updateCurrentConnectedDevice();

            mCurrentConnectedDevice = connectDevice;
            if (connectDevice != null) {
                connectDevice.setState(MediaDeviceState.STATE_CONNECTED);
            }

            mCurrentConnectedDevice = connectDevice;
                dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice,
                        MediaDeviceState.STATE_CONNECTED);
            }
        }

        @Override
        public void onDeviceAttributesChanged() {
@@ -502,11 +540,13 @@ public class LocalMediaManager implements BluetoothCallback {

        @Override
        public void onRequestFailed(int reason) {
            synchronized (mMediaDevicesLock) {
                for (MediaDevice device : mMediaDevices) {
                    if (device.getState() == MediaDeviceState.STATE_CONNECTING) {
                        device.setState(MediaDeviceState.STATE_CONNECTING_FAILED);
                    }
                }
            }
            dispatchOnRequestFailed(reason);
        }
    }