Merge "[Output Switcher] Fix ArrayIndexOutOfBoundsException" into udc-dev
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user