Methods Summary |
---|
protected android.view.View | createIcon()
final ImageView icon = new ImageView(mContext);
icon.setId(android.R.id.icon);
icon.setScaleType(ScaleType.CENTER_INSIDE);
return icon;
|
private static int | exactly(int size)
return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
|
protected void | handleStateChanged(com.android.systemui.qs.QSTile.State state)
if (mIcon instanceof ImageView) {
setIcon((ImageView) mIcon, state);
}
if (mDual) {
mDualLabel.setText(state.label);
mDualLabel.setContentDescription(state.dualLabelContentDescription);
mTopBackgroundView.setContentDescription(state.contentDescription);
} else {
mLabel.setText(state.label);
setContentDescription(state.contentDescription);
}
|
public void | init(OnClickListener clickPrimary, OnClickListener clickSecondary, OnLongClickListener longClick)
mClickPrimary = clickPrimary;
mClickSecondary = clickSecondary;
mLongClick = longClick;
|
private android.view.View | labelView()
return mDual ? mDualLabel : mLabel;
|
private static void | layout(android.view.View child, int left, int top)
child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight());
|
private android.graphics.drawable.Drawable | newTileBackground()
final int[] attrs = new int[] { android.R.attr.selectableItemBackgroundBorderless };
final TypedArray ta = mContext.obtainStyledAttributes(attrs);
final Drawable d = ta.getDrawable(0);
ta.recycle();
return d;
|
protected void | onConfigurationChanged(android.content.res.Configuration newConfig)
super.onConfigurationChanged(newConfig);
updateTopPadding();
FontSizeUtils.updateFontSize(mLabel, R.dimen.qs_tile_text_size);
if (mDualLabel != null) {
mDualLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimensionPixelSize(R.dimen.qs_tile_text_size));
}
|
protected void | onLayout(boolean changed, int l, int t, int r, int b)
final int w = getMeasuredWidth();
final int h = getMeasuredHeight();
layout(mTopBackgroundView, 0, mTileSpacingPx);
int top = 0;
top += mTileSpacingPx;
top += mTilePaddingTopPx;
final int iconLeft = (w - mIcon.getMeasuredWidth()) / 2;
layout(mIcon, iconLeft, top);
if (mRipple != null) {
updateRippleSize(w, h);
}
top = mIcon.getBottom();
top += mTilePaddingBelowIconPx;
if (mDual) {
layout(mDivider, 0, top);
top = mDivider.getBottom();
}
layout(labelView(), 0, top);
|
protected void | onMeasure(int widthMeasureSpec, int heightMeasureSpec)
final int w = MeasureSpec.getSize(widthMeasureSpec);
final int h = MeasureSpec.getSize(heightMeasureSpec);
final int iconSpec = exactly(mIconSizePx);
mIcon.measure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.AT_MOST), iconSpec);
labelView().measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(h, MeasureSpec.AT_MOST));
if (mDual) {
mDivider.measure(widthMeasureSpec, exactly(mDivider.getLayoutParams().height));
}
int heightSpec = exactly(
mIconSizePx + mTilePaddingBelowIconPx + mTilePaddingTopPx);
mTopBackgroundView.measure(widthMeasureSpec, heightSpec);
setMeasuredDimension(w, h);
|
public void | onStateChanged(com.android.systemui.qs.QSTile.State state)
mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget();
|
private void | recreateLabel()
CharSequence labelText = null;
CharSequence labelDescription = null;
if (mLabel != null) {
labelText = mLabel.getText();
removeView(mLabel);
mLabel = null;
}
if (mDualLabel != null) {
labelText = mDualLabel.getText();
labelDescription = mLabel.getContentDescription();
removeView(mDualLabel);
mDualLabel = null;
}
final Resources res = mContext.getResources();
if (mDual) {
mDualLabel = new QSDualTileLabel(mContext);
mDualLabel.setId(android.R.id.title);
mDualLabel.setBackgroundResource(R.drawable.btn_borderless_rect);
mDualLabel.setFirstLineCaret(res.getDrawable(R.drawable.qs_dual_tile_caret));
mDualLabel.setTextColor(res.getColor(R.color.qs_tile_text));
mDualLabel.setPadding(0, mDualTileVerticalPaddingPx, 0, mDualTileVerticalPaddingPx);
mDualLabel.setTypeface(CONDENSED);
mDualLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
res.getDimensionPixelSize(R.dimen.qs_tile_text_size));
mDualLabel.setClickable(true);
mDualLabel.setOnClickListener(mClickSecondary);
mDualLabel.setFocusable(true);
if (labelText != null) {
mDualLabel.setText(labelText);
}
if (labelDescription != null) {
mDualLabel.setContentDescription(labelDescription);
}
addView(mDualLabel);
} else {
mLabel = new TextView(mContext);
mLabel.setId(android.R.id.title);
mLabel.setTextColor(res.getColor(R.color.qs_tile_text));
mLabel.setGravity(Gravity.CENTER_HORIZONTAL);
mLabel.setMinLines(2);
mLabel.setPadding(0, 0, 0, 0);
mLabel.setTypeface(CONDENSED);
mLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
res.getDimensionPixelSize(R.dimen.qs_tile_text_size));
mLabel.setClickable(false);
if (labelText != null) {
mLabel.setText(labelText);
}
addView(mLabel);
}
|
public boolean | setDual(boolean dual)
final boolean changed = dual != mDual;
mDual = dual;
if (changed) {
recreateLabel();
}
if (mTileBackground instanceof RippleDrawable) {
setRipple((RippleDrawable) mTileBackground);
}
if (dual) {
mTopBackgroundView.setOnClickListener(mClickPrimary);
setOnClickListener(null);
setClickable(false);
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
mTopBackgroundView.setBackground(mTileBackground);
} else {
mTopBackgroundView.setOnClickListener(null);
mTopBackgroundView.setClickable(false);
setOnClickListener(mClickPrimary);
setOnLongClickListener(mLongClick);
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
}
mTopBackgroundView.setFocusable(dual);
setFocusable(!dual);
mDivider.setVisibility(dual ? VISIBLE : GONE);
postInvalidate();
return changed;
|
protected void | setIcon(android.widget.ImageView iv, com.android.systemui.qs.QSTile.State state)
if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) {
Drawable d = state.icon != null ? state.icon.getDrawable(mContext) : null;
if (d != null && state.autoMirrorDrawable) {
d.setAutoMirrored(true);
}
iv.setImageDrawable(d);
iv.setTag(R.id.qs_icon_tag, state.icon);
if (d instanceof Animatable) {
if (!iv.isShown()) {
((Animatable) d).stop(); // skip directly to end state
}
}
}
|
private void | setRipple(android.graphics.drawable.RippleDrawable tileBackground)
mRipple = tileBackground;
if (getWidth() != 0) {
updateRippleSize(getWidth(), getHeight());
}
|
private void | updateRippleSize(int width, int height)
// center the touch feedback on the center of the icon, and dial it down a bit
final int cx = width / 2;
final int cy = mDual ? mIcon.getTop() + mIcon.getHeight() / 2 : height / 2;
final int rad = (int)(mIcon.getHeight() * 1.25f);
mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
|
private void | updateTopPadding()
Resources res = getResources();
int padding = res.getDimensionPixelSize(R.dimen.qs_tile_padding_top);
int largePadding = res.getDimensionPixelSize(R.dimen.qs_tile_padding_top_large_text);
float largeFactor = (MathUtils.constrain(getResources().getConfiguration().fontScale,
1.0f, FontSizeUtils.LARGE_TEXT_SCALE) - 1f) / (FontSizeUtils.LARGE_TEXT_SCALE - 1f);
mTilePaddingTopPx = Math.round((1 - largeFactor) * padding + largeFactor * largePadding);
requestLayout();
|