diff options
author | Lucas Dupin <dupin@google.com> | 2018-05-21 14:41:52 -0700 |
---|---|---|
committer | Lucas Dupin <dupin@google.com> | 2018-05-21 15:09:34 -0700 |
commit | b9afc96b8fb7549913e165e03ed79af8a5a40884 (patch) | |
tree | b308cfb1d58d56f85828c7022755782609db29a3 /packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java | |
parent | 402e2a2b6f47ca955db084255d642e9f3765e4eb (diff) |
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
Diffstat (limited to 'packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java')
-rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index f066e3401752..f5abd0631892 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.Dependency; 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 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * @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 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe 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 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe } } + /** + * 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, |