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

This commit is contained in:
Shaowei Shen
2023-05-05 07:48:37 +00:00
committed by Android (Google) Code Review
5 changed files with 46 additions and 10 deletions

View File

@@ -43,6 +43,7 @@ import com.android.settingslib.media.MediaDevice;
import com.android.systemui.R; import com.android.systemui.R;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/** /**
* Adapter for media output dialog. * 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 boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final float DEVICE_DISCONNECTED_ALPHA = 0.5f; private static final float DEVICE_DISCONNECTED_ALPHA = 0.5f;
private static final float DEVICE_CONNECTED_ALPHA = 1f; private static final float DEVICE_CONNECTED_ALPHA = 1f;
protected List<MediaItem> mMediaItemList = new CopyOnWriteArrayList<>();
public MediaOutputAdapter(MediaOutputController controller) { public MediaOutputAdapter(MediaOutputController controller) {
super(controller); super(controller);
setHasStableIds(true); setHasStableIds(true);
} }
@Override
public void updateItems() {
mMediaItemList.clear();
mMediaItemList.addAll(mController.getMediaItemList());
notifyDataSetChanged();
}
@Override @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
int viewType) { int viewType) {
@@ -80,14 +89,14 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
@Override @Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if (mController.isAdvancedLayoutSupported()) { if (mController.isAdvancedLayoutSupported()) {
if (position >= mController.getMediaItemList().size()) { if (position >= mMediaItemList.size()) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "Incorrect position: " + position + " list size: " Log.d(TAG, "Incorrect position: " + position + " list size: "
+ mController.getMediaItemList().size()); + mMediaItemList.size());
} }
return; return;
} }
MediaItem currentMediaItem = mController.getMediaItemList().get(position); MediaItem currentMediaItem = mMediaItemList.get(position);
switch (currentMediaItem.getMediaItemType()) { switch (currentMediaItem.getMediaItemType()) {
case MediaItem.MediaItemType.TYPE_GROUP_DIVIDER: case MediaItem.MediaItemType.TYPE_GROUP_DIVIDER:
((MediaGroupDividerViewHolder) viewHolder).onBind(currentMediaItem.getTitle()); ((MediaGroupDividerViewHolder) viewHolder).onBind(currentMediaItem.getTitle());
@@ -120,11 +129,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
if (mController.isAdvancedLayoutSupported()) { if (mController.isAdvancedLayoutSupported()) {
if (position >= mController.getMediaItemList().size()) { if (position >= mMediaItemList.size()) {
Log.d(TAG, "Incorrect position for item id: " + position); Log.d(TAG, "Incorrect position for item id: " + position);
return position; return position;
} }
MediaItem currentMediaItem = mController.getMediaItemList().get(position); MediaItem currentMediaItem = mMediaItemList.get(position);
return currentMediaItem.getMediaDevice().isPresent() return currentMediaItem.getMediaDevice().isPresent()
? currentMediaItem.getMediaDevice().get().getId().hashCode() ? currentMediaItem.getMediaDevice().get().getId().hashCode()
: position; : position;
@@ -144,12 +153,12 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
if (mController.isAdvancedLayoutSupported() if (mController.isAdvancedLayoutSupported()
&& position >= mController.getMediaItemList().size()) { && position >= mMediaItemList.size()) {
Log.d(TAG, "Incorrect position for item type: " + position); Log.d(TAG, "Incorrect position for item type: " + position);
return MediaItem.MediaItemType.TYPE_GROUP_DIVIDER; return MediaItem.MediaItemType.TYPE_GROUP_DIVIDER;
} }
return mController.isAdvancedLayoutSupported() return mController.isAdvancedLayoutSupported()
? mController.getMediaItemList().get(position).getMediaItemType() ? mMediaItemList.get(position).getMediaItemType()
: super.getItemViewType(position); : super.getItemViewType(position);
} }
@@ -157,7 +166,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
public int getItemCount() { public int getItemCount() {
// Add extra one for "pair new" // Add extra one for "pair new"
return mController.isAdvancedLayoutSupported() return mController.isAdvancedLayoutSupported()
? mController.getMediaItemList().size() ? mMediaItemList.size()
: mController.getMediaDevices().size() + 1; : mController.getMediaDevices().size() + 1;
} }

View File

@@ -81,6 +81,11 @@ public abstract class MediaOutputBaseAdapter extends
mIsInitVolumeFirstTime = true; mIsInitVolumeFirstTime = true;
} }
/**
* Refresh current dataset
*/
public abstract void updateItems();
@Override @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
int viewType) { int viewType) {

View File

@@ -382,7 +382,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
&& currentActivePosition < mAdapter.getItemCount()) { && currentActivePosition < mAdapter.getItemCount()) {
mAdapter.notifyItemChanged(currentActivePosition); mAdapter.notifyItemChanged(currentActivePosition);
} else { } else {
mAdapter.notifyDataSetChanged(); mAdapter.updateItems();
} }
} else { } else {
mMediaOutputController.setRefreshing(false); mMediaOutputController.setRefreshing(false);

View File

@@ -119,6 +119,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
mMediaItems.add(new MediaItem(mMediaDevice2)); mMediaItems.add(new MediaItem(mMediaDevice2));
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
mSpyMediaOutputSeekbar = spy(mViewHolder.mSeekBar); mSpyMediaOutputSeekbar = spy(mViewHolder.mSeekBar);
@@ -205,9 +206,11 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
public void advanced_onBindViewHolder_bindPairNew_verifyView() { public void advanced_onBindViewHolder_bindPairNew_verifyView() {
when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true); when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true);
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
mMediaItems.add(new MediaItem()); mMediaItems.add(new MediaItem());
mMediaOutputAdapter.updateItems();
mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE);
@@ -226,6 +229,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
Collectors.toList())); Collectors.toList()));
when(mMediaOutputController.getSessionName()).thenReturn(TEST_SESSION_NAME); when(mMediaOutputController.getSessionName()).thenReturn(TEST_SESSION_NAME);
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.getItemCount();
@@ -246,6 +250,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
Collectors.toList())); Collectors.toList()));
when(mMediaOutputController.getSessionName()).thenReturn(null); when(mMediaOutputController.getSessionName()).thenReturn(null);
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
mMediaOutputAdapter.getItemCount(); mMediaOutputAdapter.getItemCount();
@@ -605,9 +610,11 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
public void advanced_onItemClick_clickPairNew_verifyLaunchBluetoothPairing() { public void advanced_onItemClick_clickPairNew_verifyLaunchBluetoothPairing() {
when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true); when(mMediaOutputController.isAdvancedLayoutSupported()).thenReturn(true);
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
mMediaItems.add(new MediaItem()); mMediaItems.add(new MediaItem());
mMediaOutputAdapter.updateItems();
mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2); mMediaOutputAdapter.onBindViewHolder(mViewHolder, 2);
mViewHolder.mContainerLayout.performClick(); mViewHolder.mContainerLayout.performClick();
@@ -719,6 +726,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
mMediaItems.stream().map((item) -> item.getMediaDevice().get()).collect( mMediaItems.stream().map((item) -> item.getMediaDevice().get()).collect(
Collectors.toList())); Collectors.toList()));
mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController); mMediaOutputAdapter = new MediaOutputAdapter(mMediaOutputController);
mMediaOutputAdapter.updateItems();
mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
.onCreateViewHolder(new LinearLayout(mContext), 0); .onCreateViewHolder(new LinearLayout(mContext), 0);
List<MediaDevice> selectableDevices = new ArrayList<>(); List<MediaDevice> selectableDevices = new ArrayList<>();
@@ -753,4 +761,18 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
verify(mMediaOutputController).setCurrentColorScheme(wallpaperColors, true); 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());
}
} }

View File

@@ -239,7 +239,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
when(mMediaOutputBaseAdapter.isDragging()).thenReturn(false); when(mMediaOutputBaseAdapter.isDragging()).thenReturn(false);
mMediaOutputBaseDialogImpl.refresh(); mMediaOutputBaseDialogImpl.refresh();
verify(mMediaOutputBaseAdapter).notifyDataSetChanged(); verify(mMediaOutputBaseAdapter).updateItems();
} }
@Test @Test