diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java index 719d2d5641d..1288cf51c0b 100644 --- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java +++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java @@ -176,9 +176,13 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker return mLocalMediaManager.getSelectedMediaDevice(); } - boolean isSelectedMediaDevice(MediaDevice device) { - for (MediaDevice selectedMediaDevice : getSelectedMediaDevice()) { - if (TextUtils.equals(selectedMediaDevice.getId(), device.getId())) { + List getDeselectableMediaDevice() { + return mLocalMediaManager.getDeselectableMediaDevice(); + } + + boolean isDeviceIncluded(Collection deviceCollection, MediaDevice targetDevice) { + for (MediaDevice device : deviceCollection) { + if (TextUtils.equals(device.getId(), targetDevice.getId())) { return true; } } diff --git a/src/com/android/settings/media/MediaOutputGroupSlice.java b/src/com/android/settings/media/MediaOutputGroupSlice.java index ba29ab73c87..d33ca45a812 100644 --- a/src/com/android/settings/media/MediaOutputGroupSlice.java +++ b/src/com/android/settings/media/MediaOutputGroupSlice.java @@ -43,6 +43,7 @@ import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settingslib.media.MediaDevice; +import java.util.ArrayList; import java.util.List; /** @@ -122,6 +123,10 @@ public class MediaOutputGroupSlice implements CustomSliceable { private void addRow(ListBuilder listBuilder, List mediaDevices, boolean selected) { final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction(); + List deselectableMediaDevices = new ArrayList<>(); + if (selected) { + deselectableMediaDevices = getWorker().getDeselectableMediaDevice(); + } for (MediaDevice device : mediaDevices) { final int maxVolume = device.getMaxVolume(); final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon()); @@ -147,7 +152,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { .setMax(device.getMaxVolume()) .setValue(device.getCurrentVolume()); // Add endItem with different icons - if (mediaDevices.size() == 1 && selected) { + if (selected && (!getWorker().isDeviceIncluded(deselectableMediaDevices, device) + || mediaDevices.size() == 1)) { builder.addEndItem(disabledIconSliceAction); } else { builder.addEndItem(enabledIconSliceAction); @@ -158,7 +164,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .setTitle(title); // Add endItem with different icons - if (mediaDevices.size() == 1 && selected) { + if (selected && (!getWorker().isDeviceIncluded(deselectableMediaDevices, device) + || mediaDevices.size() == 1)) { rowBuilder.addEndItem(disabledIconSliceAction); } else { rowBuilder.addEndItem(enabledIconSliceAction); @@ -209,7 +216,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { Log.e(TAG, "Unable to handle notification. The device is unavailable"); return; } - final MediaDevice device = getWorker().getMediaDeviceById(id); + final MediaDeviceUpdateWorker worker = getWorker(); + final MediaDevice device = worker.getMediaDeviceById(id); switch (intent.getIntExtra(CUSTOMIZED_ACTION, ERROR)) { case ACTION_VOLUME_ADJUSTMENT: final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, ERROR); @@ -219,7 +227,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { } // Group volume adjustment if (TextUtils.equals(id, GROUP_DEVICES)) { - getWorker().adjustSessionVolume(newPosition); + worker.adjustSessionVolume(newPosition); } else { if (device == null) { Log.e(TAG, "Unable to adjust volume. The device(" + id @@ -227,7 +235,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { return; } // Single device volume adjustment - getWorker().adjustVolume(device, newPosition); + worker.adjustVolume(device, newPosition); } break; case ACTION_MEDIA_SESSION_OPERATION: @@ -236,10 +244,13 @@ public class MediaOutputGroupSlice implements CustomSliceable { + ") is unavailable"); return; } - if (getWorker().isSelectedMediaDevice(device)) { - getWorker().removeDeviceFromPlayMedia(device); + if (worker.isDeviceIncluded(worker.getSelectableMediaDevice(), device)) { + worker.addDeviceToPlayMedia(device); + } else if (worker.isDeviceIncluded(worker.getDeselectableMediaDevice(), device)) { + worker.removeDeviceFromPlayMedia(device); } else { - getWorker().addDeviceToPlayMedia(device); + // Do nothing + Log.d(TAG, device.getName() + " is not selectable nor deselectable"); } break; } diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java index 9da18d50cde..bb0478cc8b7 100644 --- a/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java +++ b/tests/robotests/src/com/android/settings/media/MediaOutputGroupSliceTest.java @@ -90,6 +90,7 @@ public class MediaOutputGroupSliceTest { private final List mSelectableDevices = new ArrayList<>(); private final List mSelectedDevices = new ArrayList<>(); + private final List mDeselectableDevices = new ArrayList<>(); private Context mContext; private MediaOutputGroupSlice mMediaOutputGroupSlice; @@ -227,14 +228,19 @@ public class MediaOutputGroupSliceTest { verify(sMediaDeviceUpdateWorker).addDeviceToPlayMedia(mDevice2); } + @Test - public void onNotifyChange_sendSelectedDevice_verifyRemoveSession() { + public void onNotifyChange_sendDeselectableDevice_verifyRemoveSession() { mSelectedDevices.add(mDevice1); mSelectedDevices.add(mDevice2); + mDeselectableDevices.add(mDevice1); + mDeselectableDevices.add(mDevice2); when(mLocalMediaManager.getMediaDeviceById(mSelectedDevices, TEST_DEVICE_2_ID)) .thenReturn(mDevice2); sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectedDevices); when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices); + when(sMediaDeviceUpdateWorker.getDeselectableMediaDevice()).thenReturn( + mDeselectableDevices); final Intent intent = new Intent(); intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID); intent.putExtra(CUSTOMIZED_ACTION, ACTION_MEDIA_SESSION_OPERATION); @@ -244,6 +250,26 @@ public class MediaOutputGroupSliceTest { verify(sMediaDeviceUpdateWorker).removeDeviceFromPlayMedia(mDevice2); } + @Test + public void onNotifyChange_sendNonDeselectableDevice_notRemoveSession() { + mSelectedDevices.add(mDevice1); + mSelectedDevices.add(mDevice2); + mDeselectableDevices.add(mDevice1); + when(mLocalMediaManager.getMediaDeviceById(mSelectedDevices, TEST_DEVICE_2_ID)) + .thenReturn(mDevice2); + sMediaDeviceUpdateWorker.onDeviceListUpdate(mSelectedDevices); + when(sMediaDeviceUpdateWorker.getSelectedMediaDevice()).thenReturn(mSelectedDevices); + when(sMediaDeviceUpdateWorker.getDeselectableMediaDevice()).thenReturn( + mDeselectableDevices); + final Intent intent = new Intent(); + intent.putExtra(MEDIA_DEVICE_ID, TEST_DEVICE_2_ID); + intent.putExtra(CUSTOMIZED_ACTION, ACTION_MEDIA_SESSION_OPERATION); + + mMediaOutputGroupSlice.onNotifyChange(intent); + + verify(sMediaDeviceUpdateWorker, never()).removeDeviceFromPlayMedia(mDevice2); + } + @Test public void onNotifyChange_noId_doNothing() { mSelectableDevices.add(mDevice1);