ADD week 5
This commit is contained in:
		| @@ -0,0 +1,252 @@ | ||||
| package com.google.android.material.carousel; | ||||
|  | ||||
| import com.google.android.material.animation.AnimationUtils; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| final class KeylineState { | ||||
|     private final int firstFocalKeylineIndex; | ||||
|     private final float itemSize; | ||||
|     private final List<Keyline> keylines; | ||||
|     private final int lastFocalKeylineIndex; | ||||
|  | ||||
|     int getFirstFocalKeylineIndex() { | ||||
|         return this.firstFocalKeylineIndex; | ||||
|     } | ||||
|  | ||||
|     float getItemSize() { | ||||
|         return this.itemSize; | ||||
|     } | ||||
|  | ||||
|     List<Keyline> getKeylines() { | ||||
|         return this.keylines; | ||||
|     } | ||||
|  | ||||
|     int getLastFocalKeylineIndex() { | ||||
|         return this.lastFocalKeylineIndex; | ||||
|     } | ||||
|  | ||||
|     private KeylineState(float f, List<Keyline> list, int i, int i2) { | ||||
|         this.itemSize = f; | ||||
|         this.keylines = Collections.unmodifiableList(list); | ||||
|         this.firstFocalKeylineIndex = i; | ||||
|         this.lastFocalKeylineIndex = i2; | ||||
|     } | ||||
|  | ||||
|     Keyline getFirstFocalKeyline() { | ||||
|         return this.keylines.get(this.firstFocalKeylineIndex); | ||||
|     } | ||||
|  | ||||
|     Keyline getLastFocalKeyline() { | ||||
|         return this.keylines.get(this.lastFocalKeylineIndex); | ||||
|     } | ||||
|  | ||||
|     List<Keyline> getFocalKeylines() { | ||||
|         return this.keylines.subList(this.firstFocalKeylineIndex, this.lastFocalKeylineIndex + 1); | ||||
|     } | ||||
|  | ||||
|     Keyline getFirstKeyline() { | ||||
|         return this.keylines.get(0); | ||||
|     } | ||||
|  | ||||
|     Keyline getLastKeyline() { | ||||
|         return this.keylines.get(r0.size() - 1); | ||||
|     } | ||||
|  | ||||
|     Keyline getFirstNonAnchorKeyline() { | ||||
|         for (int i = 0; i < this.keylines.size(); i++) { | ||||
|             Keyline keyline = this.keylines.get(i); | ||||
|             if (!keyline.isAnchor) { | ||||
|                 return keyline; | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     Keyline getLastNonAnchorKeyline() { | ||||
|         for (int size = this.keylines.size() - 1; size >= 0; size--) { | ||||
|             Keyline keyline = this.keylines.get(size); | ||||
|             if (!keyline.isAnchor) { | ||||
|                 return keyline; | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     static KeylineState lerp(KeylineState keylineState, KeylineState keylineState2, float f) { | ||||
|         if (keylineState.getItemSize() != keylineState2.getItemSize()) { | ||||
|             throw new IllegalArgumentException("Keylines being linearly interpolated must have the same item size."); | ||||
|         } | ||||
|         List<Keyline> keylines = keylineState.getKeylines(); | ||||
|         List<Keyline> keylines2 = keylineState2.getKeylines(); | ||||
|         if (keylines.size() != keylines2.size()) { | ||||
|             throw new IllegalArgumentException("Keylines being linearly interpolated must have the same number of keylines."); | ||||
|         } | ||||
|         ArrayList arrayList = new ArrayList(); | ||||
|         for (int i = 0; i < keylineState.getKeylines().size(); i++) { | ||||
|             arrayList.add(Keyline.lerp(keylines.get(i), keylines2.get(i), f)); | ||||
|         } | ||||
|         return new KeylineState(keylineState.getItemSize(), arrayList, AnimationUtils.lerp(keylineState.getFirstFocalKeylineIndex(), keylineState2.getFirstFocalKeylineIndex(), f), AnimationUtils.lerp(keylineState.getLastFocalKeylineIndex(), keylineState2.getLastFocalKeylineIndex(), f)); | ||||
|     } | ||||
|  | ||||
|     static KeylineState reverse(KeylineState keylineState, float f) { | ||||
|         Builder builder = new Builder(keylineState.getItemSize(), f); | ||||
|         float f2 = (f - keylineState.getLastKeyline().locOffset) - (keylineState.getLastKeyline().maskedItemSize / 2.0f); | ||||
|         int size = keylineState.getKeylines().size() - 1; | ||||
|         while (size >= 0) { | ||||
|             Keyline keyline = keylineState.getKeylines().get(size); | ||||
|             builder.addKeyline(f2 + (keyline.maskedItemSize / 2.0f), keyline.mask, keyline.maskedItemSize, size >= keylineState.getFirstFocalKeylineIndex() && size <= keylineState.getLastFocalKeylineIndex(), keyline.isAnchor); | ||||
|             f2 += keyline.maskedItemSize; | ||||
|             size--; | ||||
|         } | ||||
|         return builder.build(); | ||||
|     } | ||||
|  | ||||
|     static final class Builder { | ||||
|         private static final int NO_INDEX = -1; | ||||
|         private static final float UNKNOWN_LOC = Float.MIN_VALUE; | ||||
|         private final float availableSpace; | ||||
|         private final float itemSize; | ||||
|         private Keyline tmpFirstFocalKeyline; | ||||
|         private Keyline tmpLastFocalKeyline; | ||||
|         private final List<Keyline> tmpKeylines = new ArrayList(); | ||||
|         private int firstFocalKeylineIndex = -1; | ||||
|         private int lastFocalKeylineIndex = -1; | ||||
|         private float lastKeylineMaskedSize = 0.0f; | ||||
|         private int latestAnchorKeylineIndex = -1; | ||||
|  | ||||
|         private static float calculateKeylineLocationForItemPosition(float f, float f2, int i, int i2) { | ||||
|             return (f - (i * f2)) + (i2 * f2); | ||||
|         } | ||||
|  | ||||
|         Builder(float f, float f2) { | ||||
|             this.itemSize = f; | ||||
|             this.availableSpace = f2; | ||||
|         } | ||||
|  | ||||
|         Builder addKeyline(float f, float f2, float f3, boolean z) { | ||||
|             return addKeyline(f, f2, f3, z, false); | ||||
|         } | ||||
|  | ||||
|         Builder addKeyline(float f, float f2, float f3) { | ||||
|             return addKeyline(f, f2, f3, false); | ||||
|         } | ||||
|  | ||||
|         Builder addKeyline(float f, float f2, float f3, boolean z, boolean z2, float f4) { | ||||
|             if (f3 <= 0.0f) { | ||||
|                 return this; | ||||
|             } | ||||
|             if (z2) { | ||||
|                 if (z) { | ||||
|                     throw new IllegalArgumentException("Anchor keylines cannot be focal."); | ||||
|                 } | ||||
|                 int i = this.latestAnchorKeylineIndex; | ||||
|                 if (i != -1 && i != 0) { | ||||
|                     throw new IllegalArgumentException("Anchor keylines must be either the first or last keyline."); | ||||
|                 } | ||||
|                 this.latestAnchorKeylineIndex = this.tmpKeylines.size(); | ||||
|             } | ||||
|             Keyline keyline = new Keyline(Float.MIN_VALUE, f, f2, f3, z2, f4); | ||||
|             if (z) { | ||||
|                 if (this.tmpFirstFocalKeyline == null) { | ||||
|                     this.tmpFirstFocalKeyline = keyline; | ||||
|                     this.firstFocalKeylineIndex = this.tmpKeylines.size(); | ||||
|                 } | ||||
|                 if (this.lastFocalKeylineIndex != -1 && this.tmpKeylines.size() - this.lastFocalKeylineIndex > 1) { | ||||
|                     throw new IllegalArgumentException("Keylines marked as focal must be placed next to each other. There cannot be non-focal keylines between focal keylines."); | ||||
|                 } | ||||
|                 if (f3 != this.tmpFirstFocalKeyline.maskedItemSize) { | ||||
|                     throw new IllegalArgumentException("Keylines that are marked as focal must all have the same masked item size."); | ||||
|                 } | ||||
|                 this.tmpLastFocalKeyline = keyline; | ||||
|                 this.lastFocalKeylineIndex = this.tmpKeylines.size(); | ||||
|             } else { | ||||
|                 if (this.tmpFirstFocalKeyline == null && keyline.maskedItemSize < this.lastKeylineMaskedSize) { | ||||
|                     throw new IllegalArgumentException("Keylines before the first focal keyline must be ordered by incrementing masked item size."); | ||||
|                 } | ||||
|                 if (this.tmpLastFocalKeyline != null && keyline.maskedItemSize > this.lastKeylineMaskedSize) { | ||||
|                     throw new IllegalArgumentException("Keylines after the last focal keyline must be ordered by decreasing masked item size."); | ||||
|                 } | ||||
|             } | ||||
|             this.lastKeylineMaskedSize = keyline.maskedItemSize; | ||||
|             this.tmpKeylines.add(keyline); | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         Builder addKeyline(float f, float f2, float f3, boolean z, boolean z2) { | ||||
|             float f4; | ||||
|             float abs; | ||||
|             float f5 = f3 / 2.0f; | ||||
|             float f6 = f - f5; | ||||
|             float f7 = f5 + f; | ||||
|             float f8 = this.availableSpace; | ||||
|             if (f7 > f8) { | ||||
|                 abs = Math.abs(f7 - Math.max(f7 - f3, f8)); | ||||
|             } else if (f6 < 0.0f) { | ||||
|                 abs = Math.abs(f6 - Math.min(f6 + f3, 0.0f)); | ||||
|             } else { | ||||
|                 f4 = 0.0f; | ||||
|                 return addKeyline(f, f2, f3, z, z2, f4); | ||||
|             } | ||||
|             f4 = abs; | ||||
|             return addKeyline(f, f2, f3, z, z2, f4); | ||||
|         } | ||||
|  | ||||
|         Builder addAnchorKeyline(float f, float f2, float f3) { | ||||
|             return addKeyline(f, f2, f3, false, true); | ||||
|         } | ||||
|  | ||||
|         Builder addKeylineRange(float f, float f2, float f3, int i) { | ||||
|             return addKeylineRange(f, f2, f3, i, false); | ||||
|         } | ||||
|  | ||||
|         Builder addKeylineRange(float f, float f2, float f3, int i, boolean z) { | ||||
|             if (i > 0 && f3 > 0.0f) { | ||||
|                 for (int i2 = 0; i2 < i; i2++) { | ||||
|                     addKeyline((i2 * f3) + f, f2, f3, z); | ||||
|                 } | ||||
|             } | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         KeylineState build() { | ||||
|             if (this.tmpFirstFocalKeyline == null) { | ||||
|                 throw new IllegalStateException("There must be a keyline marked as focal."); | ||||
|             } | ||||
|             ArrayList arrayList = new ArrayList(); | ||||
|             for (int i = 0; i < this.tmpKeylines.size(); i++) { | ||||
|                 Keyline keyline = this.tmpKeylines.get(i); | ||||
|                 arrayList.add(new Keyline(calculateKeylineLocationForItemPosition(this.tmpFirstFocalKeyline.locOffset, this.itemSize, this.firstFocalKeylineIndex, i), keyline.locOffset, keyline.mask, keyline.maskedItemSize, keyline.isAnchor, keyline.cutoff)); | ||||
|             } | ||||
|             return new KeylineState(this.itemSize, arrayList, this.firstFocalKeylineIndex, this.lastFocalKeylineIndex); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static final class Keyline { | ||||
|         final float cutoff; | ||||
|         final boolean isAnchor; | ||||
|         final float loc; | ||||
|         final float locOffset; | ||||
|         final float mask; | ||||
|         final float maskedItemSize; | ||||
|  | ||||
|         Keyline(float f, float f2, float f3, float f4) { | ||||
|             this(f, f2, f3, f4, false, 0.0f); | ||||
|         } | ||||
|  | ||||
|         Keyline(float f, float f2, float f3, float f4, boolean z, float f5) { | ||||
|             this.loc = f; | ||||
|             this.locOffset = f2; | ||||
|             this.mask = f3; | ||||
|             this.maskedItemSize = f4; | ||||
|             this.isAnchor = z; | ||||
|             this.cutoff = f5; | ||||
|         } | ||||
|  | ||||
|         static Keyline lerp(Keyline keyline, Keyline keyline2, float f) { | ||||
|             return new Keyline(AnimationUtils.lerp(keyline.loc, keyline2.loc, f), AnimationUtils.lerp(keyline.locOffset, keyline2.locOffset, f), AnimationUtils.lerp(keyline.mask, keyline2.mask, f), AnimationUtils.lerp(keyline.maskedItemSize, keyline2.maskedItemSize, f)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user