Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63458101 authored by Iván Budnik's avatar Iván Budnik
Browse files

Simplify MediaOutputController and avoid quadratic lookups

This is pre-work for fixing header issues in b/338947190.

Bug: 338947190
Test: atest com.android.sysui.media.dialog
Flag: EXEMPT refactor
Change-Id: Ie3d294a3ff251158fcc35f1b1f4e72618d66ae06
parent d411ca0f
Loading
Loading
Loading
Loading
+40 −21
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ import com.android.systemui.animation.ActivityTransitionAnimator;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.media.dialog.MediaItem.MediaItemType;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.monet.ColorScheme;
import com.android.systemui.plugins.ActivityStarter;
@@ -110,6 +111,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
@@ -661,28 +663,38 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
                            /* connectedMediaDevice */ null,
                            devices,
                            needToHandleMutingExpectedDevice);
                }
                } else {
                    // selected device exist
                    return categorizeMediaItemsLocked(
                            connectedMediaDevice,
                            devices,
                            /* needToHandleMutingExpectedDevice */ false);
                }
            }
            // To keep the same list order
            final List<MediaDevice> targetMediaDevices = new ArrayList<>();
            final Map<Integer, MediaItem> dividerItems = new HashMap<>();

            Map<String, MediaDevice> idToMediaDeviceMap =
                    devices.stream()
                            .collect(Collectors.toMap(MediaDevice::getId, Function.identity()));

            for (MediaItem originalMediaItem : oldMediaItems) {
                for (MediaDevice newDevice : devices) {
                    if (originalMediaItem.getMediaDevice().isPresent()
                            && TextUtils.equals(originalMediaItem.getMediaDevice().get().getId(),
                            newDevice.getId())) {
                        targetMediaDevices.add(newDevice);
                        break;
                switch (originalMediaItem.getMediaItemType()) {
                    case MediaItemType.TYPE_GROUP_DIVIDER -> {
                        dividerItems.put(
                                oldMediaItems.indexOf(originalMediaItem), originalMediaItem);
                    }
                    case MediaItemType.TYPE_DEVICE -> {
                        String originalMediaItemId =
                                originalMediaItem.getMediaDevice().orElseThrow().getId();
                        if (idToMediaDeviceMap.containsKey(originalMediaItemId)) {
                            targetMediaDevices.add(idToMediaDeviceMap.get(originalMediaItemId));
                        }
                    }
                    case MediaItemType.TYPE_PAIR_NEW_DEVICE -> {
                        // Do nothing.
                    }
                if (originalMediaItem.getMediaItemType()
                        == MediaItem.MediaItemType.TYPE_GROUP_DIVIDER) {
                    dividerItems.put(oldMediaItems.indexOf(originalMediaItem), originalMediaItem);
                }
            }
            if (targetMediaDevices.size() != devices.size()) {
@@ -723,12 +735,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
                finalMediaItems.add(0, MediaItem.createDeviceMediaItem(device));
            } else {
                if (device.isSuggestedDevice() && !suggestedDeviceAdded) {
                    attachGroupDivider(finalMediaItems, mContext.getString(
                            R.string.media_output_group_title_suggested_device));
                    addSuggestedDeviceGroupDivider(finalMediaItems);
                    suggestedDeviceAdded = true;
                } else if (!device.isSuggestedDevice() && !displayGroupAdded) {
                    attachGroupDivider(finalMediaItems, mContext.getString(
                            R.string.media_output_group_title_speakers_and_displays));
                    addSpeakersAndDisplaysGroupDivider(finalMediaItems);
                    displayGroupAdded = true;
                }
                finalMediaItems.add(MediaItem.createDeviceMediaItem(device));
@@ -738,8 +748,17 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        return finalMediaItems;
    }

    private void attachGroupDivider(List<MediaItem> mediaItems, String title) {
        mediaItems.add(MediaItem.createGroupDividerMediaItem(title));
    private void addSuggestedDeviceGroupDivider(List<MediaItem> mediaItems) {
        mediaItems.add(
                MediaItem.createGroupDividerMediaItem(
                        mContext.getString(R.string.media_output_group_title_suggested_device)));
    }

    private void addSpeakersAndDisplaysGroupDivider(List<MediaItem> mediaItems) {
        mediaItems.add(
                MediaItem.createGroupDividerMediaItem(
                        mContext.getString(
                                R.string.media_output_group_title_speakers_and_displays)));
    }

    private void attachConnectNewDeviceItemIfNeeded(List<MediaItem> mediaItems) {