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:
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user