Constructors Summary |
---|
public MediaRouteButton(android.content.Context context)
this(context, null);
|
public MediaRouteButton(android.content.Context context, android.util.AttributeSet attrs)
this(context, attrs, com.android.internal.R.attr.mediaRouteButtonStyle);
|
public MediaRouteButton(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr)
this(context, attrs, defStyleAttr, 0);
|
public MediaRouteButton(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr, int defStyleRes)
super(context, attrs, defStyleAttr, defStyleRes);
mRouter = (MediaRouter)context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
mCallback = new MediaRouterCallback();
final TypedArray a = context.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.MediaRouteButton, defStyleAttr, defStyleRes);
setRemoteIndicatorDrawable(a.getDrawable(
com.android.internal.R.styleable.MediaRouteButton_externalRouteEnabledDrawable));
mMinWidth = a.getDimensionPixelSize(
com.android.internal.R.styleable.MediaRouteButton_minWidth, 0);
mMinHeight = a.getDimensionPixelSize(
com.android.internal.R.styleable.MediaRouteButton_minHeight, 0);
final int routeTypes = a.getInteger(
com.android.internal.R.styleable.MediaRouteButton_mediaRouteTypes,
MediaRouter.ROUTE_TYPE_LIVE_AUDIO);
a.recycle();
setClickable(true);
setLongClickable(true);
setRouteTypes(routeTypes);
|
Methods Summary |
---|
protected void | drawableStateChanged()
super.drawableStateChanged();
if (mRemoteIndicator != null) {
int[] myDrawableState = getDrawableState();
mRemoteIndicator.setState(myDrawableState);
invalidate();
}
|
private Activity | getActivity()
// Gross way of unwrapping the Activity so we can get the FragmentManager
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
throw new IllegalStateException("The MediaRouteButton's Context is not an Activity.");
|
public int | getRouteTypes()Gets the media route types for filtering the routes that the user can
select using the media route chooser dialog.
return mRouteTypes;
|
public void | jumpDrawablesToCurrentState()
super.jumpDrawablesToCurrentState();
if (mRemoteIndicator != null) {
mRemoteIndicator.jumpToCurrentState();
}
|
public void | onAttachedToWindow()
super.onAttachedToWindow();
mAttachedToWindow = true;
if (mRouteTypes != 0) {
mRouter.addCallback(mRouteTypes, mCallback,
MediaRouter.CALLBACK_FLAG_PASSIVE_DISCOVERY);
}
refreshRoute();
|
protected int[] | onCreateDrawableState(int extraSpace)
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
// Technically we should be handling this more completely, but these
// are implementation details here. Checked is used to express the connecting
// drawable state and it's mutually exclusive with activated for the purposes
// of state selection here.
if (mIsConnecting) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
} else if (mRemoteActive) {
mergeDrawableStates(drawableState, ACTIVATED_STATE_SET);
}
return drawableState;
|
public void | onDetachedFromWindow()
mAttachedToWindow = false;
if (mRouteTypes != 0) {
mRouter.removeCallback(mCallback);
}
super.onDetachedFromWindow();
|
protected void | onDraw(android.graphics.Canvas canvas)
super.onDraw(canvas);
if (mRemoteIndicator == null) return;
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);
|
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 minWidth = Math.max(mMinWidth,
mRemoteIndicator != null ? mRemoteIndicator.getIntrinsicWidth() : 0);
final int minHeight = Math.max(mMinHeight,
mRemoteIndicator != null ? mRemoteIndicator.getIntrinsicHeight() : 0);
int width;
switch (widthMode) {
case MeasureSpec.EXACTLY:
width = widthSize;
break;
case MeasureSpec.AT_MOST:
width = Math.min(widthSize, minWidth + getPaddingLeft() + getPaddingRight());
break;
default:
case MeasureSpec.UNSPECIFIED:
width = minWidth + getPaddingLeft() + getPaddingRight();
break;
}
int height;
switch (heightMode) {
case MeasureSpec.EXACTLY:
height = heightSize;
break;
case MeasureSpec.AT_MOST:
height = Math.min(heightSize, minHeight + getPaddingTop() + getPaddingBottom());
break;
default:
case MeasureSpec.UNSPECIFIED:
height = minHeight + getPaddingTop() + getPaddingBottom();
break;
}
setMeasuredDimension(width, height);
|
public boolean | performClick()
// Send the appropriate accessibility events and call listeners
boolean handled = super.performClick();
if (!handled) {
playSoundEffect(SoundEffectConstants.CLICK);
}
return showDialogInternal() || handled;
|
public boolean | performLongClick()
if (super.performLongClick()) {
return true;
}
if (!mCheatSheetEnabled) {
return false;
}
final CharSequence contentDesc = getContentDescription();
if (TextUtils.isEmpty(contentDesc)) {
// Don't show the cheat sheet if we have no description
return false;
}
final int[] screenPos = new int[2];
final Rect displayFrame = new Rect();
getLocationOnScreen(screenPos);
getWindowVisibleDisplayFrame(displayFrame);
final Context context = getContext();
final int width = getWidth();
final int height = getHeight();
final int midy = screenPos[1] + height / 2;
final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
Toast cheatSheet = Toast.makeText(context, contentDesc, Toast.LENGTH_SHORT);
if (midy < displayFrame.height()) {
// Show along the top; follow action buttons
cheatSheet.setGravity(Gravity.TOP | Gravity.END,
screenWidth - screenPos[0] - width / 2, height);
} else {
// Show along the bottom center
cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
}
cheatSheet.show();
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
|
private void | refreshRoute()
if (mAttachedToWindow) {
final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
final boolean isRemote = !route.isDefault() && route.matchesTypes(mRouteTypes);
final boolean isConnecting = isRemote && route.isConnecting();
boolean needsRefresh = false;
if (mRemoteActive != isRemote) {
mRemoteActive = isRemote;
needsRefresh = true;
}
if (mIsConnecting != isConnecting) {
mIsConnecting = isConnecting;
needsRefresh = true;
}
if (needsRefresh) {
refreshDrawableState();
}
setEnabled(mRouter.isRouteAvailable(mRouteTypes,
MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
}
|
void | setCheatSheetEnabled(boolean enable)Sets whether to enable showing a toast with the content descriptor of the
button when the button is long pressed.
mCheatSheetEnabled = enable;
|
public void | setExtendedSettingsClickListener(OnClickListener listener)
mExtendedSettingsClickListener = listener;
|
private void | setRemoteIndicatorDrawable(android.graphics.drawable.Drawable d)
if (mRemoteIndicator != null) {
mRemoteIndicator.setCallback(null);
unscheduleDrawable(mRemoteIndicator);
}
mRemoteIndicator = d;
if (d != null) {
d.setCallback(this);
d.setState(getDrawableState());
d.setVisible(getVisibility() == VISIBLE, false);
}
refreshDrawableState();
|
public void | setRouteTypes(int types)Sets the types of routes that will be shown in the media route chooser dialog
launched by this button.
if (mRouteTypes != types) {
if (mAttachedToWindow && mRouteTypes != 0) {
mRouter.removeCallback(mCallback);
}
mRouteTypes = types;
if (mAttachedToWindow && types != 0) {
mRouter.addCallback(types, mCallback,
MediaRouter.CALLBACK_FLAG_PASSIVE_DISCOVERY);
}
refreshRoute();
}
|
public void | setVisibility(int visibility)
super.setVisibility(visibility);
if (mRemoteIndicator != null) {
mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
}
|
public void | showDialog()Show the route chooser or controller dialog.
If the default route is selected or if the currently selected route does
not match the {@link #getRouteTypes route types}, then shows the route chooser dialog.
Otherwise, shows the route controller dialog to offer the user
a choice to disconnect from the route or perform other control actions
such as setting the route's volume.
This will attach a {@link DialogFragment} to the containing Activity.
showDialogInternal();
|
boolean | showDialogInternal()
if (!mAttachedToWindow) {
return false;
}
DialogFragment f = MediaRouteDialogPresenter.showDialogFragment(getActivity(),
mRouteTypes, mExtendedSettingsClickListener);
return f != null;
|
protected boolean | verifyDrawable(android.graphics.drawable.Drawable who)
return super.verifyDrawable(who) || who == mRemoteIndicator;
|