Merge changes I669f379d,Idd5fb950

* changes:
  Fix ConcurrentModificationException
  Update output switch UI
This commit is contained in:
TreeHugger Robot
2020-01-15 06:26:17 +00:00
committed by Android (Google) Code Review
4 changed files with 87 additions and 22 deletions

View File

@@ -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();
}
}

View File

@@ -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);
}
}