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

Commit 0160b806 authored by shaoweishen's avatar shaoweishen Committed by Shaowei Shen
Browse files

[Output Switcher] [Group by Type] Add MediaItem to store data

Apply new class MediaItem to store item in the list, this change will
not have impact on layout and functionality should remain the same.
This is first refactor stage of making OutputSwitcher support custom
item, which will be used to apply grouping devices by type request.

design: go/output-switcher-custom-items

Bug: 255124239
Test: atest MediaOutputAdapterTest MediaOutputControllerTest MediaOutputBaseDialogTest MediaOutputDialogTest
Change-Id: Ibda4f0af1204d9e9eb48a3137d50ab591a276319
parent 2016b1dc
Loading
Loading
Loading
Loading
+35 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2022 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/device_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="36dp"
        android:layout_gravity="center_vertical|start"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="56dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
        android:textSize="16sp"/>
</LinearLayout>
 No newline at end of file
+97 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.media.dialog;

import androidx.annotation.IntDef;

import com.android.settingslib.media.MediaDevice;
import com.android.systemui.R;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Optional;

/**
 * MediaItem represents an item in OutputSwitcher list (could be a MediaDevice, group divider or
 * connect new device item).
 */
public class MediaItem {
    private final Optional<MediaDevice> mMediaDeviceOptional;
    private final String mTitle;
    @MediaItemType
    private final int mMediaItemType;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
            MediaItemType.TYPE_DEVICE,
            MediaItemType.TYPE_GROUP_DIVIDER,
            MediaItemType.TYPE_PAIR_NEW_DEVICE})
    public @interface MediaItemType {
        int TYPE_DEVICE = 0;
        int TYPE_GROUP_DIVIDER = 1;
        int TYPE_PAIR_NEW_DEVICE = 2;
    }

    public MediaItem() {
        this.mMediaDeviceOptional = Optional.empty();
        this.mTitle = null;
        this.mMediaItemType = MediaItemType.TYPE_PAIR_NEW_DEVICE;
    }

    public MediaItem(String title, int mediaItemType) {
        this.mMediaDeviceOptional = Optional.empty();
        this.mTitle = title;
        this.mMediaItemType = mediaItemType;
    }

    public MediaItem(MediaDevice mediaDevice) {
        this.mMediaDeviceOptional = Optional.of(mediaDevice);
        this.mTitle = mediaDevice.getName();
        this.mMediaItemType = MediaItemType.TYPE_DEVICE;
    }

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

    public String getTitle() {
        return mTitle;
    }

    public boolean isMutingExpectedDevice() {
        return mMediaDeviceOptional.isPresent()
                && mMediaDeviceOptional.get().isMutingExpectedDevice();
    }

    public int getMediaItemType() {
        return mMediaItemType;
    }
}
+81 −17
Original line number Original line Diff line number Diff line
@@ -24,9 +24,11 @@ import android.util.Log;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CheckBox;
import android.widget.TextView;


import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.core.widget.CompoundButtonCompat;
import androidx.core.widget.CompoundButtonCompat;
import androidx.recyclerview.widget.RecyclerView;


import com.android.settingslib.media.LocalMediaManager.MediaDeviceState;
import com.android.settingslib.media.LocalMediaManager.MediaDeviceState;
import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.media.MediaDevice;
@@ -48,29 +50,68 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    }
    }


    @Override
    @Override
    public MediaDeviceBaseViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
            int viewType) {
            int viewType) {
        super.onCreateViewHolder(viewGroup, viewType);
        super.onCreateViewHolder(viewGroup, viewType);
        if (mController.isAdvancedLayoutSupported()) {
            switch (viewType) {
                case MediaItem.MediaItemType.TYPE_GROUP_DIVIDER:
                    return new MediaGroupDividerViewHolder(mHolderView);
                case MediaItem.MediaItemType.TYPE_PAIR_NEW_DEVICE:
                case MediaItem.MediaItemType.TYPE_DEVICE:
                default:
                    return new MediaDeviceViewHolder(mHolderView);
            }
        } else {
            return new MediaDeviceViewHolder(mHolderView);
            return new MediaDeviceViewHolder(mHolderView);
        }
        }
    }


    @Override
    @Override
    public void onBindViewHolder(@NonNull MediaDeviceBaseViewHolder viewHolder, int position) {
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        if (mController.isAdvancedLayoutSupported()) {
            MediaItem currentMediaItem = mController.getMediaItemList().get(position);
            switch (currentMediaItem.getMediaItemType()) {
                case MediaItem.MediaItemType.TYPE_GROUP_DIVIDER:
                    ((MediaGroupDividerViewHolder) viewHolder).onBind(currentMediaItem.getTitle());
                    break;
                case MediaItem.MediaItemType.TYPE_PAIR_NEW_DEVICE:
                    ((MediaDeviceViewHolder) viewHolder).onBind(CUSTOMIZED_ITEM_PAIR_NEW);
                    break;
                case MediaItem.MediaItemType.TYPE_DEVICE:
                    ((MediaDeviceViewHolder) viewHolder).onBind(
                            currentMediaItem.getMediaDevice().get(),
                            position);
                    break;
                default:
                    Log.d(TAG, "Incorrect position: " + position);
            }
        } else {
            final int size = mController.getMediaDevices().size();
            final int size = mController.getMediaDevices().size();
            if (position == size) {
            if (position == size) {
            viewHolder.onBind(CUSTOMIZED_ITEM_PAIR_NEW, false /* topMargin */,
                ((MediaDeviceViewHolder) viewHolder).onBind(CUSTOMIZED_ITEM_PAIR_NEW);
                    true /* bottomMargin */);
            } else if (position < size) {
            } else if (position < size) {
            viewHolder.onBind(((List<MediaDevice>) (mController.getMediaDevices())).get(position),
                ((MediaDeviceViewHolder) viewHolder).onBind(
                    position == 0 /* topMargin */, position == (size - 1) /* bottomMargin */,
                        ((List<MediaDevice>) (mController.getMediaDevices())).get(position),
                        position);
                        position);
            } else if (DEBUG) {
            } else if (DEBUG) {
                Log.d(TAG, "Incorrect position: " + position);
                Log.d(TAG, "Incorrect position: " + position);
            }
            }
        }
        }
    }


    @Override
    @Override
    public long getItemId(int position) {
    public long getItemId(int position) {
        if (mController.isAdvancedLayoutSupported()) {
            if (position >= mController.getMediaItemList().size()) {
                Log.d(TAG, "Incorrect position for item id: " + position);
                return position;
            }
            MediaItem currentMediaItem = mController.getMediaItemList().get(position);
            return currentMediaItem.getMediaDevice().isPresent()
                    ? currentMediaItem.getMediaDevice().get().getId().hashCode()
                    : position;
        }
        final int size = mController.getMediaDevices().size();
        final int size = mController.getMediaDevices().size();
        if (position == size) {
        if (position == size) {
            return -1;
            return -1;
@@ -83,10 +124,19 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
        return position;
        return position;
    }
    }


    @Override
    public int getItemViewType(int position) {
        return mController.isAdvancedLayoutSupported()
                ? mController.getMediaItemList().get(position).getMediaItemType()
                : super.getItemViewType(position);
    }

    @Override
    @Override
    public int getItemCount() {
    public int getItemCount() {
        // Add extra one for "pair new"
        // Add extra one for "pair new"
        return mController.getMediaDevices().size() + 1;
        return mController.isAdvancedLayoutSupported()
                ? mController.getMediaItemList().size()
                : mController.getMediaDevices().size() + 1;
    }
    }


    class MediaDeviceViewHolder extends MediaDeviceBaseViewHolder {
    class MediaDeviceViewHolder extends MediaDeviceBaseViewHolder {
@@ -96,8 +146,8 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
        }
        }


        @Override
        @Override
        void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) {
        void onBind(MediaDevice device, int position) {
            super.onBind(device, topMargin, bottomMargin, position);
            super.onBind(device, position);
            boolean isMutingExpectedDeviceExist = mController.hasMutingExpectedDevice();
            boolean isMutingExpectedDeviceExist = mController.hasMutingExpectedDevice();
            final boolean currentlyConnected = isCurrentlyConnected(device);
            final boolean currentlyConnected = isCurrentlyConnected(device);
            boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE;
            boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE;
@@ -261,7 +311,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
        }
        }


        @Override
        @Override
        void onBind(int customizedItem, boolean topMargin, boolean bottomMargin) {
        void onBind(int customizedItem) {
            if (customizedItem == CUSTOMIZED_ITEM_PAIR_NEW) {
            if (customizedItem == CUSTOMIZED_ITEM_PAIR_NEW) {
                mTitleText.setTextColor(mController.getColorItemContent());
                mTitleText.setTextColor(mController.getColorItemContent());
                mCheckBox.setVisibility(View.GONE);
                mCheckBox.setVisibility(View.GONE);
@@ -318,4 +368,18 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
                            : R.string.accessibility_cast_name, device.getName()));
                            : R.string.accessibility_cast_name, device.getName()));
        }
        }
    }
    }

    class MediaGroupDividerViewHolder extends RecyclerView.ViewHolder {
        final TextView mTitleText;

        MediaGroupDividerViewHolder(@NonNull View itemView) {
            super(itemView);
            mTitleText = itemView.requireViewById(R.id.title);
        }

        void onBind(String groupDividerTitle) {
            mTitleText.setTextColor(mController.getColorItemContent());
            mTitleText.setText(groupDividerTitle);
        }
    }
}
}
+6 −5
Original line number Original line Diff line number Diff line
@@ -58,7 +58,7 @@ import java.util.List;
 * Base adapter for media output dialog.
 * Base adapter for media output dialog.
 */
 */
public abstract class MediaOutputBaseAdapter extends
public abstract class MediaOutputBaseAdapter extends
        RecyclerView.Adapter<MediaOutputBaseAdapter.MediaDeviceBaseViewHolder> {
        RecyclerView.Adapter<RecyclerView.ViewHolder> {


    static final int CUSTOMIZED_ITEM_PAIR_NEW = 1;
    static final int CUSTOMIZED_ITEM_PAIR_NEW = 1;
    static final int CUSTOMIZED_ITEM_GROUP = 2;
    static final int CUSTOMIZED_ITEM_GROUP = 2;
@@ -80,11 +80,12 @@ public abstract class MediaOutputBaseAdapter extends
    }
    }


    @Override
    @Override
    public MediaDeviceBaseViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
            int viewType) {
            int viewType) {
        mContext = viewGroup.getContext();
        mContext = viewGroup.getContext();
        mHolderView = LayoutInflater.from(mContext).inflate(
        mHolderView = LayoutInflater.from(mContext).inflate(
                mController.isAdvancedLayoutSupported() ? R.layout.media_output_list_item_advanced
                mController.isAdvancedLayoutSupported() ? MediaItem.getMediaLayoutId(
                        viewType) /*R.layout.media_output_list_item_advanced*/
                        : R.layout.media_output_list_item, viewGroup, false);
                        : R.layout.media_output_list_item, viewGroup, false);


        return null;
        return null;
@@ -175,7 +176,7 @@ public abstract class MediaOutputBaseAdapter extends
            initAnimator();
            initAnimator();
        }
        }


        void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) {
        void onBind(MediaDevice device, int position) {
            mDeviceId = device.getId();
            mDeviceId = device.getId();
            mCheckBox.setVisibility(View.GONE);
            mCheckBox.setVisibility(View.GONE);
            mStatusIcon.setVisibility(View.GONE);
            mStatusIcon.setVisibility(View.GONE);
@@ -196,7 +197,7 @@ public abstract class MediaOutputBaseAdapter extends
                            PorterDuff.Mode.SRC_IN));
                            PorterDuff.Mode.SRC_IN));
        }
        }


        abstract void onBind(int customizedItem, boolean topMargin, boolean bottomMargin);
        abstract void onBind(int customizedItem);


        void setSingleLineLayout(CharSequence title) {
        void setSingleLineLayout(CharSequence title) {
            setSingleLineLayout(title, false, false, false, false);
            setSingleLineLayout(title, false, false, false, false);
+115 −5
Original line number Original line Diff line number Diff line
@@ -93,6 +93,7 @@ import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;


import javax.inject.Inject;
import javax.inject.Inject;


@@ -121,6 +122,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
    @VisibleForTesting
    @VisibleForTesting
    final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
    final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
    final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>();
    final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>();
    private final List<MediaItem> mMediaItemList = new CopyOnWriteArrayList<>();
    private final AudioManager mAudioManager;
    private final AudioManager mAudioManager;
    private final PowerExemptionManager mPowerExemptionManager;
    private final PowerExemptionManager mPowerExemptionManager;
    private final KeyguardManager mKeyGuardManager;
    private final KeyguardManager mKeyGuardManager;
@@ -212,6 +214,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        synchronized (mMediaDevicesLock) {
        synchronized (mMediaDevicesLock) {
            mCachedMediaDevices.clear();
            mCachedMediaDevices.clear();
            mMediaDevices.clear();
            mMediaDevices.clear();
            mMediaItemList.clear();
        }
        }
        mNearbyDeviceInfoMap.clear();
        mNearbyDeviceInfoMap.clear();
        if (mNearbyMediaDevicesManager != null) {
        if (mNearbyMediaDevicesManager != null) {
@@ -262,6 +265,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        synchronized (mMediaDevicesLock) {
        synchronized (mMediaDevicesLock) {
            mCachedMediaDevices.clear();
            mCachedMediaDevices.clear();
            mMediaDevices.clear();
            mMediaDevices.clear();
            mMediaItemList.clear();
        }
        }
        if (mNearbyMediaDevicesManager != null) {
        if (mNearbyMediaDevicesManager != null) {
            mNearbyMediaDevicesManager.unregisterNearbyDevicesCallback(this);
            mNearbyMediaDevicesManager.unregisterNearbyDevicesCallback(this);
@@ -287,8 +291,12 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
    public void onSelectedDeviceStateChanged(MediaDevice device,
    public void onSelectedDeviceStateChanged(MediaDevice device,
            @LocalMediaManager.MediaDeviceState int state) {
            @LocalMediaManager.MediaDeviceState int state) {
        mCallback.onRouteChanged();
        mCallback.onRouteChanged();
        if (isAdvancedLayoutSupported()) {
            mMetricLogger.logOutputItemSuccess(device.toString(), new ArrayList<>(mMediaItemList));
        } else {
            mMetricLogger.logOutputSuccess(device.toString(), new ArrayList<>(mMediaDevices));
            mMetricLogger.logOutputSuccess(device.toString(), new ArrayList<>(mMediaDevices));
        }
        }
    }


    @Override
    @Override
    public void onDeviceAttributesChanged() {
    public void onDeviceAttributesChanged() {
@@ -298,8 +306,12 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
    @Override
    @Override
    public void onRequestFailed(int reason) {
    public void onRequestFailed(int reason) {
        mCallback.onRouteChanged();
        mCallback.onRouteChanged();
        if (isAdvancedLayoutSupported()) {
            mMetricLogger.logOutputItemFailure(new ArrayList<>(mMediaItemList), reason);
        } else {
            mMetricLogger.logOutputFailure(new ArrayList<>(mMediaDevices), reason);
            mMetricLogger.logOutputFailure(new ArrayList<>(mMediaDevices), reason);
        }
        }
    }


    /**
    /**
     * Checks if there's any muting expected device exist
     * Checks if there's any muting expected device exist
@@ -318,6 +330,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        try {
        try {
            synchronized (mMediaDevicesLock) {
            synchronized (mMediaDevicesLock) {
                mMediaDevices.removeIf(MediaDevice::isMutingExpectedDevice);
                mMediaDevices.removeIf(MediaDevice::isMutingExpectedDevice);
                mMediaItemList.removeIf((MediaItem::isMutingExpectedDevice));
            }
            }
            mAudioManager.cancelMuteAwaitConnection(mAudioManager.getMutingExpectedDevice());
            mAudioManager.cancelMuteAwaitConnection(mAudioManager.getMutingExpectedDevice());
        } catch (Exception e) {
        } catch (Exception e) {
@@ -547,6 +560,14 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
    }
    }


    private void buildMediaDevices(List<MediaDevice> devices) {
    private void buildMediaDevices(List<MediaDevice> devices) {
        if (isAdvancedLayoutSupported()) {
            buildMediaItems(devices);
        } else {
            buildDefaultMediaDevices(devices);
        }
    }

    private void buildDefaultMediaDevices(List<MediaDevice> devices) {
        synchronized (mMediaDevicesLock) {
        synchronized (mMediaDevicesLock) {
            attachRangeInfo(devices);
            attachRangeInfo(devices);
            Collections.sort(devices, Comparator.naturalOrder());
            Collections.sort(devices, Comparator.naturalOrder());
@@ -603,6 +624,81 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        }
        }
    }
    }


    private void buildMediaItems(List<MediaDevice> devices) {
        synchronized (mMediaDevicesLock) {
            //TODO(b/257851968): do the organization only when there's no suggested sorted order
            // we get from application
            attachRangeInfo(devices);
            Collections.sort(devices, Comparator.naturalOrder());
            // For the first time building list, to make sure the top device is the connected
            // device.
            if (mMediaItemList.isEmpty()) {
                boolean needToHandleMutingExpectedDevice =
                        hasMutingExpectedDevice() && !isCurrentConnectedDeviceRemote();
                final MediaDevice connectedMediaDevice =
                        needToHandleMutingExpectedDevice ? null
                                : getCurrentConnectedMediaDevice();
                if (connectedMediaDevice == null) {
                    if (DEBUG) {
                        Log.d(TAG, "No connected media device or muting expected device exist.");
                    }
                    if (needToHandleMutingExpectedDevice) {
                        for (MediaDevice device : devices) {
                            if (device.isMutingExpectedDevice()) {
                                mMediaItemList.add(0, new MediaItem(device));
                            } else {
                                mMediaItemList.add(new MediaItem(device));
                            }
                        }
                    } else {
                        mMediaItemList.addAll(
                                devices.stream().map(MediaItem::new).collect(Collectors.toList()));
                    }

                    categorizeMediaItems();
                    return;
                }
                // selected device exist
                for (MediaDevice device : devices) {
                    if (TextUtils.equals(device.getId(), connectedMediaDevice.getId())) {
                        mMediaItemList.add(0, new MediaItem(device));
                    } else {
                        mMediaItemList.add(new MediaItem(device));
                    }
                }
                categorizeMediaItems();
                return;
            }
            // To keep the same list order
            final List<MediaDevice> targetMediaDevices = new ArrayList<>();
            for (MediaItem originalMediaItem : mMediaItemList) {
                for (MediaDevice newDevice : devices) {
                    if (originalMediaItem.getMediaDevice().isPresent()
                            && TextUtils.equals(originalMediaItem.getMediaDevice().get().getId(),
                            newDevice.getId())) {
                        targetMediaDevices.add(newDevice);
                        break;
                    }
                }
            }
            if (targetMediaDevices.size() != devices.size()) {
                devices.removeAll(targetMediaDevices);
                targetMediaDevices.addAll(devices);
            }
            mMediaItemList.clear();
            mMediaItemList.addAll(
                    targetMediaDevices.stream().map(MediaItem::new).collect(Collectors.toList()));
            categorizeMediaItems();
        }
    }

    private void categorizeMediaItems() {
        synchronized (mMediaDevicesLock) {
            //TODO(255124239): do the categorization here
            mMediaItemList.add(new MediaItem());
        }
    }

    private void attachRangeInfo(List<MediaDevice> devices) {
    private void attachRangeInfo(List<MediaDevice> devices) {
        for (MediaDevice mediaDevice : devices) {
        for (MediaDevice mediaDevice : devices) {
            if (mNearbyDeviceInfoMap.containsKey(mediaDevice.getId())) {
            if (mNearbyDeviceInfoMap.containsKey(mediaDevice.getId())) {
@@ -670,6 +766,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        return mMediaDevices;
        return mMediaDevices;
    }
    }


    public List<MediaItem> getMediaItemList() {
        return mMediaItemList;
    }

    MediaDevice getCurrentConnectedMediaDevice() {
    MediaDevice getCurrentConnectedMediaDevice() {
        return mLocalMediaManager.getCurrentConnectedDevice();
        return mLocalMediaManager.getCurrentConnectedDevice();
    }
    }
@@ -749,12 +849,22 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,


    boolean isAnyDeviceTransferring() {
    boolean isAnyDeviceTransferring() {
        synchronized (mMediaDevicesLock) {
        synchronized (mMediaDevicesLock) {
            if (isAdvancedLayoutSupported()) {
                for (MediaItem mediaItem : mMediaItemList) {
                    if (mediaItem.getMediaDevice().isPresent()
                            && mediaItem.getMediaDevice().get().getState()
                            == LocalMediaManager.MediaDeviceState.STATE_CONNECTING) {
                        return true;
                    }
                }
            } else {
                for (MediaDevice device : mMediaDevices) {
                for (MediaDevice device : mMediaDevices) {
                    if (device.getState() == LocalMediaManager.MediaDeviceState.STATE_CONNECTING) {
                    if (device.getState() == LocalMediaManager.MediaDeviceState.STATE_CONNECTING) {
                        return true;
                        return true;
                    }
                    }
                }
                }
            }
            }
        }
        return false;
        return false;
    }
    }


Loading