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));