Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save danybony/e339d46776004f99ac9b3ac6f4812b4a to your computer and use it in GitHub Desktop.
Save danybony/e339d46776004f99ac9b3ac6f4812b4a to your computer and use it in GitHub Desktop.
<resources>
<declare-styleable name="ThemeableMediaRouteButton">
<attr name="iconColor" format="reference|color" />
</declare-styleable>
</resources>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_cast_item"
android:orderInCategory="0"
app:showAsAction="always"
app:actionProviderClass="com.ryanharter.mediaroute.widgets.ThemeableMediaRouteActionProvider"
android:title="@string/menu_cast"/>
</menu>
<resources>
<style name="Widget.MediaRouter.MediaRouteButton" parent="Widget.MediaRouter.Light.MediaRouteButton">
<item name="iconColor">@color/red</item>
</style>
<style name="Widget.MediaRouter.MediaRouteButton.Section1">
<item name="iconColor">@color/white</item>
</style>
<style name="Widget.MediaRouter.MediaRouteButton.Section2">
<item name="iconColor">@color/blue</item>
</style>
</resources>
package com.ryanharter.mediaroute.widgets;
import android.content.Context;
import android.support.v7.app.MediaRouteActionProvider;
import android.support.v7.app.MediaRouteButton;
/**
* A MediaRouteActionProvider that allows the use of a ThemeableMediaRouteButton.
*/
public class ThemeableMediaRouteActionProvider extends MediaRouteActionProvider {
public ThemeableMediaRouteActionProvider(Context context) {
super(context);
}
@Override public MediaRouteButton onCreateMediaRouteButton() {
return new ThemeableMediaRouteButton(getContext());
}
}
package com.ryanharter.mediaroute.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v7.app.MediaRouteButton;
import android.util.AttributeSet;
import com.ryanharter.mediaroute.R;
/**
* Allows theming of the MediaRouteButton using the theme associated with
* the context passed in.
*/
public class ThemeableMediaRouteButton extends MediaRouteButton {
private final int color;
private Drawable originalDrawable;
public ThemeableMediaRouteButton(Context context) {
this(context, null);
}
public ThemeableMediaRouteButton(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.mediaRouteButtonStyle);
}
public ThemeableMediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.ThemeableMediaRouteButton, defStyleAttr, 0);
color = a.getColor(R.styleable.ThemeableMediaRouteButton_iconColor, 0);
a.recycle();
applyColorToRemoteIndicator();
}
private void applyColorToRemoteIndicator() {
if (originalDrawable == null) {
return;
}
originalDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
setRemoteIndicatorDrawable(originalDrawable);
}
@Override
public void setRemoteIndicatorDrawable(Drawable d) {
// save the original icon used by MediaRouterButton to tint it later
originalDrawable = d;
super.setRemoteIndicatorDrawable(d);
}
}
<resources>
<style name="Theme.MyApp">
<item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.MediaRouteButton</item>
</style>
<style name="Theme.MyApp.Section1">
<item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.MediaRouteButton.Section1</item>
</style>
<style name="Theme.MyApp.Section2">
<item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.MediaRouteButton.Section2</item>
</style>
</resources>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment