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

Commit 90b2ead2 authored by Shaowei Shen's avatar Shaowei Shen Committed by Automerger Merge Worker
Browse files

Merge "[Output Switcher] Fix ArrayIndexOutOfBoundsException" into udc-dev am:...

Merge "[Output Switcher] Fix ArrayIndexOutOfBoundsException" into udc-dev am: 4711434e am: 5ed3ee27

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22891385



Change-Id: I03595aa6f158749a89bfe9724809f4a42c95fd35
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents d8d4e96a 5ed3ee27
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.settingslib.media.MediaDevice;
import com.android.systemui.R;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Adapter for media output dialog.
@@ -53,12 +54,20 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
    private static final float DEVICE_DISCONNECTED_ALPHA = 0.5f;
    private static final float DEVICE_CONNECTED_ALPHA = 1f;
    protected List<MediaItem> mMediaItemList = new CopyOnWriteArrayList<>();

    public MediaOutputAdapter(MediaOutputController controller) {
        super(controller);
        setHasStableIds(true);
    }

    @Override
    public void updateItems() {
        mMediaItemList.clear();
        mMediaItemList.addAll(mController.getMediaItemList());
        notifyDataSetChanged();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
            int viewType) {
@@ -80,14 +89,14 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        if (mController.isAdvancedLayoutSupported()) {
            if (position >= mController.getMediaItemList().size()) {
            if (position >= mMediaItemList.size()) {
                if (DEBUG) {
                    Log.d(TAG, "Incorrect position: " + position + " list size: "
                            + mController.getMediaItemList().size());
                            + mMediaItemList.size());
                }
                return;
            }
            MediaItem currentMediaItem = mController.getMediaItemList().get(position);
            MediaItem currentMediaItem = mMediaItemList.get(position);
            switch (currentMediaItem.getMediaItemType()) {
                case MediaItem.MediaItemType.TYPE_GROUP_DIVIDER:
                    ((MediaGroupDividerViewHolder) viewHolder).onBind(currentMediaItem.getTitle());
@@ -120,11 +129,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    @Override
    public long getItemId(int position) {
        if (mController.isAdvancedLayoutSupported()) {
            if (position >= mController.getMediaItemList().size()) {
            if (position >= mMediaItemList.size()) {
                Log.d(TAG, "Incorrect position for item id: " + position);
                return position;
            }
            MediaItem currentMediaItem = mController.getMediaItemList().get(position);
            MediaItem currentMediaItem = mMediaItemList.get(position);
            return currentMediaItem.getMediaDevice().isPresent()
                    ? currentMediaItem.getMediaDevice().get().getId().hashCode()
                    : position;
@@ -144,12 +153,12 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    @Override
    public int getItemViewType(int position) {
        if (mController.isAdvancedLayoutSupported()
                && position >= mController.getMediaItemList().size()) {
                && position >= mMediaItemList.size()) {
            Log.d(TAG, "Incorrect position for item type: " + position);
            return MediaItem.MediaItemType.TYPE_GROUP_DIVIDER;
        }
        return mController.isAdvancedLayoutSupported()
                ? mController.getMediaItemList().get(position).getMediaItemType()
                ? mMediaItemList.get(position).getMediaItemType()
                : super.getItemViewType(position);
    }

@@ -157,7 +166,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    public int getItemCount() {
        // Add extra one for "pair new"
        return mController.isAdvancedLayoutSupported()
                ? mController.getMediaItemList().size()
                ? mMediaItemList.size()
                : mController.getMediaDevices().size() + 1;
    }

+5 −0
Original line number Diff line number Diff line
@@ -81,6 +81,11 @@ public abstract class MediaOutputBaseAdapter extends
        mIsInitVolumeFirstTime = true;
    }

    /**
     * Refresh current dataset
     */
    public abstract void updateItems();

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
            int viewType) {
+1 −1
Original line number Diff line number Diff line
@@ -382,7 +382,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
                    && currentActivePosition < mAdapter.getItemCount()) {
                mAdapter.notifyItemChanged(currentActivePosition);
            } else {
                mAdapter.notifyDataSetChanged();
                mAdapter.updateItems();
            }
        } else {
            mMediaOutputController.setRefreshing(false);
+22 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
        mMediaItems.add(new MediaItem(mMediaDevice2));

        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        mSpyMediaOutputSeekbar = spy(mViewHolder.mSeekBar);
@@ -205,9 +206,11 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
    public void advanced_onBindViewHolder_bindPairNew_verifyView() {
        when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true);
        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        mMediaItems.add(new MediaItem());
        mMediaOutputAdapter.updateItems();
        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);

        assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE);
@@ -226,6 +229,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
                        Collectors.toList()));
        when(mMediaOutputController.getSessionName()).thenReturn(TEST_SESSION_NAME);
        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        mMediaOutputAdapter.getItemCount();
@@ -246,6 +250,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
                        Collectors.toList()));
        when(mMediaOutputController.getSessionName()).thenReturn(null);
        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        mMediaOutputAdapter.getItemCount();
@@ -605,9 +610,11 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
    public void advanced_onItemClick_clickPairNew_verifyLaunchBluetoothPairing() {
        when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true);
        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        mMediaItems.add(new MediaItem());
        mMediaOutputAdapter.updateItems();
        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
        mViewHolder.mContainerLayout.performClick();

@@ -719,6 +726,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
                mMediaItems.stream().map((item) -> item.getMediaDevice().get()).collect(
                        Collectors.toList()));
        mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
        mMediaOutputAdapter.updateItems();
        mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                .onCreateViewHolder(new LinearLayout(mContext), 0);
        List<MediaDevice> selectableDevices = new ArrayList<>();
@@ -753,4 +761,18 @@ public class MediaOutputAdapterTest extends SysuiTestCase {

        verify(mMediaOutputController).setCurrentColorScheme(wallpaperColors, true);
    }

    @Test
    public void updateItems_controllerItemsUpdated_notUpdatesInAdapterUntilUpdateItems() {
        when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true);
        mMediaOutputAdapter.updateItems();
        List<MediaItem> updatedList = new ArrayList<>();
        updatedList.add(new MediaItem());
        when(mMediaOutputController.getMediaItemList()).thenReturn(updatedList);
        assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(mMediaItems.size());

        mMediaOutputAdapter.updateItems();

        assertThat(mMediaOutputAdapter.getItemCount()).isEqualTo(updatedList.size());
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
        when(mMediaOutputBaseAdapter.isDragging()).thenReturn(false);
        mMediaOutputBaseDialogImpl.refresh();

        verify(mMediaOutputBaseAdapter).notifyDataSetChanged();
        verify(mMediaOutputBaseAdapter).updateItems();
    }

    @Test