From 2a3c3e32194b7ed8c6c7d4d1517db6161c406862 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 5 Jan 2018 17:02:43 -0800 Subject: [PATCH] Keyguard slice layout fixes Fixes a series of line break and text layout issues. Now we have proper text length limit and ellipsize it correctly. Change-Id: Idf915b56ee6ee923ce4f1cc21a0c57ff5d0a99ca Fixes: 71634498 Fixes: 71599239 Fixes: 71476950 Fixes: 71576197 Test: Visual --- .../layout/keyguard_status_area.xml | 2 + .../SystemUI/res-keyguard/values/dimens.xml | 2 +- .../SystemUI/res-keyguard/values/styles.xml | 2 +- .../android/keyguard/KeyguardSliceView.java | 62 ++++++++++++++++++- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml index b154d46f162c5..5e09e754f9a56 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml @@ -32,6 +32,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/widget_vertical_padding" + android:paddingStart="64dp" + android:paddingEnd="64dp" android:theme="@style/TextAppearance.Keyguard" /> 2dp 8dp 16dp - 4dp + 8dp 32dp diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index d50bab533856c..5f52e2ac10a92 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -83,13 +83,13 @@ center end 2 + @*android:string/config_headlineFontFamilyLight diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index b8adb6a91bf28..8135c616d87ec 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -26,6 +26,9 @@ import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.Settings; +import android.text.Layout; +import android.text.TextUtils; +import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.Log; import android.view.View; @@ -40,6 +43,7 @@ import com.android.systemui.R; import com.android.systemui.keyguard.KeyguardSliceProvider; import com.android.systemui.tuner.TunerService; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.function.Consumer; @@ -129,7 +133,20 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe android.app.slice.SliceItem.FORMAT_TEXT, new String[]{android.app.slice.Slice.HINT_TITLE}, null /* nonHints */); - mTitle.setText(mainTitle.getText()); + CharSequence title = mainTitle.getText(); + mTitle.setText(title); + + // Check if we're already ellipsizing the text. + // We're going to figure out the best possible line break if not. + Layout layout = mTitle.getLayout(); + if (layout != null){ + final int lineCount = layout.getLineCount(); + if (lineCount > 0) { + if (layout.getEllipsisCount(lineCount - 1) == 0) { + mTitle.setText(findBestLineBreak(title)); + } + } + } } mClickActions.clear(); @@ -195,6 +212,46 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mListener.accept(mHasHeader); } + /** + * Breaks a string in 2 lines where both have similar character count + * but first line is always longer. + * + * @param charSequence Original text. + * @return Optimal string. + */ + private CharSequence findBestLineBreak(CharSequence charSequence) { + if (TextUtils.isEmpty(charSequence)) { + return charSequence; + } + + String source = charSequence.toString(); + // Ignore if there is only 1 word, + // or if line breaks were manually set. + if (source.contains("\n") || !source.contains(" ")) { + return source; + } + + final String[] words = source.split(" "); + final StringBuilder optimalString = new StringBuilder(source.length()); + int current = 0; + while (optimalString.length() < source.length() - optimalString.length()) { + optimalString.append(words[current]); + if (current < words.length - 1) { + optimalString.append(" "); + } + current++; + } + optimalString.append("\n"); + for (int i = current; i < words.length; i++) { + optimalString.append(words[i]); + if (current < words.length - 1) { + optimalString.append(" "); + } + } + + return optimalString.toString(); + } + public void setDark(float darkAmount) { mDarkAmount = darkAmount; updateTextColors(); @@ -287,6 +344,9 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe setPadding(horizontalPadding, 0, horizontalPadding, 0); setCompoundDrawablePadding((int) context.getResources() .getDimension(R.dimen.widget_icon_padding)); + setMaxWidth(KeyguardSliceView.this.getWidth() / 2); + setMaxLines(1); + setEllipsize(TruncateAt.END); } public void setHasDivider(boolean hasDivider) {