ADD week 5
This commit is contained in:
		| @@ -0,0 +1,393 @@ | ||||
| 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user