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
This commit is contained in:
Lucas Dupin
2018-05-21 14:41:52 -07:00
parent 402e2a2b6f
commit b9afc96b8f
2 changed files with 43 additions and 23 deletions

View File

@@ -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"

View File

@@ -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,