diff options
author | Setup Wizard Team <android-setup-team-eng@google.com> | 2022-11-10 08:18:56 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-11-10 08:18:56 +0000 |
commit | e9e6510aff3e15cd7ca9604f4f64e98f7444c4f9 (patch) | |
tree | 38f1d3266931b2871ddcb691fb34480fc8d69150 | |
parent | 6f5bbe475f6f8091975b7c4e21712b2c8d0dc78d (diff) | |
parent | 8eaf9f561495947663d69c63cdd4c6d24d16b503 (diff) | |
download | setupdesign-e9e6510aff3e15cd7ca9604f4f64e98f7444c4f9.tar.gz |
Import updated Android Setupdesign Library 486625452 am: 8eaf9f5614
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/setupdesign/+/20409807
Change-Id: If75d3de42e85ca6396676093eff2253b39513b8b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | main/src/com/google/android/setupdesign/template/HeaderMixin.java | 92 |
1 files changed, 67 insertions, 25 deletions
diff --git a/main/src/com/google/android/setupdesign/template/HeaderMixin.java b/main/src/com/google/android/setupdesign/template/HeaderMixin.java index 814f873..2a6114d 100644 --- a/main/src/com/google/android/setupdesign/template/HeaderMixin.java +++ b/main/src/com/google/android/setupdesign/template/HeaderMixin.java @@ -27,6 +27,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.AttrRes; @@ -42,6 +43,7 @@ import com.google.android.setupdesign.util.HeaderAreaStyler; import com.google.android.setupdesign.util.LayoutStyler; import com.google.android.setupdesign.util.PartnerStyleHelper; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.ArrayList; /** * A {@link com.google.android.setupcompat.template.Mixin} for setting and getting the header text. @@ -54,7 +56,10 @@ public class HeaderMixin implements Mixin { private float headerAutoSizeMinTextSizeInPx; private float headerAutoSizeLineExtraSpacingInPx; private int headerAutoSizeMaxLineOfMaxSize; + private float defaultTextSize = 0; + private int defaultLineHeight = 0; private static final int AUTO_SIZE_DEFAULT_MAX_LINES = 6; + ArrayList<OnPreDrawListener> titlePreDrawListeners = new ArrayList<>(); /** * A {@link com.google.android.setupcompat.template.Mixin} for setting and getting the Header. @@ -78,8 +83,11 @@ public class HeaderMixin implements Mixin { a.getColorStateList(R.styleable.SucHeaderMixin_sucHeaderTextColor); a.recycle(); - - // Try to update the flag of the uto size config settings + if (getTextView() != null) { + defaultTextSize = getTextView().getTextSize(); + defaultLineHeight = getTextView().getLineHeight(); + } + // Try to update the flag of the auto size config settings tryUpdateAutoTextSizeFlagWithPartnerConfig(); // Set the header text @@ -109,7 +117,11 @@ public class HeaderMixin implements Mixin { if (!autoTextSizeEnabled) { return; } + tryUpdateAutoTextConfigWithPartnerConfig(); + } + private void tryUpdateAutoTextConfigWithPartnerConfig() { + Context context = templateLayout.getContext(); if (PartnerConfigHelper.get(context) .isPartnerConfigAvailable(PartnerConfig.CONFIG_HEADER_AUTO_SIZE_MAX_TEXT_SIZE)) { headerAutoSizeMaxTextSizeInPx = @@ -207,36 +219,66 @@ public class HeaderMixin implements Mixin { } // preset as the max size titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMaxTextSizeInPx); + defaultTextSize = titleView.getTextSize(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { titleView.setLineHeight( Math.round(headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMaxTextSizeInPx)); + defaultLineHeight = titleView.getLineHeight(); } titleView.setMaxLines(AUTO_SIZE_DEFAULT_MAX_LINES); - // reset text size if the line count for max text size > headerAutoSizeMaxLineOfMaxTextSize - titleView - .getViewTreeObserver() - .addOnPreDrawListener( - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - // Remove listener to avoid this called every frame - titleView.getViewTreeObserver().removeOnPreDrawListener(this); - int lineCount = titleView.getLineCount(); - if (lineCount > headerAutoSizeMaxLineOfMaxSize) { - // reset text size - titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMinTextSizeInPx); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - titleView.setLineHeight( - Math.round( - headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMinTextSizeInPx)); - } - titleView.invalidate(); - return false; // false to skip this frame - } - return true; + OnPreDrawListener titlePreDrawListener = + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + // Remove listener to avoid this called every frame + titleView.getViewTreeObserver().removeOnPreDrawListener(this); + int lineCount = titleView.getLineCount(); + if (lineCount > headerAutoSizeMaxLineOfMaxSize) { + // reset text size + titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerAutoSizeMinTextSizeInPx); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + titleView.setLineHeight( + Math.round(headerAutoSizeLineExtraSpacingInPx + headerAutoSizeMinTextSizeInPx)); } - }); + titleView.invalidate(); + return false; // false to skip this frame + } + return true; + } + }; + titleView.getViewTreeObserver().addOnPreDrawListener(titlePreDrawListener); + titlePreDrawListeners.add(titlePreDrawListener); + } + + private void resetTextSize(TextView titleView) { + if (titleView == null) { + return; + } + titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultTextSize); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + titleView.setLineHeight(defaultLineHeight); + } + for (OnPreDrawListener titlePreDrawListener : titlePreDrawListeners) { + titleView.getViewTreeObserver().removeOnPreDrawListener(titlePreDrawListener); + } + titlePreDrawListeners.clear(); + } + + /** + * Enable or disable the auto size for header string. Which will adjust the font size of header + * string to fit the limitation of headerAutoSizeMaxLineOfMaxSize. + */ + public void setAutoTextSizeEnabled(boolean autoTextSizeEnabled) { + this.autoTextSizeEnabled = autoTextSizeEnabled; + if (autoTextSizeEnabled) { + tryUpdateAutoTextConfigWithPartnerConfig(); + if (autoTextSizeEnabled) { + autoAdjustTextSize(getTextView()); + } + } else { + resetTextSize(getTextView()); + } } /** Returns the current header text. */ |