Measure text in 1 pass
Before we were setting the text again using setText, and this
would trigger a second measure/layout pass, which is unnecessary.
Now we're using the same mesure pass to calculate the view's
best line break.
Fixes: 79714443
Test: manual. set various meeting names animated or static
Change-Id: Ia911fae8f820b703ca385a10211073bae37f3258
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index db03ed2..dfa4bf9 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -28,7 +28,7 @@
android:clipToPadding="false"
android:orientation="vertical"
android:layout_centerHorizontal="true">
- <com.android.systemui.statusbar.AlphaOptimizedTextView
+ <view class="com.android.keyguard.KeyguardSliceView$TitleView"
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index f066e34..f5abd06 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -47,6 +47,7 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.keyguard.KeyguardSliceProvider;
+import com.android.systemui.statusbar.AlphaOptimizedTextView;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
@@ -244,7 +245,7 @@
* @param charSequence Original text.
* @return Optimal string.
*/
- private CharSequence findBestLineBreak(CharSequence charSequence) {
+ private static CharSequence findBestLineBreak(CharSequence charSequence) {
if (TextUtils.isEmpty(charSequence)) {
return charSequence;
}
@@ -370,27 +371,6 @@
mIconSize = mContext.getResources().getDimensionPixelSize(R.dimen.widget_icon_size);
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- // Find best ellipsis strategy for the title.
- // Done on onMeasure since TextView#getLayout needs a measure pass to calculate its bounds.
- Layout layout = mTitle.getLayout();
- if (layout != null) {
- final int lineCount = layout.getLineCount();
- if (lineCount > 0) {
- if (layout.getEllipsisCount(lineCount - 1) == 0) {
- CharSequence title = mTitle.getText();
- CharSequence bestLineBreak = findBestLineBreak(title);
- if (!TextUtils.equals(title, bestLineBreak)) {
- mTitle.setText(bestLineBreak);
- }
- }
- }
- }
- }
-
public void refresh() {
Slice slice = SliceManager.getInstance(getContext()).bindSlice(mKeyguardSliceUri);
onChanged(slice);
@@ -553,6 +533,46 @@
}
}
+ /**
+ * A text view that will split its contents in 2 lines when possible.
+ */
+ static class TitleView extends AlphaOptimizedTextView {
+
+ public TitleView(Context context) {
+ super(context);
+ }
+
+ public TitleView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public TitleView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ Layout layout = getLayout();
+ int lineCount = layout.getLineCount();
+ boolean ellipsizing = layout.getEllipsisCount(lineCount - 1) != 0;
+ if (lineCount > 0 && !ellipsizing) {
+ CharSequence title = getText();
+ CharSequence bestLineBreak = findBestLineBreak(title);
+ if (!TextUtils.equals(title, bestLineBreak)) {
+ setText(bestLineBreak);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+ }
+ }
+
private class SliceViewTransitionListener implements LayoutTransition.TransitionListener {
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view,