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" />