package com.google.android.material.internal; import android.animation.TimeInterpolator; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; import android.util.Log; import android.view.View; import androidx.core.math.MathUtils; import androidx.core.text.TextDirectionHeuristicCompat; import androidx.core.text.TextDirectionHeuristicsCompat; import androidx.core.util.Preconditions; import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; import com.google.android.material.animation.AnimationUtils; import com.google.android.material.color.MaterialColors; import com.google.android.material.internal.StaticLayoutBuilderCompat; import com.google.android.material.resources.CancelableFontCallback; import com.google.android.material.resources.TextAppearance; import com.google.android.material.resources.TypefaceUtils; /* loaded from: classes2.dex */ public final class CollapsingTextHelper { private static final boolean DEBUG_DRAW = false; private static final String ELLIPSIS_NORMAL = "…"; private static final float FADE_MODE_THRESHOLD_FRACTION_RELATIVE = 0.5f; private static final String TAG = "CollapsingTextHelper"; private boolean boundsChanged; private final Rect collapsedBounds; private float collapsedDrawX; private float collapsedDrawY; private CancelableFontCallback collapsedFontCallback; private float collapsedLetterSpacing; private ColorStateList collapsedShadowColor; private float collapsedShadowDx; private float collapsedShadowDy; private float collapsedShadowRadius; private float collapsedTextBlend; private ColorStateList collapsedTextColor; private float collapsedTextWidth; private Typeface collapsedTypeface; private Typeface collapsedTypefaceBold; private Typeface collapsedTypefaceDefault; private final RectF currentBounds; private float currentDrawX; private float currentDrawY; private float currentLetterSpacing; private int currentOffsetY; private int currentShadowColor; private float currentShadowDx; private float currentShadowDy; private float currentShadowRadius; private float currentTextSize; private Typeface currentTypeface; private final Rect expandedBounds; private float expandedDrawX; private float expandedDrawY; private CancelableFontCallback expandedFontCallback; private float expandedFraction; private float expandedLetterSpacing; private int expandedLineCount; private ColorStateList expandedShadowColor; private float expandedShadowDx; private float expandedShadowDy; private float expandedShadowRadius; private float expandedTextBlend; private ColorStateList expandedTextColor; private Bitmap expandedTitleTexture; private Typeface expandedTypeface; private Typeface expandedTypefaceBold; private Typeface expandedTypefaceDefault; private boolean fadeModeEnabled; private float fadeModeStartFraction; private float fadeModeThresholdFraction; private boolean isRtl; private TimeInterpolator positionInterpolator; private float scale; private int[] state; private StaticLayoutBuilderConfigurer staticLayoutBuilderConfigurer; private CharSequence text; private StaticLayout textLayout; private final TextPaint textPaint; private TimeInterpolator textSizeInterpolator; private CharSequence textToDraw; private CharSequence textToDrawCollapsed; private Paint texturePaint; private final TextPaint tmpPaint; private boolean useTexture; private final View view; private static final boolean USE_SCALING_TEXTURE = false; private static final Paint DEBUG_DRAW_PAINT = null; private int expandedTextGravity = 16; private int collapsedTextGravity = 16; private float expandedTextSize = 15.0f; private float collapsedTextSize = 15.0f; private TextUtils.TruncateAt titleTextEllipsize = TextUtils.TruncateAt.END; private boolean isRtlTextDirectionHeuristicsEnabled = true; private int maxLines = 1; private float lineSpacingAdd = 0.0f; private float lineSpacingMultiplier = 1.0f; private int hyphenationFrequency = StaticLayoutBuilderCompat.DEFAULT_HYPHENATION_FREQUENCY; private float calculateFadeModeThresholdFraction() { float f = this.fadeModeStartFraction; return f + ((1.0f - f) * 0.5f); } private boolean shouldDrawMultiline() { return this.maxLines > 1 && (!this.isRtl || this.fadeModeEnabled) && !this.useTexture; } public ColorStateList getCollapsedTextColor() { return this.collapsedTextColor; } public int getCollapsedTextGravity() { return this.collapsedTextGravity; } public float getCollapsedTextSize() { return this.collapsedTextSize; } public int getExpandedLineCount() { return this.expandedLineCount; } public ColorStateList getExpandedTextColor() { return this.expandedTextColor; } public int getExpandedTextGravity() { return this.expandedTextGravity; } public float getExpandedTextSize() { return this.expandedTextSize; } public float getExpansionFraction() { return this.expandedFraction; } public float getFadeModeThresholdFraction() { return this.fadeModeThresholdFraction; } public int getHyphenationFrequency() { return this.hyphenationFrequency; } public int getMaxLines() { return this.maxLines; } public TimeInterpolator getPositionInterpolator() { return this.positionInterpolator; } public CharSequence getText() { return this.text; } public TextUtils.TruncateAt getTitleTextEllipsize() { return this.titleTextEllipsize; } public boolean isRtlTextDirectionHeuristicsEnabled() { return this.isRtlTextDirectionHeuristicsEnabled; } public void setCurrentOffsetY(int i) { this.currentOffsetY = i; } public void setFadeModeEnabled(boolean z) { this.fadeModeEnabled = z; } public void setHyphenationFrequency(int i) { this.hyphenationFrequency = i; } public void setLineSpacingAdd(float f) { this.lineSpacingAdd = f; } public void setLineSpacingMultiplier(float f) { this.lineSpacingMultiplier = f; } public void setRtlTextDirectionHeuristicsEnabled(boolean z) { this.isRtlTextDirectionHeuristicsEnabled = z; } public CollapsingTextHelper(View view) { this.view = view; TextPaint textPaint = new TextPaint(129); this.textPaint = textPaint; this.tmpPaint = new TextPaint(textPaint); this.collapsedBounds = new Rect(); this.expandedBounds = new Rect(); this.currentBounds = new RectF(); this.fadeModeThresholdFraction = calculateFadeModeThresholdFraction(); maybeUpdateFontWeightAdjustment(view.getContext().getResources().getConfiguration()); } public void setTextSizeInterpolator(TimeInterpolator timeInterpolator) { this.textSizeInterpolator = timeInterpolator; recalculate(); } public void setPositionInterpolator(TimeInterpolator timeInterpolator) { this.positionInterpolator = timeInterpolator; recalculate(); } public void setExpandedTextSize(float f) { if (this.expandedTextSize != f) { this.expandedTextSize = f; recalculate(); } } public void setCollapsedTextSize(float f) { if (this.collapsedTextSize != f) { this.collapsedTextSize = f; recalculate(); } } public void setCollapsedTextColor(ColorStateList colorStateList) { if (this.collapsedTextColor != colorStateList) { this.collapsedTextColor = colorStateList; recalculate(); } } public void setExpandedTextColor(ColorStateList colorStateList) { if (this.expandedTextColor != colorStateList) { this.expandedTextColor = colorStateList; recalculate(); } } public void setCollapsedAndExpandedTextColor(ColorStateList colorStateList) { if (this.collapsedTextColor == colorStateList && this.expandedTextColor == colorStateList) { return; } this.collapsedTextColor = colorStateList; this.expandedTextColor = colorStateList; recalculate(); } public void setExpandedLetterSpacing(float f) { if (this.expandedLetterSpacing != f) { this.expandedLetterSpacing = f; recalculate(); } } public void setExpandedBounds(int i, int i2, int i3, int i4) { if (rectEquals(this.expandedBounds, i, i2, i3, i4)) { return; } this.expandedBounds.set(i, i2, i3, i4); this.boundsChanged = true; } public void setExpandedBounds(Rect rect) { setExpandedBounds(rect.left, rect.top, rect.right, rect.bottom); } public void setCollapsedBounds(int i, int i2, int i3, int i4) { if (rectEquals(this.collapsedBounds, i, i2, i3, i4)) { return; } this.collapsedBounds.set(i, i2, i3, i4); this.boundsChanged = true; } public void setCollapsedBounds(Rect rect) { setCollapsedBounds(rect.left, rect.top, rect.right, rect.bottom); } public void getCollapsedTextActualBounds(RectF rectF, int i, int i2) { this.isRtl = calculateIsRtl(this.text); rectF.left = Math.max(getCollapsedTextLeftBound(i, i2), this.collapsedBounds.left); rectF.top = this.collapsedBounds.top; rectF.right = Math.min(getCollapsedTextRightBound(rectF, i, i2), this.collapsedBounds.right); rectF.bottom = this.collapsedBounds.top + getCollapsedTextHeight(); } private float getCollapsedTextLeftBound(int i, int i2) { return (i2 == 17 || (i2 & 7) == 1) ? (i / 2.0f) - (this.collapsedTextWidth / 2.0f) : ((i2 & GravityCompat.END) == 8388613 || (i2 & 5) == 5) ? this.isRtl ? this.collapsedBounds.left : this.collapsedBounds.right - this.collapsedTextWidth : this.isRtl ? this.collapsedBounds.right - this.collapsedTextWidth : this.collapsedBounds.left; } private float getCollapsedTextRightBound(RectF rectF, int i, int i2) { if (i2 == 17 || (i2 & 7) == 1) { return (i / 2.0f) + (this.collapsedTextWidth / 2.0f); } if ((i2 & GravityCompat.END) == 8388613 || (i2 & 5) == 5) { return this.isRtl ? rectF.left + this.collapsedTextWidth : this.collapsedBounds.right; } if (this.isRtl) { return this.collapsedBounds.right; } return this.collapsedTextWidth + rectF.left; } public float getExpandedTextHeight() { getTextPaintExpanded(this.tmpPaint); return -this.tmpPaint.ascent(); } public float getExpandedTextFullHeight() { getTextPaintExpanded(this.tmpPaint); return (-this.tmpPaint.ascent()) + this.tmpPaint.descent(); } public float getCollapsedTextHeight() { getTextPaintCollapsed(this.tmpPaint); return -this.tmpPaint.ascent(); } public void setFadeModeStartFraction(float f) { this.fadeModeStartFraction = f; this.fadeModeThresholdFraction = calculateFadeModeThresholdFraction(); } private void getTextPaintExpanded(TextPaint textPaint) { textPaint.setTextSize(this.expandedTextSize); textPaint.setTypeface(this.expandedTypeface); textPaint.setLetterSpacing(this.expandedLetterSpacing); } private void getTextPaintCollapsed(TextPaint textPaint) { textPaint.setTextSize(this.collapsedTextSize); textPaint.setTypeface(this.collapsedTypeface); textPaint.setLetterSpacing(this.collapsedLetterSpacing); } public void setExpandedTextGravity(int i) { if (this.expandedTextGravity != i) { this.expandedTextGravity = i; recalculate(); } } public void setCollapsedTextGravity(int i) { if (this.collapsedTextGravity != i) { this.collapsedTextGravity = i; recalculate(); } } public void setCollapsedTextAppearance(int i) { TextAppearance textAppearance = new TextAppearance(this.view.getContext(), i); if (textAppearance.getTextColor() != null) { this.collapsedTextColor = textAppearance.getTextColor(); } if (textAppearance.getTextSize() != 0.0f) { this.collapsedTextSize = textAppearance.getTextSize(); } if (textAppearance.shadowColor != null) { this.collapsedShadowColor = textAppearance.shadowColor; } this.collapsedShadowDx = textAppearance.shadowDx; this.collapsedShadowDy = textAppearance.shadowDy; this.collapsedShadowRadius = textAppearance.shadowRadius; this.collapsedLetterSpacing = textAppearance.letterSpacing; CancelableFontCallback cancelableFontCallback = this.collapsedFontCallback; if (cancelableFontCallback != null) { cancelableFontCallback.cancel(); } this.collapsedFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() { // from class: com.google.android.material.internal.CollapsingTextHelper.1 @Override // com.google.android.material.resources.CancelableFontCallback.ApplyFont public void apply(Typeface typeface) { CollapsingTextHelper.this.setCollapsedTypeface(typeface); } }, textAppearance.getFallbackFont()); textAppearance.getFontAsync(this.view.getContext(), this.collapsedFontCallback); recalculate(); } public void setExpandedTextAppearance(int i) { TextAppearance textAppearance = new TextAppearance(this.view.getContext(), i); if (textAppearance.getTextColor() != null) { this.expandedTextColor = textAppearance.getTextColor(); } if (textAppearance.getTextSize() != 0.0f) { this.expandedTextSize = textAppearance.getTextSize(); } if (textAppearance.shadowColor != null) { this.expandedShadowColor = textAppearance.shadowColor; } this.expandedShadowDx = textAppearance.shadowDx; this.expandedShadowDy = textAppearance.shadowDy; this.expandedShadowRadius = textAppearance.shadowRadius; this.expandedLetterSpacing = textAppearance.letterSpacing; CancelableFontCallback cancelableFontCallback = this.expandedFontCallback; if (cancelableFontCallback != null) { cancelableFontCallback.cancel(); } this.expandedFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() { // from class: com.google.android.material.internal.CollapsingTextHelper.2 @Override // com.google.android.material.resources.CancelableFontCallback.ApplyFont public void apply(Typeface typeface) { CollapsingTextHelper.this.setExpandedTypeface(typeface); } }, textAppearance.getFallbackFont()); textAppearance.getFontAsync(this.view.getContext(), this.expandedFontCallback); recalculate(); } public void setTitleTextEllipsize(TextUtils.TruncateAt truncateAt) { this.titleTextEllipsize = truncateAt; recalculate(); } public void setCollapsedTypeface(Typeface typeface) { if (setCollapsedTypefaceInternal(typeface)) { recalculate(); } } public void setExpandedTypeface(Typeface typeface) { if (setExpandedTypefaceInternal(typeface)) { recalculate(); } } public void setTypefaces(Typeface typeface) { boolean collapsedTypefaceInternal = setCollapsedTypefaceInternal(typeface); boolean expandedTypefaceInternal = setExpandedTypefaceInternal(typeface); if (collapsedTypefaceInternal || expandedTypefaceInternal) { recalculate(); } } private boolean setCollapsedTypefaceInternal(Typeface typeface) { CancelableFontCallback cancelableFontCallback = this.collapsedFontCallback; if (cancelableFontCallback != null) { cancelableFontCallback.cancel(); } if (this.collapsedTypefaceDefault == typeface) { return false; } this.collapsedTypefaceDefault = typeface; Typeface maybeCopyWithFontWeightAdjustment = TypefaceUtils.maybeCopyWithFontWeightAdjustment(this.view.getContext().getResources().getConfiguration(), typeface); this.collapsedTypefaceBold = maybeCopyWithFontWeightAdjustment; if (maybeCopyWithFontWeightAdjustment == null) { maybeCopyWithFontWeightAdjustment = this.collapsedTypefaceDefault; } this.collapsedTypeface = maybeCopyWithFontWeightAdjustment; return true; } private boolean setExpandedTypefaceInternal(Typeface typeface) { CancelableFontCallback cancelableFontCallback = this.expandedFontCallback; if (cancelableFontCallback != null) { cancelableFontCallback.cancel(); } if (this.expandedTypefaceDefault == typeface) { return false; } this.expandedTypefaceDefault = typeface; Typeface maybeCopyWithFontWeightAdjustment = TypefaceUtils.maybeCopyWithFontWeightAdjustment(this.view.getContext().getResources().getConfiguration(), typeface); this.expandedTypefaceBold = maybeCopyWithFontWeightAdjustment; if (maybeCopyWithFontWeightAdjustment == null) { maybeCopyWithFontWeightAdjustment = this.expandedTypefaceDefault; } this.expandedTypeface = maybeCopyWithFontWeightAdjustment; return true; } public Typeface getCollapsedTypeface() { Typeface typeface = this.collapsedTypeface; return typeface != null ? typeface : Typeface.DEFAULT; } public Typeface getExpandedTypeface() { Typeface typeface = this.expandedTypeface; return typeface != null ? typeface : Typeface.DEFAULT; } public void maybeUpdateFontWeightAdjustment(Configuration configuration) { Typeface typeface = this.collapsedTypefaceDefault; if (typeface != null) { this.collapsedTypefaceBold = TypefaceUtils.maybeCopyWithFontWeightAdjustment(configuration, typeface); } Typeface typeface2 = this.expandedTypefaceDefault; if (typeface2 != null) { this.expandedTypefaceBold = TypefaceUtils.maybeCopyWithFontWeightAdjustment(configuration, typeface2); } Typeface typeface3 = this.collapsedTypefaceBold; if (typeface3 == null) { typeface3 = this.collapsedTypefaceDefault; } this.collapsedTypeface = typeface3; Typeface typeface4 = this.expandedTypefaceBold; if (typeface4 == null) { typeface4 = this.expandedTypefaceDefault; } this.expandedTypeface = typeface4; recalculate(true); } public void setExpansionFraction(float f) { float clamp = MathUtils.clamp(f, 0.0f, 1.0f); if (clamp != this.expandedFraction) { this.expandedFraction = clamp; calculateCurrentOffsets(); } } public final boolean setState(int[] iArr) { this.state = iArr; if (!isStateful()) { return false; } recalculate(); return true; } public final boolean isStateful() { ColorStateList colorStateList; ColorStateList colorStateList2 = this.collapsedTextColor; return (colorStateList2 != null && colorStateList2.isStateful()) || ((colorStateList = this.expandedTextColor) != null && colorStateList.isStateful()); } private void calculateCurrentOffsets() { calculateOffsets(this.expandedFraction); } private void calculateOffsets(float f) { float f2; interpolateBounds(f); if (!this.fadeModeEnabled) { this.currentDrawX = lerp(this.expandedDrawX, this.collapsedDrawX, f, this.positionInterpolator); this.currentDrawY = lerp(this.expandedDrawY, this.collapsedDrawY, f, this.positionInterpolator); setInterpolatedTextSize(f); f2 = f; } else if (f < this.fadeModeThresholdFraction) { this.currentDrawX = this.expandedDrawX; this.currentDrawY = this.expandedDrawY; setInterpolatedTextSize(0.0f); f2 = 0.0f; } else { this.currentDrawX = this.collapsedDrawX; this.currentDrawY = this.collapsedDrawY - Math.max(0, this.currentOffsetY); setInterpolatedTextSize(1.0f); f2 = 1.0f; } setCollapsedTextBlend(1.0f - lerp(0.0f, 1.0f, 1.0f - f, AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR)); setExpandedTextBlend(lerp(1.0f, 0.0f, f, AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR)); if (this.collapsedTextColor != this.expandedTextColor) { this.textPaint.setColor(blendARGB(getCurrentExpandedTextColor(), getCurrentCollapsedTextColor(), f2)); } else { this.textPaint.setColor(getCurrentCollapsedTextColor()); } float f3 = this.collapsedLetterSpacing; float f4 = this.expandedLetterSpacing; if (f3 != f4) { this.textPaint.setLetterSpacing(lerp(f4, f3, f, AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR)); } else { this.textPaint.setLetterSpacing(f3); } this.currentShadowRadius = lerp(this.expandedShadowRadius, this.collapsedShadowRadius, f, null); this.currentShadowDx = lerp(this.expandedShadowDx, this.collapsedShadowDx, f, null); this.currentShadowDy = lerp(this.expandedShadowDy, this.collapsedShadowDy, f, null); int blendARGB = blendARGB(getCurrentColor(this.expandedShadowColor), getCurrentColor(this.collapsedShadowColor), f); this.currentShadowColor = blendARGB; this.textPaint.setShadowLayer(this.currentShadowRadius, this.currentShadowDx, this.currentShadowDy, blendARGB); if (this.fadeModeEnabled) { this.textPaint.setAlpha((int) (calculateFadeModeTextAlpha(f) * this.textPaint.getAlpha())); } ViewCompat.postInvalidateOnAnimation(this.view); } private float calculateFadeModeTextAlpha(float f) { float f2 = this.fadeModeThresholdFraction; if (f <= f2) { return AnimationUtils.lerp(1.0f, 0.0f, this.fadeModeStartFraction, f2, f); } return AnimationUtils.lerp(0.0f, 1.0f, f2, 1.0f, f); } private int getCurrentExpandedTextColor() { return getCurrentColor(this.expandedTextColor); } public int getCurrentCollapsedTextColor() { return getCurrentColor(this.collapsedTextColor); } private int getCurrentColor(ColorStateList colorStateList) { if (colorStateList == null) { return 0; } int[] iArr = this.state; if (iArr != null) { return colorStateList.getColorForState(iArr, 0); } return colorStateList.getDefaultColor(); } private void calculateBaseOffsets(boolean z) { StaticLayout staticLayout; calculateUsingTextSize(1.0f, z); CharSequence charSequence = this.textToDraw; if (charSequence != null && (staticLayout = this.textLayout) != null) { this.textToDrawCollapsed = TextUtils.ellipsize(charSequence, this.textPaint, staticLayout.getWidth(), this.titleTextEllipsize); } CharSequence charSequence2 = this.textToDrawCollapsed; float f = 0.0f; if (charSequence2 != null) { this.collapsedTextWidth = measureTextWidth(this.textPaint, charSequence2); } else { this.collapsedTextWidth = 0.0f; } int absoluteGravity = GravityCompat.getAbsoluteGravity(this.collapsedTextGravity, this.isRtl ? 1 : 0); int i = absoluteGravity & 112; if (i == 48) { this.collapsedDrawY = this.collapsedBounds.top; } else if (i == 80) { this.collapsedDrawY = this.collapsedBounds.bottom + this.textPaint.ascent(); } else { this.collapsedDrawY = this.collapsedBounds.centerY() - ((this.textPaint.descent() - this.textPaint.ascent()) / 2.0f); } int i2 = absoluteGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; if (i2 == 1) { this.collapsedDrawX = this.collapsedBounds.centerX() - (this.collapsedTextWidth / 2.0f); } else if (i2 == 5) { this.collapsedDrawX = this.collapsedBounds.right - this.collapsedTextWidth; } else { this.collapsedDrawX = this.collapsedBounds.left; } calculateUsingTextSize(0.0f, z); float height = this.textLayout != null ? r10.getHeight() : 0.0f; StaticLayout staticLayout2 = this.textLayout; if (staticLayout2 == null || this.maxLines <= 1) { CharSequence charSequence3 = this.textToDraw; if (charSequence3 != null) { f = measureTextWidth(this.textPaint, charSequence3); } } else { f = staticLayout2.getWidth(); } StaticLayout staticLayout3 = this.textLayout; this.expandedLineCount = staticLayout3 != null ? staticLayout3.getLineCount() : 0; int absoluteGravity2 = GravityCompat.getAbsoluteGravity(this.expandedTextGravity, this.isRtl ? 1 : 0); int i3 = absoluteGravity2 & 112; if (i3 == 48) { this.expandedDrawY = this.expandedBounds.top; } else if (i3 != 80) { this.expandedDrawY = this.expandedBounds.centerY() - (height / 2.0f); } else { this.expandedDrawY = (this.expandedBounds.bottom - height) + this.textPaint.descent(); } int i4 = absoluteGravity2 & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK; if (i4 == 1) { this.expandedDrawX = this.expandedBounds.centerX() - (f / 2.0f); } else if (i4 == 5) { this.expandedDrawX = this.expandedBounds.right - f; } else { this.expandedDrawX = this.expandedBounds.left; } clearTexture(); setInterpolatedTextSize(this.expandedFraction); } private float measureTextWidth(TextPaint textPaint, CharSequence charSequence) { return textPaint.measureText(charSequence, 0, charSequence.length()); } private void interpolateBounds(float f) { if (this.fadeModeEnabled) { this.currentBounds.set(f < this.fadeModeThresholdFraction ? this.expandedBounds : this.collapsedBounds); return; } this.currentBounds.left = lerp(this.expandedBounds.left, this.collapsedBounds.left, f, this.positionInterpolator); this.currentBounds.top = lerp(this.expandedDrawY, this.collapsedDrawY, f, this.positionInterpolator); this.currentBounds.right = lerp(this.expandedBounds.right, this.collapsedBounds.right, f, this.positionInterpolator); this.currentBounds.bottom = lerp(this.expandedBounds.bottom, this.collapsedBounds.bottom, f, this.positionInterpolator); } private void setCollapsedTextBlend(float f) { this.collapsedTextBlend = f; ViewCompat.postInvalidateOnAnimation(this.view); } private void setExpandedTextBlend(float f) { this.expandedTextBlend = f; ViewCompat.postInvalidateOnAnimation(this.view); } public void draw(Canvas canvas) { int save = canvas.save(); if (this.textToDraw == null || this.currentBounds.width() <= 0.0f || this.currentBounds.height() <= 0.0f) { return; } this.textPaint.setTextSize(this.currentTextSize); float f = this.currentDrawX; float f2 = this.currentDrawY; boolean z = this.useTexture && this.expandedTitleTexture != null; float f3 = this.scale; if (f3 != 1.0f && !this.fadeModeEnabled) { canvas.scale(f3, f3, f, f2); } if (z) { canvas.drawBitmap(this.expandedTitleTexture, f, f2, this.texturePaint); canvas.restoreToCount(save); return; } if (shouldDrawMultiline() && (!this.fadeModeEnabled || this.expandedFraction > this.fadeModeThresholdFraction)) { drawMultilineTransition(canvas, this.currentDrawX - this.textLayout.getLineStart(0), f2); } else { canvas.translate(f, f2); this.textLayout.draw(canvas); } canvas.restoreToCount(save); } private void drawMultilineTransition(Canvas canvas, float f, float f2) { int alpha = this.textPaint.getAlpha(); canvas.translate(f, f2); if (!this.fadeModeEnabled) { this.textPaint.setAlpha((int) (this.expandedTextBlend * alpha)); TextPaint textPaint = this.textPaint; textPaint.setShadowLayer(this.currentShadowRadius, this.currentShadowDx, this.currentShadowDy, MaterialColors.compositeARGBWithAlpha(this.currentShadowColor, textPaint.getAlpha())); this.textLayout.draw(canvas); } if (!this.fadeModeEnabled) { this.textPaint.setAlpha((int) (this.collapsedTextBlend * alpha)); } TextPaint textPaint2 = this.textPaint; textPaint2.setShadowLayer(this.currentShadowRadius, this.currentShadowDx, this.currentShadowDy, MaterialColors.compositeARGBWithAlpha(this.currentShadowColor, textPaint2.getAlpha())); int lineBaseline = this.textLayout.getLineBaseline(0); CharSequence charSequence = this.textToDrawCollapsed; float f3 = lineBaseline; canvas.drawText(charSequence, 0, charSequence.length(), 0.0f, f3, this.textPaint); this.textPaint.setShadowLayer(this.currentShadowRadius, this.currentShadowDx, this.currentShadowDy, this.currentShadowColor); if (this.fadeModeEnabled) { return; } String trim = this.textToDrawCollapsed.toString().trim(); if (trim.endsWith(ELLIPSIS_NORMAL)) { trim = trim.substring(0, trim.length() - 1); } String str = trim; this.textPaint.setAlpha(alpha); canvas.drawText(str, 0, Math.min(this.textLayout.getLineEnd(0), str.length()), 0.0f, f3, (Paint) this.textPaint); } private boolean calculateIsRtl(CharSequence charSequence) { boolean isDefaultIsRtl = isDefaultIsRtl(); return this.isRtlTextDirectionHeuristicsEnabled ? isTextDirectionHeuristicsIsRtl(charSequence, isDefaultIsRtl) : isDefaultIsRtl; } private boolean isDefaultIsRtl() { return ViewCompat.getLayoutDirection(this.view) == 1; } private boolean isTextDirectionHeuristicsIsRtl(CharSequence charSequence, boolean z) { TextDirectionHeuristicCompat textDirectionHeuristicCompat; if (z) { textDirectionHeuristicCompat = TextDirectionHeuristicsCompat.FIRSTSTRONG_RTL; } else { textDirectionHeuristicCompat = TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR; } return textDirectionHeuristicCompat.isRtl(charSequence, 0, charSequence.length()); } private void setInterpolatedTextSize(float f) { calculateUsingTextSize(f); boolean z = USE_SCALING_TEXTURE && this.scale != 1.0f; this.useTexture = z; if (z) { ensureExpandedTexture(); } ViewCompat.postInvalidateOnAnimation(this.view); } private void calculateUsingTextSize(float f) { calculateUsingTextSize(f, false); } private void calculateUsingTextSize(float f, boolean z) { float f2; float f3; Typeface typeface; if (this.text == null) { return; } float width = this.collapsedBounds.width(); float width2 = this.expandedBounds.width(); if (isClose(f, 1.0f)) { f2 = this.collapsedTextSize; f3 = this.collapsedLetterSpacing; this.scale = 1.0f; typeface = this.collapsedTypeface; } else { float f4 = this.expandedTextSize; float f5 = this.expandedLetterSpacing; Typeface typeface2 = this.expandedTypeface; if (isClose(f, 0.0f)) { this.scale = 1.0f; } else { this.scale = lerp(this.expandedTextSize, this.collapsedTextSize, f, this.textSizeInterpolator) / this.expandedTextSize; } float f6 = this.collapsedTextSize / this.expandedTextSize; width = (z || this.fadeModeEnabled || width2 * f6 <= width) ? width2 : Math.min(width / f6, width2); f2 = f4; f3 = f5; typeface = typeface2; } if (width > 0.0f) { boolean z2 = this.currentTextSize != f2; boolean z3 = this.currentLetterSpacing != f3; boolean z4 = this.currentTypeface != typeface; StaticLayout staticLayout = this.textLayout; boolean z5 = z2 || z3 || (staticLayout != null && (width > ((float) staticLayout.getWidth()) ? 1 : (width == ((float) staticLayout.getWidth()) ? 0 : -1)) != 0) || z4 || this.boundsChanged; this.currentTextSize = f2; this.currentLetterSpacing = f3; this.currentTypeface = typeface; this.boundsChanged = false; this.textPaint.setLinearText(this.scale != 1.0f); r5 = z5; } if (this.textToDraw == null || r5) { this.textPaint.setTextSize(this.currentTextSize); this.textPaint.setTypeface(this.currentTypeface); this.textPaint.setLetterSpacing(this.currentLetterSpacing); this.isRtl = calculateIsRtl(this.text); StaticLayout createStaticLayout = createStaticLayout(shouldDrawMultiline() ? this.maxLines : 1, width, this.isRtl); this.textLayout = createStaticLayout; this.textToDraw = createStaticLayout.getText(); } } private StaticLayout createStaticLayout(int i, float f, boolean z) { StaticLayout staticLayout; try { staticLayout = StaticLayoutBuilderCompat.obtain(this.text, this.textPaint, (int) f).setEllipsize(this.titleTextEllipsize).setIsRtl(z).setAlignment(i == 1 ? Layout.Alignment.ALIGN_NORMAL : getMultilineTextLayoutAlignment()).setIncludePad(false).setMaxLines(i).setLineSpacing(this.lineSpacingAdd, this.lineSpacingMultiplier).setHyphenationFrequency(this.hyphenationFrequency).setStaticLayoutBuilderConfigurer(this.staticLayoutBuilderConfigurer).build(); } catch (StaticLayoutBuilderCompat.StaticLayoutBuilderCompatException e) { Log.e(TAG, e.getCause().getMessage(), e); staticLayout = null; } return (StaticLayout) Preconditions.checkNotNull(staticLayout); } private Layout.Alignment getMultilineTextLayoutAlignment() { int absoluteGravity = GravityCompat.getAbsoluteGravity(this.expandedTextGravity, this.isRtl ? 1 : 0) & 7; if (absoluteGravity != 1) { return absoluteGravity != 5 ? this.isRtl ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL : this.isRtl ? Layout.Alignment.ALIGN_NORMAL : Layout.Alignment.ALIGN_OPPOSITE; } return Layout.Alignment.ALIGN_CENTER; } private void ensureExpandedTexture() { if (this.expandedTitleTexture != null || this.expandedBounds.isEmpty() || TextUtils.isEmpty(this.textToDraw)) { return; } calculateOffsets(0.0f); int width = this.textLayout.getWidth(); int height = this.textLayout.getHeight(); if (width <= 0 || height <= 0) { return; } this.expandedTitleTexture = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); this.textLayout.draw(new Canvas(this.expandedTitleTexture)); if (this.texturePaint == null) { this.texturePaint = new Paint(3); } } public void recalculate() { recalculate(false); } public void recalculate(boolean z) { if ((this.view.getHeight() <= 0 || this.view.getWidth() <= 0) && !z) { return; } calculateBaseOffsets(z); calculateCurrentOffsets(); } public void setText(CharSequence charSequence) { if (charSequence == null || !TextUtils.equals(this.text, charSequence)) { this.text = charSequence; this.textToDraw = null; clearTexture(); recalculate(); } } private void clearTexture() { Bitmap bitmap = this.expandedTitleTexture; if (bitmap != null) { bitmap.recycle(); this.expandedTitleTexture = null; } } public void setMaxLines(int i) { if (i != this.maxLines) { this.maxLines = i; clearTexture(); recalculate(); } } public int getLineCount() { StaticLayout staticLayout = this.textLayout; if (staticLayout != null) { return staticLayout.getLineCount(); } return 0; } public float getLineSpacingAdd() { return this.textLayout.getSpacingAdd(); } public float getLineSpacingMultiplier() { return this.textLayout.getSpacingMultiplier(); } public void setStaticLayoutBuilderConfigurer(StaticLayoutBuilderConfigurer staticLayoutBuilderConfigurer) { if (this.staticLayoutBuilderConfigurer != staticLayoutBuilderConfigurer) { this.staticLayoutBuilderConfigurer = staticLayoutBuilderConfigurer; recalculate(true); } } private static boolean isClose(float f, float f2) { return Math.abs(f - f2) < 1.0E-5f; } private static int blendARGB(int i, int i2, float f) { float f2 = 1.0f - f; return Color.argb(Math.round((Color.alpha(i) * f2) + (Color.alpha(i2) * f)), Math.round((Color.red(i) * f2) + (Color.red(i2) * f)), Math.round((Color.green(i) * f2) + (Color.green(i2) * f)), Math.round((Color.blue(i) * f2) + (Color.blue(i2) * f))); } private static float lerp(float f, float f2, float f3, TimeInterpolator timeInterpolator) { if (timeInterpolator != null) { f3 = timeInterpolator.getInterpolation(f3); } return AnimationUtils.lerp(f, f2, f3); } private static boolean rectEquals(Rect rect, int i, int i2, int i3, int i4) { return rect.left == i && rect.top == i2 && rect.right == i3 && rect.bottom == i4; } }