Cleanup and simplify MediaOutputController and MediaItem
This is a strictly non-functional change.
Test: Presubmit.
Bug: 338947190
Flag: EXEMPT refactor
Change-Id: If458a7c75c47325d883345ee1e2d705533958836
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaItem.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaItem.java
index fbb84de..4496b25 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaItem.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaItem.java
@@ -16,7 +16,9 @@
package com.android.systemui.media.dialog;
-import androidx.annotation.IntDef;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.res.R;
@@ -46,40 +48,50 @@
int TYPE_PAIR_NEW_DEVICE = 2;
}
- public MediaItem() {
- this.mMediaDeviceOptional = Optional.empty();
- this.mTitle = null;
- this.mMediaItemType = MediaItemType.TYPE_PAIR_NEW_DEVICE;
+ /**
+ * Returns a new {@link MediaItemType#TYPE_DEVICE} {@link MediaItem} with its {@link
+ * #getMediaDevice() media device} set to {@code device} and its title set to {@code device}'s
+ * name.
+ */
+ public static MediaItem createDeviceMediaItem(@NonNull MediaDevice device) {
+ return new MediaItem(device, device.getName(), MediaItemType.TYPE_DEVICE);
}
- public MediaItem(String title, int mediaItemType) {
- this.mMediaDeviceOptional = Optional.empty();
+ /**
+ * Returns a new {@link MediaItemType#TYPE_PAIR_NEW_DEVICE} {@link MediaItem} with both {@link
+ * #getMediaDevice() media device} and title set to {@code null}.
+ */
+ public static MediaItem createPairNewDeviceMediaItem() {
+ return new MediaItem(
+ /* device */ null, /* title */ null, MediaItemType.TYPE_PAIR_NEW_DEVICE);
+ }
+
+ /**
+ * Returns a new {@link MediaItemType#TYPE_GROUP_DIVIDER} {@link MediaItem} with the specified
+ * title and a {@code null} {@link #getMediaDevice() media device}.
+ */
+ public static MediaItem createGroupDividerMediaItem(@Nullable String title) {
+ return new MediaItem(/* device */ null, title, MediaItemType.TYPE_GROUP_DIVIDER);
+ }
+
+ private MediaItem(
+ @Nullable MediaDevice device, @Nullable String title, @MediaItemType int type) {
+ this.mMediaDeviceOptional = Optional.ofNullable(device);
this.mTitle = title;
- this.mMediaItemType = mediaItemType;
- }
-
- public MediaItem(MediaDevice mediaDevice) {
- this.mMediaDeviceOptional = Optional.of(mediaDevice);
- this.mTitle = mediaDevice.getName();
- this.mMediaItemType = MediaItemType.TYPE_DEVICE;
+ this.mMediaItemType = type;
}
public Optional<MediaDevice> getMediaDevice() {
return mMediaDeviceOptional;
}
- /**
- * Get layout id based on media item Type.
- */
- public static int getMediaLayoutId(int mediaItemType) {
- switch (mediaItemType) {
- case MediaItemType.TYPE_DEVICE:
- case MediaItemType.TYPE_PAIR_NEW_DEVICE:
- return R.layout.media_output_list_item_advanced;
- case MediaItemType.TYPE_GROUP_DIVIDER:
- default:
- return R.layout.media_output_list_group_divider;
- }
+ /** Get layout id based on media item Type. */
+ public static int getMediaLayoutId(@MediaItemType int mediaItemType) {
+ return switch (mediaItemType) {
+ case MediaItemType.TYPE_DEVICE, MediaItemType.TYPE_PAIR_NEW_DEVICE ->
+ R.layout.media_output_list_item_advanced;
+ default -> R.layout.media_output_list_group_divider;
+ };
}
public String getTitle() {
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
index c2cfdbe..1e86563 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
@@ -68,6 +68,7 @@
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
+import com.android.internal.annotations.GuardedBy;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.BluetoothUtils;
@@ -656,10 +657,16 @@
if (DEBUG) {
Log.d(TAG, "No connected media device or muting expected device exist.");
}
- return categorizeMediaItems(null, devices, needToHandleMutingExpectedDevice);
+ return categorizeMediaItemsLocked(
+ /* connectedMediaDevice */ null,
+ devices,
+ needToHandleMutingExpectedDevice);
}
// selected device exist
- return categorizeMediaItems(connectedMediaDevice, devices, false);
+ return categorizeMediaItemsLocked(
+ connectedMediaDevice,
+ devices,
+ /* needToHandleMutingExpectedDevice */ false);
}
// To keep the same list order
final List<MediaDevice> targetMediaDevices = new ArrayList<>();
@@ -682,8 +689,9 @@
devices.removeAll(targetMediaDevices);
targetMediaDevices.addAll(devices);
}
- List<MediaItem> finalMediaItems = targetMediaDevices.stream().map(
- MediaItem::new).collect(Collectors.toList());
+ List<MediaItem> finalMediaItems = targetMediaDevices.stream()
+ .map(MediaItem::createDeviceMediaItem)
+ .collect(Collectors.toList());
dividerItems.forEach(finalMediaItems::add);
attachConnectNewDeviceItemIfNeeded(finalMediaItems);
return finalMediaItems;
@@ -694,51 +702,50 @@
* Initial categorization of current devices, will not be called for updates to the devices
* list.
*/
- private List<MediaItem> categorizeMediaItems(MediaDevice connectedMediaDevice,
+ @GuardedBy("mMediaDevicesLock")
+ private List<MediaItem> categorizeMediaItemsLocked(MediaDevice connectedMediaDevice,
List<MediaDevice> devices,
boolean needToHandleMutingExpectedDevice) {
- synchronized (mMediaDevicesLock) {
- List<MediaItem> finalMediaItems = new ArrayList<>();
- Set<String> selectedDevicesIds = getSelectedMediaDevice().stream().map(
- MediaDevice::getId).collect(Collectors.toSet());
- if (connectedMediaDevice != null) {
- selectedDevicesIds.add(connectedMediaDevice.getId());
- }
- boolean suggestedDeviceAdded = false;
- boolean displayGroupAdded = false;
- for (MediaDevice device : devices) {
- if (needToHandleMutingExpectedDevice && device.isMutingExpectedDevice()) {
- finalMediaItems.add(0, new MediaItem(device));
- } else if (!needToHandleMutingExpectedDevice && selectedDevicesIds.contains(
- device.getId())) {
- finalMediaItems.add(0, new MediaItem(device));
- } else {
- if (device.isSuggestedDevice() && !suggestedDeviceAdded) {
- attachGroupDivider(finalMediaItems, mContext.getString(
- R.string.media_output_group_title_suggested_device));
- suggestedDeviceAdded = true;
- } else if (!device.isSuggestedDevice() && !displayGroupAdded) {
- attachGroupDivider(finalMediaItems, mContext.getString(
- R.string.media_output_group_title_speakers_and_displays));
- displayGroupAdded = true;
- }
- finalMediaItems.add(new MediaItem(device));
- }
- }
- attachConnectNewDeviceItemIfNeeded(finalMediaItems);
- return finalMediaItems;
+ List<MediaItem> finalMediaItems = new ArrayList<>();
+ Set<String> selectedDevicesIds = getSelectedMediaDevice().stream()
+ .map(MediaDevice::getId)
+ .collect(Collectors.toSet());
+ if (connectedMediaDevice != null) {
+ selectedDevicesIds.add(connectedMediaDevice.getId());
}
+ boolean suggestedDeviceAdded = false;
+ boolean displayGroupAdded = false;
+ for (MediaDevice device : devices) {
+ if (needToHandleMutingExpectedDevice && device.isMutingExpectedDevice()) {
+ finalMediaItems.add(0, MediaItem.createDeviceMediaItem(device));
+ } else if (!needToHandleMutingExpectedDevice && selectedDevicesIds.contains(
+ device.getId())) {
+ finalMediaItems.add(0, MediaItem.createDeviceMediaItem(device));
+ } else {
+ if (device.isSuggestedDevice() && !suggestedDeviceAdded) {
+ attachGroupDivider(finalMediaItems, mContext.getString(
+ R.string.media_output_group_title_suggested_device));
+ suggestedDeviceAdded = true;
+ } else if (!device.isSuggestedDevice() && !displayGroupAdded) {
+ attachGroupDivider(finalMediaItems, mContext.getString(
+ R.string.media_output_group_title_speakers_and_displays));
+ displayGroupAdded = true;
+ }
+ finalMediaItems.add(MediaItem.createDeviceMediaItem(device));
+ }
+ }
+ attachConnectNewDeviceItemIfNeeded(finalMediaItems);
+ return finalMediaItems;
}
private void attachGroupDivider(List<MediaItem> mediaItems, String title) {
- mediaItems.add(
- new MediaItem(title, MediaItem.MediaItemType.TYPE_GROUP_DIVIDER));
+ mediaItems.add(MediaItem.createGroupDividerMediaItem(title));
}
private void attachConnectNewDeviceItemIfNeeded(List<MediaItem> mediaItems) {
// Attach "Connect a device" item only when current output is not remote and not a group
if (!isCurrentConnectedDeviceRemote() && getSelectedMediaDevice().size() == 1) {
- mediaItems.add(new MediaItem());
+ mediaItems.add(MediaItem.createPairNewDeviceMediaItem());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
index ec02c64..411ff91 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
@@ -113,8 +113,8 @@
LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED);
mMediaDevices.add(mMediaDevice1);
mMediaDevices.add(mMediaDevice2);
- mMediaItems.add(new MediaItem(mMediaDevice1));
- mMediaItems.add(new MediaItem(mMediaDevice2));
+ mMediaItems.add(MediaItem.createDeviceMediaItem(mMediaDevice1));
+ mMediaItems.add(MediaItem.createDeviceMediaItem(mMediaDevice2));
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
@@ -146,7 +146,8 @@
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0);
- mMediaItems.add(new MediaItem());
+ mMediaItems.add(MediaItem.createPairNewDeviceMediaItem());
+ mMediaItems.add(MediaItem.createPairNewDeviceMediaItem());
mMediaOutputAdapter.updateItems();
mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
@@ -589,7 +590,7 @@
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0);
- mMediaItems.add(new MediaItem());
+ mMediaItems.add(MediaItem.createPairNewDeviceMediaItem());
mMediaOutputAdapter.updateItems();
mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
mViewHolder.mContainerLayout.performClick();
@@ -725,7 +726,7 @@
public void updateItems_controllerItemsUpdated_notUpdatesInAdapterUntilUpdateItems() {
mMediaOutputAdapter.updateItems();
List<MediaItem> updatedList = new ArrayList<>();
- updatedList.add(new MediaItem());
+ updatedList.add(MediaItem.createPairNewDeviceMediaItem());
when(mMediaOutputController.getMediaItemList()).thenReturn(updatedList);
assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaItems.size());