Merge changes I669f379d,Idd5fb950
* changes: Fix ConcurrentModificationException Update output switch UI
This commit is contained in:
committed by
Android (Google) Code Review
commit
e5c5d3754a
@@ -31,12 +31,15 @@ import android.text.TextUtils;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.slices.SliceBackgroundWorker;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.media.LocalMediaManager;
|
||||
import com.android.settingslib.media.MediaDevice;
|
||||
import com.android.settingslib.utils.ThreadUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
* SliceBackgroundWorker for get MediaDevice list and handle MediaDevice state change event.
|
||||
@@ -45,10 +48,13 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
|
||||
implements LocalMediaManager.DeviceCallback {
|
||||
|
||||
private final Context mContext;
|
||||
private final List<MediaDevice> mMediaDevices = new ArrayList<>();
|
||||
private final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
|
||||
private final DevicesChangedBroadcastReceiver mReceiver;
|
||||
private final String mPackageName;
|
||||
|
||||
private boolean mIsTouched;
|
||||
private MediaDevice mTopDevice;
|
||||
|
||||
@VisibleForTesting
|
||||
LocalMediaManager mLocalMediaManager;
|
||||
|
||||
@@ -62,6 +68,7 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
|
||||
@Override
|
||||
protected void onSlicePinned() {
|
||||
mMediaDevices.clear();
|
||||
mIsTouched = false;
|
||||
if (mLocalMediaManager == null) {
|
||||
mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
|
||||
}
|
||||
@@ -100,8 +107,13 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
|
||||
notifySliceChange();
|
||||
}
|
||||
|
||||
public List<MediaDevice> getMediaDevices() {
|
||||
return new ArrayList<>(mMediaDevices);
|
||||
@Override
|
||||
public void onDeviceAttributesChanged() {
|
||||
notifySliceChange();
|
||||
}
|
||||
|
||||
public Collection<MediaDevice> getMediaDevices() {
|
||||
return mMediaDevices;
|
||||
}
|
||||
|
||||
public void connectDevice(MediaDevice device) {
|
||||
@@ -111,18 +123,35 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
|
||||
}
|
||||
|
||||
public MediaDevice getMediaDeviceById(String id) {
|
||||
return mLocalMediaManager.getMediaDeviceById(mMediaDevices, id);
|
||||
return mLocalMediaManager.getMediaDeviceById(new ArrayList<>(mMediaDevices), id);
|
||||
}
|
||||
|
||||
public MediaDevice getCurrentConnectedMediaDevice() {
|
||||
return mLocalMediaManager.getCurrentConnectedDevice();
|
||||
}
|
||||
|
||||
void setIsTouched(boolean isTouched) {
|
||||
mIsTouched = isTouched;
|
||||
}
|
||||
|
||||
boolean getIsTouched() {
|
||||
return mIsTouched;
|
||||
}
|
||||
|
||||
void setTopDevice(MediaDevice device) {
|
||||
mTopDevice = device;
|
||||
}
|
||||
|
||||
MediaDevice getTopDevice() {
|
||||
return mTopDevice;
|
||||
}
|
||||
|
||||
private class DevicesChangedBroadcastReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (TextUtils.equals(AudioManager.STREAM_DEVICES_CHANGED_ACTION, action)) {
|
||||
if (TextUtils.equals(AudioManager.STREAM_DEVICES_CHANGED_ACTION, action)
|
||||
&& Utils.isAudioModeOngoingCall(mContext)) {
|
||||
notifySliceChange();
|
||||
}
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ import com.android.settings.slices.SliceBackgroundWorker;
|
||||
import com.android.settings.slices.SliceBroadcastReceiver;
|
||||
import com.android.settingslib.media.MediaDevice;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Show the Media device that can be transfer the media.
|
||||
@@ -61,7 +61,7 @@ public class MediaOutputSlice implements CustomSliceable {
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void init(String packageName, MediaDeviceUpdateWorker worker) {
|
||||
void init(MediaDeviceUpdateWorker worker) {
|
||||
mWorker = worker;
|
||||
}
|
||||
|
||||
@@ -78,16 +78,21 @@ public class MediaOutputSlice implements CustomSliceable {
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
final List<MediaDevice> devices = getMediaDevices();
|
||||
final Collection<MediaDevice> devices = getMediaDevices();
|
||||
final MediaDeviceUpdateWorker worker = getWorker();
|
||||
final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice();
|
||||
final boolean isTouched = worker.getIsTouched();
|
||||
// Fix the last top device when user press device to transfer.
|
||||
final MediaDevice topDevice = isTouched ? worker.getTopDevice() : connectedDevice;
|
||||
|
||||
final MediaDevice connectedDevice = getWorker().getCurrentConnectedMediaDevice();
|
||||
if (connectedDevice != null) {
|
||||
listBuilder.addRow(getActiveDeviceHeaderRow(connectedDevice));
|
||||
if (topDevice != null) {
|
||||
listBuilder.addRow(getActiveDeviceHeaderRow(topDevice));
|
||||
worker.setTopDevice(topDevice);
|
||||
}
|
||||
|
||||
for (MediaDevice device : devices) {
|
||||
if (connectedDevice == null
|
||||
|| !TextUtils.equals(connectedDevice.getId(), device.getId())) {
|
||||
if (topDevice == null
|
||||
|| !TextUtils.equals(topDevice.getId(), device.getId())) {
|
||||
listBuilder.addRow(getMediaDeviceRow(device));
|
||||
}
|
||||
}
|
||||
@@ -131,8 +136,8 @@ public class MediaOutputSlice implements CustomSliceable {
|
||||
return mWorker;
|
||||
}
|
||||
|
||||
private List<MediaDevice> getMediaDevices() {
|
||||
final List<MediaDevice> devices = getWorker().getMediaDevices();
|
||||
private Collection<MediaDevice> getMediaDevices() {
|
||||
final Collection<MediaDevice> devices = getWorker().getMediaDevices();
|
||||
return devices;
|
||||
}
|
||||
|
||||
@@ -173,6 +178,7 @@ public class MediaOutputSlice implements CustomSliceable {
|
||||
final MediaDevice device = worker.getMediaDeviceById(id);
|
||||
if (device != null) {
|
||||
Log.d(TAG, "onNotifyChange() device name : " + device.getName());
|
||||
worker.setIsTouched(true);
|
||||
worker.connectDevice(device);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user