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

Change-Id: Iaf7a2e699befd758b027dd241e825abacc0a900a
This commit is contained in:
TreeHugger Robot
2020-05-13 06:18:24 +00:00
committed by Automerger Merge Worker

View File

@@ -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() {
mMediaDevices.clear();
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,9 +253,11 @@ public class LocalMediaManager implements BluetoothCallback {
* @return MediaDevice
*/
public MediaDevice getMediaDeviceById(String id) {
for (MediaDevice mediaDevice : mMediaDevices) {
if (TextUtils.equals(mediaDevice.getId(), id)) {
return mediaDevice;
synchronized (mMediaDevicesLock) {
for (MediaDevice mediaDevice : mMediaDevices) {
if (TextUtils.equals(mediaDevice.getId(), id)) {
return mediaDevice;
}
}
}
Log.i(TAG, "Unable to find device " + id);
@@ -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;
for (MediaDevice device : mMediaDevices) {
if (device instanceof BluetoothMediaDevice) {
if (isActiveDevice(((BluetoothMediaDevice) device).getCachedDevice())) {
synchronized (mMediaDevicesLock) {
for (MediaDevice device : mMediaDevices) {
if (device instanceof BluetoothMediaDevice) {
if (isActiveDevice(((BluetoothMediaDevice) device).getCachedDevice())) {
return device;
}
} else if (device instanceof PhoneMediaDevice) {
return device;
}
} else if (device instanceof PhoneMediaDevice) {
phoneMediaDevice = 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) {
if (!mMediaDevices.contains(device)) {
mMediaDevices.add(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) {
mMediaDevices.clear();
mMediaDevices.addAll(devices);
mMediaDevices.addAll(buildDisconnectedBluetoothDevice());
synchronized (mMediaDevicesLock) {
mMediaDevices.clear();
mMediaDevices.addAll(devices);
mMediaDevices.addAll(buildDisconnectedBluetoothDevice());
}
final MediaDevice infoMediaDevice = mInfoMediaManager.getCurrentConnectedDevice();
mCurrentConnectedDevice = infoMediaDevice != null
@@ -469,30 +495,42 @@ public class LocalMediaManager implements BluetoothCallback {
@Override
public void onDeviceRemoved(MediaDevice device) {
if (mMediaDevices.contains(device)) {
mMediaDevices.remove(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) {
mMediaDevices.removeAll(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();
if (connectDevice != null) {
connectDevice.setState(MediaDeviceState.STATE_CONNECTED);
}
mCurrentConnectedDevice = connectDevice;
dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice,
MediaDeviceState.STATE_CONNECTED);
if (connectDevice != null) {
connectDevice.setState(MediaDeviceState.STATE_CONNECTED);
dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice,
MediaDeviceState.STATE_CONNECTED);
}
}
@Override
@@ -502,9 +540,11 @@ public class LocalMediaManager implements BluetoothCallback {
@Override
public void onRequestFailed(int reason) {
for (MediaDevice device : mMediaDevices) {
if (device.getState() == MediaDeviceState.STATE_CONNECTING) {
device.setState(MediaDeviceState.STATE_CONNECTING_FAILED);
synchronized (mMediaDevicesLock) {
for (MediaDevice device : mMediaDevices) {
if (device.getState() == MediaDeviceState.STATE_CONNECTING) {
device.setState(MediaDeviceState.STATE_CONNECTING_FAILED);
}
}
}
dispatchOnRequestFailed(reason);