394 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.viewpager.widget;
 | |
| 
 | |
| import android.R;
 | |
| 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.core.view.ViewCompat;
 | |
| import androidx.core.widget.TextViewCompat;
 | |
| import androidx.viewpager.widget.ViewPager;
 | |
| import java.lang.ref.WeakReference;
 | |
| import java.util.Locale;
 | |
| 
 | |
| @ViewPager.DecorView
 | |
| /* loaded from: classes.dex */
 | |
| public class PagerTitleStrip extends ViewGroup {
 | |
|     private static final float SIDE_ALPHA = 0.6f;
 | |
|     private static final int TEXT_SPACING = 16;
 | |
|     TextView mCurrText;
 | |
|     private int mGravity;
 | |
|     private int mLastKnownCurrentPage;
 | |
|     float mLastKnownPositionOffset;
 | |
|     TextView mNextText;
 | |
|     private int mNonPrimaryAlpha;
 | |
|     private final PageListener mPageListener;
 | |
|     ViewPager mPager;
 | |
|     TextView mPrevText;
 | |
|     private int mScaledTextSpacing;
 | |
|     int mTextColor;
 | |
|     private boolean mUpdatingPositions;
 | |
|     private boolean mUpdatingText;
 | |
|     private WeakReference<PagerAdapter> mWatchingAdapter;
 | |
|     private static final int[] ATTRS = {R.attr.textAppearance, R.attr.textSize, R.attr.textColor, R.attr.gravity};
 | |
|     private static final int[] TEXT_ATTRS = {R.attr.textAllCaps};
 | |
| 
 | |
|     public int getTextSpacing() {
 | |
|         return this.mScaledTextSpacing;
 | |
|     }
 | |
| 
 | |
|     private static class SingleLineAllCapsTransform extends SingleLineTransformationMethod {
 | |
|         private Locale mLocale;
 | |
| 
 | |
|         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;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static void setSingleLineAllCaps(TextView textView) {
 | |
|         textView.setTransformationMethod(new SingleLineAllCapsTransform(textView.getContext()));
 | |
|     }
 | |
| 
 | |
|     public PagerTitleStrip(Context context) {
 | |
|         this(context, null);
 | |
|     }
 | |
| 
 | |
|     public PagerTitleStrip(Context context, 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);
 | |
|         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, 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(SIDE_ALPHA);
 | |
|         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);
 | |
|             boolean z = obtainStyledAttributes2.getBoolean(0, false);
 | |
|             obtainStyledAttributes2.recycle();
 | |
|             if (z) {
 | |
|                 setSingleLineAllCaps(this.mPrevText);
 | |
|                 setSingleLineAllCaps(this.mCurrText);
 | |
|                 setSingleLineAllCaps(this.mNextText);
 | |
|                 this.mScaledTextSpacing = (int) (context.getResources().getDisplayMetrics().density * 16.0f);
 | |
|             }
 | |
|         }
 | |
|         this.mPrevText.setSingleLine();
 | |
|         this.mCurrText.setSingleLine();
 | |
|         this.mNextText.setSingleLine();
 | |
|         this.mScaledTextSpacing = (int) (context.getResources().getDisplayMetrics().density * 16.0f);
 | |
|     }
 | |
| 
 | |
|     public void setTextSpacing(int i) {
 | |
|         this.mScaledTextSpacing = i;
 | |
|         requestLayout();
 | |
|     }
 | |
| 
 | |
|     public void setNonPrimaryAlpha(float f) {
 | |
|         int i = ((int) (f * 255.0f)) & 255;
 | |
|         this.mNonPrimaryAlpha = i;
 | |
|         int i2 = (i << 24) | (this.mTextColor & ViewCompat.MEASURED_SIZE_MASK);
 | |
|         this.mPrevText.setTextColor(i2);
 | |
|         this.mNextText.setTextColor(i2);
 | |
|     }
 | |
| 
 | |
|     public void setTextColor(int i) {
 | |
|         this.mTextColor = i;
 | |
|         this.mCurrText.setTextColor(i);
 | |
|         int i2 = (this.mNonPrimaryAlpha << 24) | (this.mTextColor & ViewCompat.MEASURED_SIZE_MASK);
 | |
|         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 setGravity(int i) {
 | |
|         this.mGravity = i;
 | |
|         requestLayout();
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.ViewGroup, android.view.View
 | |
|     protected void onAttachedToWindow() {
 | |
|         super.onAttachedToWindow();
 | |
|         ViewParent parent = getParent();
 | |
|         if (!(parent instanceof ViewPager)) {
 | |
|             throw new IllegalStateException("PagerTitleStrip must be a direct child of a ViewPager.");
 | |
|         }
 | |
|         ViewPager viewPager = (ViewPager) parent;
 | |
|         PagerAdapter adapter = viewPager.getAdapter();
 | |
|         viewPager.setInternalPageChangeListener(this.mPageListener);
 | |
|         viewPager.addOnAdapterChangeListener(this.mPageListener);
 | |
|         this.mPager = viewPager;
 | |
|         WeakReference<PagerAdapter> weakReference = this.mWatchingAdapter;
 | |
|         updateAdapter(weakReference != null ? weakReference.get() : null, adapter);
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.ViewGroup, android.view.View
 | |
|     protected 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;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     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) (((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;
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.View, android.view.ViewParent
 | |
|     public void requestLayout() {
 | |
|         if (this.mUpdatingText) {
 | |
|             return;
 | |
|         }
 | |
|         super.requestLayout();
 | |
|     }
 | |
| 
 | |
|     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();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void updateTextPositions(int i, float f, boolean z) {
 | |
|         int i2;
 | |
|         int i3;
 | |
|         int i4;
 | |
|         int i5;
 | |
|         if (i != this.mLastKnownCurrentPage) {
 | |
|             updateText(i, this.mPager.getAdapter());
 | |
|         } else if (!z && 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) (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) {
 | |
|             i2 = (((height - paddingTop) - paddingBottom) - max2) / 2;
 | |
|         } else {
 | |
|             if (i14 != 80) {
 | |
|                 i3 = i11 + paddingTop;
 | |
|                 i4 = i12 + paddingTop;
 | |
|                 i5 = paddingTop + i13;
 | |
|                 TextView textView = this.mCurrText;
 | |
|                 textView.layout(i9, i4, i10, textView.getMeasuredHeight() + i4);
 | |
|                 int min = Math.min(paddingLeft, (i9 - this.mScaledTextSpacing) - measuredWidth);
 | |
|                 TextView textView2 = this.mPrevText;
 | |
|                 textView2.layout(min, i3, measuredWidth + min, textView2.getMeasuredHeight() + i3);
 | |
|                 int max3 = Math.max((width - paddingRight) - measuredWidth3, i10 + this.mScaledTextSpacing);
 | |
|                 TextView textView3 = this.mNextText;
 | |
|                 textView3.layout(max3, i5, max3 + measuredWidth3, textView3.getMeasuredHeight() + i5);
 | |
|                 this.mLastKnownPositionOffset = f;
 | |
|                 this.mUpdatingPositions = false;
 | |
|             }
 | |
|             i2 = (height - paddingBottom) - max2;
 | |
|         }
 | |
|         i3 = i11 + i2;
 | |
|         i4 = i12 + i2;
 | |
|         i5 = i2 + i13;
 | |
|         TextView textView4 = this.mCurrText;
 | |
|         textView4.layout(i9, i4, i10, textView4.getMeasuredHeight() + i4);
 | |
|         int min2 = Math.min(paddingLeft, (i9 - this.mScaledTextSpacing) - measuredWidth);
 | |
|         TextView textView22 = this.mPrevText;
 | |
|         textView22.layout(min2, i3, measuredWidth + min2, textView22.getMeasuredHeight() + i3);
 | |
|         int max32 = Math.max((width - paddingRight) - measuredWidth3, i10 + this.mScaledTextSpacing);
 | |
|         TextView textView32 = this.mNextText;
 | |
|         textView32.layout(max32, i5, max32 + measuredWidth3, textView32.getMeasuredHeight() + i5);
 | |
|         this.mLastKnownPositionOffset = f;
 | |
|         this.mUpdatingPositions = false;
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.View
 | |
|     protected void onMeasure(int i, int i2) {
 | |
|         int max;
 | |
|         if (View.MeasureSpec.getMode(i) != 1073741824) {
 | |
|             throw new IllegalStateException("Must measure with an exact width");
 | |
|         }
 | |
|         int paddingTop = getPaddingTop() + getPaddingBottom();
 | |
|         int childMeasureSpec = getChildMeasureSpec(i2, paddingTop, -2);
 | |
|         int size = View.MeasureSpec.getSize(i);
 | |
|         int childMeasureSpec2 = getChildMeasureSpec(i, (int) (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) {
 | |
|             max = View.MeasureSpec.getSize(i2);
 | |
|         } else {
 | |
|             max = Math.max(getMinHeight(), this.mCurrText.getMeasuredHeight() + paddingTop);
 | |
|         }
 | |
|         setMeasuredDimension(size, View.resolveSizeAndState(max, i2, this.mCurrText.getMeasuredState() << 16));
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.ViewGroup, android.view.View
 | |
|     protected void onLayout(boolean z, 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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     int getMinHeight() {
 | |
|         Drawable background = getBackground();
 | |
|         if (background != null) {
 | |
|             return background.getIntrinsicHeight();
 | |
|         }
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     private class PageListener extends DataSetObserver implements ViewPager.OnPageChangeListener, ViewPager.OnAdapterChangeListener {
 | |
|         private int mScrollState;
 | |
| 
 | |
|         @Override // androidx.viewpager.widget.ViewPager.OnPageChangeListener
 | |
|         public void onPageScrollStateChanged(int i) {
 | |
|             this.mScrollState = i;
 | |
|         }
 | |
| 
 | |
|         PageListener() {
 | |
|         }
 | |
| 
 | |
|         @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());
 | |
|                 float f = PagerTitleStrip.this.mLastKnownPositionOffset >= 0.0f ? PagerTitleStrip.this.mLastKnownPositionOffset : 0.0f;
 | |
|                 PagerTitleStrip pagerTitleStrip2 = PagerTitleStrip.this;
 | |
|                 pagerTitleStrip2.updateTextPositions(pagerTitleStrip2.mPager.getCurrentItem(), f, true);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         @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());
 | |
|             float f = PagerTitleStrip.this.mLastKnownPositionOffset >= 0.0f ? PagerTitleStrip.this.mLastKnownPositionOffset : 0.0f;
 | |
|             PagerTitleStrip pagerTitleStrip2 = PagerTitleStrip.this;
 | |
|             pagerTitleStrip2.updateTextPositions(pagerTitleStrip2.mPager.getCurrentItem(), f, true);
 | |
|         }
 | |
|     }
 | |
| }
 |