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;