From 39076ed379c293399292d1c6b799866c1321b44b Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Mon, 30 Jun 2014 20:47:20 -0400 Subject: [PATCH] QS: Improve dual tile labels. Use the solid dropdown caret and improve vertical spacing. Change-Id: I839fb3130a0fc621a2217e5211fb7b4f053a5685 --- .../res/drawable/btn_borderless_rect.xml | 21 +++++ .../res/drawable/qs_dual_tile_caret.xml | 38 ++++---- packages/SystemUI/res/values/dimens.xml | 5 +- packages/SystemUI/res/values/internal.xml | 1 - .../android/systemui/qs/QSDualTileLabel.java | 86 +++++++++++++++---- .../src/com/android/systemui/qs/QSPanel.java | 4 +- .../com/android/systemui/qs/QSTileView.java | 15 ++-- 7 files changed, 125 insertions(+), 45 deletions(-) create mode 100644 packages/SystemUI/res/drawable/btn_borderless_rect.xml diff --git a/packages/SystemUI/res/drawable/btn_borderless_rect.xml b/packages/SystemUI/res/drawable/btn_borderless_rect.xml new file mode 100644 index 0000000000000..52dd40258e4ed --- /dev/null +++ b/packages/SystemUI/res/drawable/btn_borderless_rect.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml b/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml index a3c067bcd2e0f..9137e7f6a0b95 100644 --- a/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml +++ b/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml @@ -1,20 +1,28 @@ - - + + - + + + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 1447849d6ae08..8ee915577102f 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -160,8 +160,9 @@ 12sp 1dp 16dp - 104dp - 4dp + 112dp + 8dp + 6dp 16dp 12dp 16dp diff --git a/packages/SystemUI/res/values/internal.xml b/packages/SystemUI/res/values/internal.xml index 5a19efb2bda68..7b93d318f156d 100644 --- a/packages/SystemUI/res/values/internal.xml +++ b/packages/SystemUI/res/values/internal.xml @@ -18,6 +18,5 @@ @*android:dimen/status_bar_height @*android:dimen/navigation_bar_height @*android:drawable/notification_material_bg - @*android:drawable/spinner_mtrl_am_alpha diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java b/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java index 652676bab5e94..377fcc0eef3ac 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDualTileLabel.java @@ -24,8 +24,12 @@ import android.text.TextUtils.TruncateAt; import android.view.Gravity; import android.view.View; import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; +import com.android.systemui.R; + import java.util.Objects; /** @@ -39,50 +43,77 @@ import java.util.Objects; */ public class QSDualTileLabel extends FrameLayout { - private static final String SPACING_TEXT = " "; - private final Context mContext; private final TextView mFirstLine; + private final ImageView mFirstLineCaret; private final TextView mSecondLine; + private final int mHorizontalPaddingPx; private String mText; public QSDualTileLabel(Context context) { super(context); mContext = context; + + mHorizontalPaddingPx = mContext.getResources() + .getDimensionPixelSize(R.dimen.qs_dual_tile_padding_horizontal); + mFirstLine = initTextView(); + mFirstLine.setPadding(mHorizontalPaddingPx, 0, 0, 0); + final LinearLayout firstLineLayout = new LinearLayout(mContext); + firstLineLayout.setPadding(0, 0, 0, 0); + firstLineLayout.setOrientation(LinearLayout.HORIZONTAL); + firstLineLayout.setClickable(false); + firstLineLayout.setBackground(null); + firstLineLayout.addView(mFirstLine); + mFirstLineCaret = new ImageView(mContext); + mFirstLineCaret.setScaleType(ImageView.ScaleType.MATRIX); + mFirstLineCaret.setClickable(false); + firstLineLayout.addView(mFirstLineCaret); + addView(firstLineLayout, newFrameLayoutParams()); + mSecondLine = initTextView(); + mSecondLine.setPadding(mHorizontalPaddingPx, 0, mHorizontalPaddingPx, 0); mSecondLine.setEllipsize(TruncateAt.END); + mSecondLine.setVisibility(GONE); + addView(mSecondLine, newFrameLayoutParams()); + addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if ((oldRight - oldLeft) != (right - left)) { - updateText(); + rescheduleUpdateText(); } } }); } - public void setFirstLineBackground(Drawable d) { - mFirstLine.setBackground(d); + private static LayoutParams newFrameLayoutParams() { + final LayoutParams lp = + new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.CENTER_HORIZONTAL; + return lp; + } + + public void setFirstLineCaret(Drawable d) { + mFirstLineCaret.setImageDrawable(d); if (d != null) { + final int h = d.getIntrinsicHeight(); final LayoutParams lp = (LayoutParams) mSecondLine.getLayoutParams(); - lp.topMargin = d.getIntrinsicHeight() * 3 / 4; + lp.topMargin = h * 4 / 5; mSecondLine.setLayoutParams(lp); + mFirstLine.setMinHeight(h); } } private TextView initTextView() { final TextView tv = new TextView(mContext); tv.setPadding(0, 0, 0, 0); + tv.setGravity(Gravity.CENTER_VERTICAL); tv.setSingleLine(true); tv.setClickable(false); tv.setBackground(null); - final LayoutParams lp = - new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - lp.gravity = Gravity.CENTER_HORIZONTAL; - addView(tv, lp); return tv; } @@ -90,7 +121,7 @@ public class QSDualTileLabel extends FrameLayout { final String newText = text == null ? null : text.toString().trim(); if (Objects.equals(newText, mText)) return; mText = newText; - updateText(); + rescheduleUpdateText(); } public String getText() { @@ -100,16 +131,24 @@ public class QSDualTileLabel extends FrameLayout { public void setTextSize(int unit, float size) { mFirstLine.setTextSize(unit, size); mSecondLine.setTextSize(unit, size); + rescheduleUpdateText(); } public void setTextColor(int color) { mFirstLine.setTextColor(color); mSecondLine.setTextColor(color); + rescheduleUpdateText(); } public void setTypeface(Typeface tf) { mFirstLine.setTypeface(tf); mSecondLine.setTypeface(tf); + rescheduleUpdateText(); + } + + private void rescheduleUpdateText() { + removeCallbacks(mUpdateText); + post(mUpdateText); } private void updateText() { @@ -117,14 +156,16 @@ public class QSDualTileLabel extends FrameLayout { if (TextUtils.isEmpty(mText)) { mFirstLine.setText(null); mSecondLine.setText(null); + mSecondLine.setVisibility(GONE); return; } - final float maxWidth = getWidth() - mFirstLine.getBackground().getIntrinsicWidth() + final float maxWidth = getWidth() - mFirstLineCaret.getWidth() - mHorizontalPaddingPx - getPaddingLeft() - getPaddingRight(); - float width = mFirstLine.getPaint().measureText(mText + SPACING_TEXT); + float width = mFirstLine.getPaint().measureText(mText); if (width <= maxWidth) { - mFirstLine.setText(mText + SPACING_TEXT); + mFirstLine.setText(mText); mSecondLine.setText(null); + mSecondLine.setVisibility(GONE); return; } final int n = mText.length(); @@ -132,23 +173,32 @@ public class QSDualTileLabel extends FrameLayout { boolean inWhitespace = false; int i = 0; for (i = 1; i < n; i++) { + width = mFirstLine.getPaint().measureText(mText.substring(0, i)); + final boolean done = width > maxWidth; if (Character.isWhitespace(mText.charAt(i))) { - if (!inWhitespace) { + if (!inWhitespace && !done) { lastWordBoundary = i; } inWhitespace = true; } else { inWhitespace = false; } - width = mFirstLine.getPaint().measureText(mText.substring(0, i) + SPACING_TEXT); - if (width > maxWidth) { + if (done) { break; } } if (lastWordBoundary == -1) { lastWordBoundary = i - 1; } - mFirstLine.setText(mText.substring(0, lastWordBoundary) + SPACING_TEXT); + mFirstLine.setText(mText.substring(0, lastWordBoundary)); mSecondLine.setText(mText.substring(lastWordBoundary).trim()); + mSecondLine.setVisibility(VISIBLE); } + + private final Runnable mUpdateText = new Runnable() { + @Override + public void run() { + updateText(); + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index a044bb1c0a624..0720704e78e52 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -48,6 +48,7 @@ public class QSPanel extends ViewGroup { private int mLargeCellWidth; private int mLargeCellHeight; private int mPanelPaddingBottom; + private int mDualTileUnderlap; private boolean mExpanded; private TileRecord mDetailRecord; @@ -82,6 +83,7 @@ public class QSPanel extends ViewGroup { mLargeCellHeight = res.getDimensionPixelSize(R.dimen.qs_dual_tile_height); mLargeCellWidth = (int)(mLargeCellHeight * TILE_ASPECT); mPanelPaddingBottom = res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom); + mDualTileUnderlap = res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical); if (mColumns != columns) { mColumns = columns; postInvalidate(); @@ -243,7 +245,7 @@ public class QSPanel extends ViewGroup { private int getRowTop(int row) { if (row <= 0) return 0; - return mLargeCellHeight + (row - 1) * mCellHeight; + return mLargeCellHeight - mDualTileUnderlap + (row - 1) * mCellHeight; } private int getColumnCount(int row) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java index 062e36cf33198..06cb3183c4c7f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java @@ -26,7 +26,6 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.TypedValue; -import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -50,7 +49,7 @@ public class QSTileView extends ViewGroup { private final int mTileSpacingPx; private final int mTilePaddingTopPx; private final int mTilePaddingBelowIconPx; - private final int mDualTilePaddingBelowDividerPx; + private final int mDualTileVerticalPaddingPx; private TextView mLabel; private QSDualTileLabel mDualLabel; @@ -68,8 +67,8 @@ public class QSTileView extends ViewGroup { mTileSpacingPx = res.getDimensionPixelSize(R.dimen.qs_tile_spacing); mTilePaddingTopPx = res.getDimensionPixelSize(R.dimen.qs_tile_padding_top); mTilePaddingBelowIconPx = res.getDimensionPixelSize(R.dimen.qs_tile_padding_below_icon); - mDualTilePaddingBelowDividerPx = - res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_below_divider); + mDualTileVerticalPaddingPx = + res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical); recreateLabel(); setClipChildren(false); @@ -100,12 +99,12 @@ public class QSTileView extends ViewGroup { } final Resources res = mContext.getResources(); if (mDual) { - final Context c = new ContextThemeWrapper(mContext, R.style.BorderlessButton_Tiny); - mDualLabel = new QSDualTileLabel(c); + mDualLabel = new QSDualTileLabel(mContext); mDualLabel.setId(android.R.id.title); - mDualLabel.setFirstLineBackground(res.getDrawable(R.drawable.qs_dual_tile_caret)); + 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, mDualTilePaddingBelowDividerPx, 0, 0); + mDualLabel.setPadding(0, mDualTileVerticalPaddingPx, 0, mDualTileVerticalPaddingPx); mDualLabel.setTypeface(CONDENSED); mDualLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, res.getDimensionPixelSize(R.dimen.qs_tile_text_size));