package androidx.viewpager.widget; import android.content.Context; import android.content.res.TypedArray; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.text.method.SingleLineTransformationMethod; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.TextView; import androidx.annotation.ColorInt; import androidx.annotation.FloatRange; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.widget.TextViewCompat; import androidx.viewpager.widget.ViewPager; import java.lang.ref.WeakReference; import java.util.Locale; @ViewPager.DecorView public class PagerTitleStrip extends ViewGroup { private static final int[] ATTRS = {16842804, 16842901, 16842904, 16842927}; private static final float SIDE_ALPHA = 0.6f; private static final int[] TEXT_ATTRS = {16843660}; private static final int TEXT_SPACING = 16; public TextView mCurrText; private int mGravity; private int mLastKnownCurrentPage; public float mLastKnownPositionOffset; public TextView mNextText; private int mNonPrimaryAlpha; private final PageListener mPageListener; public ViewPager mPager; public TextView mPrevText; private int mScaledTextSpacing; public int mTextColor; private boolean mUpdatingPositions; private boolean mUpdatingText; private WeakReference mWatchingAdapter; public class PageListener extends DataSetObserver implements ViewPager.OnPageChangeListener, ViewPager.OnAdapterChangeListener { private int mScrollState; public PageListener() { } @Override // androidx.viewpager.widget.ViewPager.OnAdapterChangeListener public void onAdapterChanged(ViewPager viewPager, PagerAdapter pagerAdapter, PagerAdapter pagerAdapter2) { PagerTitleStrip.this.updateAdapter(pagerAdapter, pagerAdapter2); } @Override // android.database.DataSetObserver public void onChanged() { PagerTitleStrip pagerTitleStrip = PagerTitleStrip.this; pagerTitleStrip.updateText(pagerTitleStrip.mPager.getCurrentItem(), PagerTitleStrip.this.mPager.getAdapter()); PagerTitleStrip pagerTitleStrip2 = PagerTitleStrip.this; float f = pagerTitleStrip2.mLastKnownPositionOffset; if (f < 0.0f) { f = 0.0f; } pagerTitleStrip2.updateTextPositions(pagerTitleStrip2.mPager.getCurrentItem(), f, true); } @Override // androidx.viewpager.widget.ViewPager.OnPageChangeListener public void onPageScrollStateChanged(int i) { this.mScrollState = i; } @Override // androidx.viewpager.widget.ViewPager.OnPageChangeListener public void onPageScrolled(int i, float f, int i2) { if (f > 0.5f) { i++; } PagerTitleStrip.this.updateTextPositions(i, f, false); } @Override // androidx.viewpager.widget.ViewPager.OnPageChangeListener public void onPageSelected(int i) { if (this.mScrollState == 0) { PagerTitleStrip pagerTitleStrip = PagerTitleStrip.this; pagerTitleStrip.updateText(pagerTitleStrip.mPager.getCurrentItem(), PagerTitleStrip.this.mPager.getAdapter()); PagerTitleStrip pagerTitleStrip2 = PagerTitleStrip.this; float f = pagerTitleStrip2.mLastKnownPositionOffset; if (f < 0.0f) { f = 0.0f; } pagerTitleStrip2.updateTextPositions(pagerTitleStrip2.mPager.getCurrentItem(), f, true); } } } public static class SingleLineAllCapsTransform extends SingleLineTransformationMethod { private Locale mLocale; public SingleLineAllCapsTransform(Context context) { this.mLocale = context.getResources().getConfiguration().locale; } @Override // android.text.method.ReplacementTransformationMethod, android.text.method.TransformationMethod public CharSequence getTransformation(CharSequence charSequence, View view) { CharSequence transformation = super.getTransformation(charSequence, view); if (transformation != null) { return transformation.toString().toUpperCase(this.mLocale); } return null; } } public PagerTitleStrip(@NonNull Context context) { this(context, null); } public PagerTitleStrip(@NonNull Context context, @Nullable AttributeSet attributeSet) { super(context, attributeSet); this.mLastKnownCurrentPage = -1; this.mLastKnownPositionOffset = -1.0f; this.mPageListener = new PageListener(); TextView textView = new TextView(context); this.mPrevText = textView; addView(textView); TextView textView2 = new TextView(context); this.mCurrText = textView2; addView(textView2); TextView textView3 = new TextView(context); this.mNextText = textView3; addView(textView3); TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, ATTRS); boolean z2 = false; int resourceId = obtainStyledAttributes.getResourceId(0, 0); if (resourceId != 0) { TextViewCompat.setTextAppearance(this.mPrevText, resourceId); TextViewCompat.setTextAppearance(this.mCurrText, resourceId); TextViewCompat.setTextAppearance(this.mNextText, resourceId); } int dimensionPixelSize = obtainStyledAttributes.getDimensionPixelSize(1, 0); if (dimensionPixelSize != 0) { setTextSize(0, (float) dimensionPixelSize); } if (obtainStyledAttributes.hasValue(2)) { int color = obtainStyledAttributes.getColor(2, 0); this.mPrevText.setTextColor(color); this.mCurrText.setTextColor(color); this.mNextText.setTextColor(color); } this.mGravity = obtainStyledAttributes.getInteger(3, 80); obtainStyledAttributes.recycle(); this.mTextColor = this.mCurrText.getTextColors().getDefaultColor(); setNonPrimaryAlpha(0.6f); this.mPrevText.setEllipsize(TextUtils.TruncateAt.END); this.mCurrText.setEllipsize(TextUtils.TruncateAt.END); this.mNextText.setEllipsize(TextUtils.TruncateAt.END); if (resourceId != 0) { TypedArray obtainStyledAttributes2 = context.obtainStyledAttributes(resourceId, TEXT_ATTRS); z2 = obtainStyledAttributes2.getBoolean(0, false); obtainStyledAttributes2.recycle(); } if (z2) { setSingleLineAllCaps(this.mPrevText); setSingleLineAllCaps(this.mCurrText); setSingleLineAllCaps(this.mNextText); } else { this.mPrevText.setSingleLine(); this.mCurrText.setSingleLine(); this.mNextText.setSingleLine(); } this.mScaledTextSpacing = (int) (context.getResources().getDisplayMetrics().density * 16.0f); } private static void setSingleLineAllCaps(TextView textView) { textView.setTransformationMethod(new SingleLineAllCapsTransform(textView.getContext())); } public int getMinHeight() { Drawable background = getBackground(); if (background != null) { return background.getIntrinsicHeight(); } return 0; } public int getTextSpacing() { return this.mScaledTextSpacing; } @Override // android.view.ViewGroup, android.view.View public void onAttachedToWindow() { super.onAttachedToWindow(); ViewParent parent = getParent(); if (parent instanceof ViewPager) { ViewPager viewPager = (ViewPager) parent; PagerAdapter adapter = viewPager.getAdapter(); viewPager.setInternalPageChangeListener(this.mPageListener); viewPager.addOnAdapterChangeListener(this.mPageListener); this.mPager = viewPager; WeakReference weakReference = this.mWatchingAdapter; updateAdapter(weakReference != null ? weakReference.get() : null, adapter); return; } throw new IllegalStateException("PagerTitleStrip must be a direct child of a ViewPager."); } @Override // android.view.ViewGroup, android.view.View public void onDetachedFromWindow() { super.onDetachedFromWindow(); ViewPager viewPager = this.mPager; if (viewPager != null) { updateAdapter(viewPager.getAdapter(), null); this.mPager.setInternalPageChangeListener(null); this.mPager.removeOnAdapterChangeListener(this.mPageListener); this.mPager = null; } } @Override // android.view.ViewGroup, android.view.View public void onLayout(boolean z2, int i, int i2, int i3, int i4) { if (this.mPager != null) { float f = this.mLastKnownPositionOffset; if (f < 0.0f) { f = 0.0f; } updateTextPositions(this.mLastKnownCurrentPage, f, true); } } @Override // android.view.View public void onMeasure(int i, int i2) { int i3; if (View.MeasureSpec.getMode(i) == 1073741824) { int paddingBottom = getPaddingBottom() + getPaddingTop(); int childMeasureSpec = ViewGroup.getChildMeasureSpec(i2, paddingBottom, -2); int size = View.MeasureSpec.getSize(i); int childMeasureSpec2 = ViewGroup.getChildMeasureSpec(i, (int) (((float) size) * 0.2f), -2); this.mPrevText.measure(childMeasureSpec2, childMeasureSpec); this.mCurrText.measure(childMeasureSpec2, childMeasureSpec); this.mNextText.measure(childMeasureSpec2, childMeasureSpec); if (View.MeasureSpec.getMode(i2) == 1073741824) { i3 = View.MeasureSpec.getSize(i2); } else { i3 = Math.max(getMinHeight(), this.mCurrText.getMeasuredHeight() + paddingBottom); } setMeasuredDimension(size, View.resolveSizeAndState(i3, i2, this.mCurrText.getMeasuredState() << 16)); return; } throw new IllegalStateException("Must measure with an exact width"); } @Override // android.view.ViewParent, android.view.View public void requestLayout() { if (!this.mUpdatingText) { super.requestLayout(); } } public void setGravity(int i) { this.mGravity = i; requestLayout(); } public void setNonPrimaryAlpha(@FloatRange(from = 0.0d, to = 1.0d) float f) { int i = ((int) (f * 255.0f)) & 255; this.mNonPrimaryAlpha = i; int i2 = (i << 24) | (this.mTextColor & 16777215); this.mPrevText.setTextColor(i2); this.mNextText.setTextColor(i2); } public void setTextColor(@ColorInt int i) { this.mTextColor = i; this.mCurrText.setTextColor(i); int i2 = (this.mNonPrimaryAlpha << 24) | (this.mTextColor & 16777215); this.mPrevText.setTextColor(i2); this.mNextText.setTextColor(i2); } public void setTextSize(int i, float f) { this.mPrevText.setTextSize(i, f); this.mCurrText.setTextSize(i, f); this.mNextText.setTextSize(i, f); } public void setTextSpacing(int i) { this.mScaledTextSpacing = i; requestLayout(); } public void updateAdapter(PagerAdapter pagerAdapter, PagerAdapter pagerAdapter2) { if (pagerAdapter != null) { pagerAdapter.unregisterDataSetObserver(this.mPageListener); this.mWatchingAdapter = null; } if (pagerAdapter2 != null) { pagerAdapter2.registerDataSetObserver(this.mPageListener); this.mWatchingAdapter = new WeakReference<>(pagerAdapter2); } ViewPager viewPager = this.mPager; if (viewPager != null) { this.mLastKnownCurrentPage = -1; this.mLastKnownPositionOffset = -1.0f; updateText(viewPager.getCurrentItem(), pagerAdapter2); requestLayout(); } } public void updateText(int i, PagerAdapter pagerAdapter) { int count = pagerAdapter != null ? pagerAdapter.getCount() : 0; this.mUpdatingText = true; CharSequence charSequence = null; this.mPrevText.setText((i < 1 || pagerAdapter == null) ? null : pagerAdapter.getPageTitle(i - 1)); this.mCurrText.setText((pagerAdapter == null || i >= count) ? null : pagerAdapter.getPageTitle(i)); int i2 = i + 1; if (i2 < count && pagerAdapter != null) { charSequence = pagerAdapter.getPageTitle(i2); } this.mNextText.setText(charSequence); int makeMeasureSpec = View.MeasureSpec.makeMeasureSpec(Math.max(0, (int) (((float) ((getWidth() - getPaddingLeft()) - getPaddingRight())) * 0.8f)), Integer.MIN_VALUE); int makeMeasureSpec2 = View.MeasureSpec.makeMeasureSpec(Math.max(0, (getHeight() - getPaddingTop()) - getPaddingBottom()), Integer.MIN_VALUE); this.mPrevText.measure(makeMeasureSpec, makeMeasureSpec2); this.mCurrText.measure(makeMeasureSpec, makeMeasureSpec2); this.mNextText.measure(makeMeasureSpec, makeMeasureSpec2); this.mLastKnownCurrentPage = i; if (!this.mUpdatingPositions) { updateTextPositions(i, this.mLastKnownPositionOffset, false); } this.mUpdatingText = false; } public void updateTextPositions(int i, float f, boolean z2) { int i2; int i3; int i4; int i5; if (i != this.mLastKnownCurrentPage) { updateText(i, this.mPager.getAdapter()); } else if (!z2 && f == this.mLastKnownPositionOffset) { return; } this.mUpdatingPositions = true; int measuredWidth = this.mPrevText.getMeasuredWidth(); int measuredWidth2 = this.mCurrText.getMeasuredWidth(); int measuredWidth3 = this.mNextText.getMeasuredWidth(); int i6 = measuredWidth2 / 2; int width = getWidth(); int height = getHeight(); int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); int paddingTop = getPaddingTop(); int paddingBottom = getPaddingBottom(); int i7 = paddingRight + i6; int i8 = (width - (paddingLeft + i6)) - i7; float f2 = 0.5f + f; if (f2 > 1.0f) { f2 -= 1.0f; } int i9 = ((width - i7) - ((int) (((float) i8) * f2))) - i6; int i10 = measuredWidth2 + i9; int baseline = this.mPrevText.getBaseline(); int baseline2 = this.mCurrText.getBaseline(); int baseline3 = this.mNextText.getBaseline(); int max = Math.max(Math.max(baseline, baseline2), baseline3); int i11 = max - baseline; int i12 = max - baseline2; int i13 = max - baseline3; int max2 = Math.max(Math.max(this.mPrevText.getMeasuredHeight() + i11, this.mCurrText.getMeasuredHeight() + i12), this.mNextText.getMeasuredHeight() + i13); int i14 = this.mGravity & 112; if (i14 == 16) { i5 = (((height - paddingTop) - paddingBottom) - max2) / 2; } else if (i14 != 80) { i4 = i11 + paddingTop; i2 = i12 + paddingTop; i3 = paddingTop + i13; TextView textView = this.mCurrText; textView.layout(i9, i2, i10, textView.getMeasuredHeight() + i2); int min = Math.min(paddingLeft, (i9 - this.mScaledTextSpacing) - measuredWidth); TextView textView2 = this.mPrevText; textView2.layout(min, i4, measuredWidth + min, textView2.getMeasuredHeight() + i4); int max3 = Math.max((width - paddingRight) - measuredWidth3, i10 + this.mScaledTextSpacing); TextView textView3 = this.mNextText; textView3.layout(max3, i3, max3 + measuredWidth3, textView3.getMeasuredHeight() + i3); this.mLastKnownPositionOffset = f; this.mUpdatingPositions = false; } else { i5 = (height - paddingBottom) - max2; } i4 = i11 + i5; i2 = i12 + i5; i3 = i5 + i13; TextView textView = this.mCurrText; textView.layout(i9, i2, i10, textView.getMeasuredHeight() + i2); int min = Math.min(paddingLeft, (i9 - this.mScaledTextSpacing) - measuredWidth); TextView textView2 = this.mPrevText; textView2.layout(min, i4, measuredWidth + min, textView2.getMeasuredHeight() + i4); int max3 = Math.max((width - paddingRight) - measuredWidth3, i10 + this.mScaledTextSpacing); TextView textView3 = this.mNextText; textView3.layout(max3, i3, max3 + measuredWidth3, textView3.getMeasuredHeight() + i3); this.mLastKnownPositionOffset = f; this.mUpdatingPositions = false; } }