Reuse ImageButton in control bar if it exists
Fixes: 166517828
Test: manual
Change-Id: I52e4f93987a54dbca1c0d7fa8e9a8b8b51bb037a
diff --git a/car-media-common/src/com/android/car/media/common/MediaButtonController.java b/car-media-common/src/com/android/car/media/common/MediaButtonController.java
index 48e0406..c399089 100644
--- a/car-media-common/src/com/android/car/media/common/MediaButtonController.java
+++ b/car-media-common/src/com/android/car/media/common/MediaButtonController.java
@@ -41,7 +41,9 @@
import com.android.car.media.common.source.MediaSourceColors;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -54,6 +56,8 @@
private static final String TAG = "MediaButton";
+ private final Map<String, ImageButton> mImageButtons = new HashMap<>();
+
private Context mContext;
private PlayPauseStopImageView mPlayPauseStopImageView;
private View mPlayPauseStopImageContainer;
@@ -134,6 +138,7 @@
mControlBar.setView(null, ControlBar.SLOT_RIGHT);
mSkipNextAdded = false;
mSkipPrevAdded = false;
+ mImageButtons.clear();
}
private ImageButton createIconButton(Drawable icon) {
@@ -228,12 +233,7 @@
imageButtons.addAll(state.getCustomActions()
.stream()
.map(rawAction -> rawAction.fetchDrawable(mContext))
- .map(action -> {
- ImageButton button = createIconButton(action.mIcon);
- button.setOnClickListener(view ->
- mController.doCustomAction(action.mAction, action.mExtras));
- return button;
- })
+ .map(action -> getOrCreateIconButton(action))
.collect(Collectors.toList()));
}
if (!mSkipPrevAdded && !imageButtons.isEmpty()) {
@@ -245,6 +245,21 @@
mControlBar.setViews(imageButtons.toArray(new ImageButton[0]));
}
+ private ImageButton getOrCreateIconButton(CustomPlaybackAction action) {
+ // Reuse the ImageButton with the same action identifier if it exists, because if the
+ // ImageButton is focused, replacing it with a new one will make it lose focus.
+ ImageButton button = mImageButtons.get(action.mAction);
+ if (button != null) {
+ button.setImageDrawable(action.mIcon);
+ } else {
+ button = createIconButton(action.mIcon);
+ mImageButtons.put(action.mAction, button);
+ }
+ button.setOnClickListener(view ->
+ mController.doCustomAction(action.mAction, action.mExtras));
+ return button;
+ }
+
private void onPlayPauseStopClicked(View view) {
if (mController == null) {
return;