[go: nahoru, domu]

Remove redundant drawable handling in the MediaRouteButton

The onMeasure and onDraw implementations of MediaRouteButton
before the change are a duplicate of the logic that exists in
the platform's ImageView. By extending ImageView (via AppCompatImageView)
and calling super.setImageDrawable, we can leverage the onMeasure
and onDraw logic in ImageView.

Bug: b/296297648
Test: tested manually
Relnote: N/A as not an API change
Change-Id: Ib455eabd662effe6bde57a54f80a56ef009afde0
diff --git a/mediarouter/mediarouter/api/current.ignore b/mediarouter/mediarouter/api/current.ignore
new file mode 100644
index 0000000..f409924
--- /dev/null
+++ b/mediarouter/mediarouter/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+ChangedSuperclass: androidx.mediarouter.app.MediaRouteButton:
+    Class androidx.mediarouter.app.MediaRouteButton superclass changed from android.view.View to androidx.appcompat.widget.AppCompatImageView
diff --git a/mediarouter/mediarouter/api/current.txt b/mediarouter/mediarouter/api/current.txt
index 5b0b4bb..117dca9 100644
--- a/mediarouter/mediarouter/api/current.txt
+++ b/mediarouter/mediarouter/api/current.txt
@@ -14,7 +14,7 @@
     method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
   }
 
-  public class MediaRouteButton extends android.view.View {
+  public class MediaRouteButton extends androidx.appcompat.widget.AppCompatImageView {
     ctor public MediaRouteButton(android.content.Context);
     ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet?);
     ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet?, int);
diff --git a/mediarouter/mediarouter/api/restricted_current.ignore b/mediarouter/mediarouter/api/restricted_current.ignore
new file mode 100644
index 0000000..f409924
--- /dev/null
+++ b/mediarouter/mediarouter/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+ChangedSuperclass: androidx.mediarouter.app.MediaRouteButton:
+    Class androidx.mediarouter.app.MediaRouteButton superclass changed from android.view.View to androidx.appcompat.widget.AppCompatImageView
diff --git a/mediarouter/mediarouter/api/restricted_current.txt b/mediarouter/mediarouter/api/restricted_current.txt
index 5b0b4bb..117dca9 100644
--- a/mediarouter/mediarouter/api/restricted_current.txt
+++ b/mediarouter/mediarouter/api/restricted_current.txt
@@ -14,7 +14,7 @@
     method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
   }
 
-  public class MediaRouteButton extends android.view.View {
+  public class MediaRouteButton extends androidx.appcompat.widget.AppCompatImageView {
     ctor public MediaRouteButton(android.content.Context);
     ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet?);
     ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet?, int);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index fb1942a..d1aa391 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -21,7 +21,6 @@
 import android.content.ContextWrapper;
 import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
-import android.graphics.Canvas;
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
@@ -34,6 +33,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
+import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.TooltipCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.ViewCompat;
@@ -72,7 +72,7 @@
  *
  * @see MediaRouteActionProvider
  */
-public class MediaRouteButton extends View {
+public class MediaRouteButton extends AppCompatImageView {
     private static final String TAG = "MediaRouteButton";
 
     private static final String CHOOSER_FRAGMENT_TAG =
@@ -109,8 +109,6 @@
     private int mConnectionState;
 
     private ColorStateList mButtonTint;
-    private int mMinWidth;
-    private int mMinHeight;
 
     private boolean mCheatSheetEnabled;
 
@@ -157,10 +155,6 @@
                 (isRemote ? selectedRoute.getConnectionState() : CONNECTION_STATE_DISCONNECTED);
 
         mButtonTint = a.getColorStateList(R.styleable.MediaRouteButton_mediaRouteButtonTint);
-        mMinWidth = a.getDimensionPixelSize(
-                R.styleable.MediaRouteButton_android_minWidth, 0);
-        mMinHeight = a.getDimensionPixelSize(
-                R.styleable.MediaRouteButton_android_minHeight, 0);
 
         int remoteIndicatorStaticResId = a.getResourceId(
                 R.styleable.MediaRouteButton_externalRouteEnabledDrawableStatic, 0);
@@ -409,7 +403,7 @@
 
     @Override
     @NonNull
-    protected int[] onCreateDrawableState(int extraSpace) {
+    public int[] onCreateDrawableState(int extraSpace) {
         final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
 
         // Technically we should be handling this more completely, but these
@@ -460,7 +454,7 @@
                     }
                 }
             }
-            invalidate();
+            setImageDrawable(mRemoteIndicator);
         }
         mLastConnectionState = mConnectionState;
     }
@@ -535,70 +529,6 @@
         super.onDetachedFromWindow();
     }
 
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
-        final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-        final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-
-        final int width = Math.max(mMinWidth, mRemoteIndicator != null ?
-                mRemoteIndicator.getIntrinsicWidth() + getPaddingLeft() + getPaddingRight() : 0);
-        final int height = Math.max(mMinHeight, mRemoteIndicator != null ?
-                mRemoteIndicator.getIntrinsicHeight() + getPaddingTop() + getPaddingBottom() : 0);
-
-        int measuredWidth;
-        switch (widthMode) {
-            case MeasureSpec.EXACTLY:
-                measuredWidth = widthSize;
-                break;
-            case MeasureSpec.AT_MOST:
-                measuredWidth = Math.min(widthSize, width);
-                break;
-            default:
-            case MeasureSpec.UNSPECIFIED:
-                measuredWidth = width;
-                break;
-        }
-
-        int measuredHeight;
-        switch (heightMode) {
-            case MeasureSpec.EXACTLY:
-                measuredHeight = heightSize;
-                break;
-            case MeasureSpec.AT_MOST:
-                measuredHeight = Math.min(heightSize, height);
-                break;
-            default:
-            case MeasureSpec.UNSPECIFIED:
-                measuredHeight = height;
-                break;
-        }
-
-        setMeasuredDimension(measuredWidth, measuredHeight);
-    }
-
-    @Override
-    protected void onDraw(@NonNull Canvas canvas) {
-        super.onDraw(canvas);
-
-        if (mRemoteIndicator != null) {
-            final int left = getPaddingLeft();
-            final int right = getWidth() - getPaddingRight();
-            final int top = getPaddingTop();
-            final int bottom = getHeight() - getPaddingBottom();
-
-            final int drawWidth = mRemoteIndicator.getIntrinsicWidth();
-            final int drawHeight = mRemoteIndicator.getIntrinsicHeight();
-            final int drawLeft = left + (right - left - drawWidth) / 2;
-            final int drawTop = top + (bottom - top - drawHeight) / 2;
-
-            mRemoteIndicator.setBounds(drawLeft, drawTop,
-                    drawLeft + drawWidth, drawTop + drawHeight);
-            mRemoteIndicator.draw(canvas);
-        }
-    }
-
     private void loadRemoteIndicatorIfNeeded() {
         if (mRemoteIndicatorResIdToLoad > 0) {
             if (mRemoteIndicatorLoader != null) {
diff --git a/mediarouter/mediarouter/src/main/res/values/attrs.xml b/mediarouter/mediarouter/src/main/res/values/attrs.xml
index f25789e..2299490 100644
--- a/mediarouter/mediarouter/src/main/res/values/attrs.xml
+++ b/mediarouter/mediarouter/src/main/res/values/attrs.xml
@@ -29,8 +29,6 @@
         <!-- Tint to apply to the media route button -->
         <attr name="mediaRouteButtonTint" format="color" />
 
-        <attr name="android:minWidth" />
-        <attr name="android:minHeight" />
     </declare-styleable>
 
     <attr name="mediaRouteButtonStyle" format="reference" />