ADD week 5
This commit is contained in:
		| @@ -0,0 +1,514 @@ | ||||
| package androidx.viewpager2.adapter; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.os.Looper; | ||||
| import android.os.Parcelable; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.view.ViewParent; | ||||
| import android.widget.FrameLayout; | ||||
| import androidx.collection.ArraySet; | ||||
| import androidx.collection.LongSparseArray; | ||||
| import androidx.core.util.Preconditions; | ||||
| import androidx.core.view.ViewCompat; | ||||
| import androidx.fragment.app.Fragment; | ||||
| import androidx.fragment.app.FragmentActivity; | ||||
| import androidx.fragment.app.FragmentManager; | ||||
| import androidx.fragment.app.FragmentTransaction; | ||||
| import androidx.lifecycle.Lifecycle; | ||||
| import androidx.lifecycle.LifecycleEventObserver; | ||||
| import androidx.lifecycle.LifecycleOwner; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import androidx.viewpager2.widget.ViewPager2; | ||||
| import java.util.Iterator; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public abstract class FragmentStateAdapter extends RecyclerView.Adapter<FragmentViewHolder> implements StatefulAdapter { | ||||
|     private static final long GRACE_WINDOW_TIME_MS = 10000; | ||||
|     private static final String KEY_PREFIX_FRAGMENT = "f#"; | ||||
|     private static final String KEY_PREFIX_STATE = "s#"; | ||||
|     final FragmentManager mFragmentManager; | ||||
|     private FragmentMaxLifecycleEnforcer mFragmentMaxLifecycleEnforcer; | ||||
|     final LongSparseArray<Fragment> mFragments; | ||||
|     private boolean mHasStaleFragments; | ||||
|     boolean mIsInGracePeriod; | ||||
|     private final LongSparseArray<Integer> mItemIdToViewHolder; | ||||
|     final Lifecycle mLifecycle; | ||||
|     private final LongSparseArray<Fragment.SavedState> mSavedStates; | ||||
|  | ||||
|     public abstract Fragment createFragment(int i); | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public long getItemId(int i) { | ||||
|         return i; | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final boolean onFailedToRecycleView(FragmentViewHolder fragmentViewHolder) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public FragmentStateAdapter(FragmentActivity fragmentActivity) { | ||||
|         this(fragmentActivity.getSupportFragmentManager(), fragmentActivity.getLifecycle()); | ||||
|     } | ||||
|  | ||||
|     public FragmentStateAdapter(Fragment fragment) { | ||||
|         this(fragment.getChildFragmentManager(), fragment.getLifecycle()); | ||||
|     } | ||||
|  | ||||
|     public FragmentStateAdapter(FragmentManager fragmentManager, Lifecycle lifecycle) { | ||||
|         this.mFragments = new LongSparseArray<>(); | ||||
|         this.mSavedStates = new LongSparseArray<>(); | ||||
|         this.mItemIdToViewHolder = new LongSparseArray<>(); | ||||
|         this.mIsInGracePeriod = false; | ||||
|         this.mHasStaleFragments = false; | ||||
|         this.mFragmentManager = fragmentManager; | ||||
|         this.mLifecycle = lifecycle; | ||||
|         super.setHasStableIds(true); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public void onAttachedToRecyclerView(RecyclerView recyclerView) { | ||||
|         Preconditions.checkArgument(this.mFragmentMaxLifecycleEnforcer == null); | ||||
|         FragmentMaxLifecycleEnforcer fragmentMaxLifecycleEnforcer = new FragmentMaxLifecycleEnforcer(); | ||||
|         this.mFragmentMaxLifecycleEnforcer = fragmentMaxLifecycleEnforcer; | ||||
|         fragmentMaxLifecycleEnforcer.register(recyclerView); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public void onDetachedFromRecyclerView(RecyclerView recyclerView) { | ||||
|         this.mFragmentMaxLifecycleEnforcer.unregister(recyclerView); | ||||
|         this.mFragmentMaxLifecycleEnforcer = null; | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final FragmentViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { | ||||
|         return FragmentViewHolder.create(viewGroup); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final void onBindViewHolder(final FragmentViewHolder fragmentViewHolder, int i) { | ||||
|         long itemId = fragmentViewHolder.getItemId(); | ||||
|         int id = fragmentViewHolder.getContainer().getId(); | ||||
|         Long itemForViewHolder = itemForViewHolder(id); | ||||
|         if (itemForViewHolder != null && itemForViewHolder.longValue() != itemId) { | ||||
|             removeFragment(itemForViewHolder.longValue()); | ||||
|             this.mItemIdToViewHolder.remove(itemForViewHolder.longValue()); | ||||
|         } | ||||
|         this.mItemIdToViewHolder.put(itemId, Integer.valueOf(id)); | ||||
|         ensureFragment(i); | ||||
|         final FrameLayout container = fragmentViewHolder.getContainer(); | ||||
|         if (ViewCompat.isAttachedToWindow(container)) { | ||||
|             if (container.getParent() != null) { | ||||
|                 throw new IllegalStateException("Design assumption violated."); | ||||
|             } | ||||
|             container.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.1 | ||||
|                 @Override // android.view.View.OnLayoutChangeListener | ||||
|                 public void onLayoutChange(View view, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9) { | ||||
|                     if (container.getParent() != null) { | ||||
|                         container.removeOnLayoutChangeListener(this); | ||||
|                         FragmentStateAdapter.this.placeFragmentInViewHolder(fragmentViewHolder); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         gcFragments(); | ||||
|     } | ||||
|  | ||||
|     void gcFragments() { | ||||
|         if (!this.mHasStaleFragments || shouldDelayFragmentTransactions()) { | ||||
|             return; | ||||
|         } | ||||
|         ArraySet arraySet = new ArraySet(); | ||||
|         for (int i = 0; i < this.mFragments.size(); i++) { | ||||
|             long keyAt = this.mFragments.keyAt(i); | ||||
|             if (!containsItem(keyAt)) { | ||||
|                 arraySet.add(Long.valueOf(keyAt)); | ||||
|                 this.mItemIdToViewHolder.remove(keyAt); | ||||
|             } | ||||
|         } | ||||
|         if (!this.mIsInGracePeriod) { | ||||
|             this.mHasStaleFragments = false; | ||||
|             for (int i2 = 0; i2 < this.mFragments.size(); i2++) { | ||||
|                 long keyAt2 = this.mFragments.keyAt(i2); | ||||
|                 if (!isFragmentViewBound(keyAt2)) { | ||||
|                     arraySet.add(Long.valueOf(keyAt2)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         Iterator<E> it = arraySet.iterator(); | ||||
|         while (it.hasNext()) { | ||||
|             removeFragment(((Long) it.next()).longValue()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private boolean isFragmentViewBound(long j) { | ||||
|         View view; | ||||
|         if (this.mItemIdToViewHolder.containsKey(j)) { | ||||
|             return true; | ||||
|         } | ||||
|         Fragment fragment = this.mFragments.get(j); | ||||
|         return (fragment == null || (view = fragment.getView()) == null || view.getParent() == null) ? false : true; | ||||
|     } | ||||
|  | ||||
|     private Long itemForViewHolder(int i) { | ||||
|         Long l = null; | ||||
|         for (int i2 = 0; i2 < this.mItemIdToViewHolder.size(); i2++) { | ||||
|             if (this.mItemIdToViewHolder.valueAt(i2).intValue() == i) { | ||||
|                 if (l != null) { | ||||
|                     throw new IllegalStateException("Design assumption violated: a ViewHolder can only be bound to one item at a time."); | ||||
|                 } | ||||
|                 l = Long.valueOf(this.mItemIdToViewHolder.keyAt(i2)); | ||||
|             } | ||||
|         } | ||||
|         return l; | ||||
|     } | ||||
|  | ||||
|     private void ensureFragment(int i) { | ||||
|         long itemId = getItemId(i); | ||||
|         if (this.mFragments.containsKey(itemId)) { | ||||
|             return; | ||||
|         } | ||||
|         Fragment createFragment = createFragment(i); | ||||
|         createFragment.setInitialSavedState(this.mSavedStates.get(itemId)); | ||||
|         this.mFragments.put(itemId, createFragment); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final void onViewAttachedToWindow(FragmentViewHolder fragmentViewHolder) { | ||||
|         placeFragmentInViewHolder(fragmentViewHolder); | ||||
|         gcFragments(); | ||||
|     } | ||||
|  | ||||
|     void placeFragmentInViewHolder(final FragmentViewHolder fragmentViewHolder) { | ||||
|         Fragment fragment = this.mFragments.get(fragmentViewHolder.getItemId()); | ||||
|         if (fragment == null) { | ||||
|             throw new IllegalStateException("Design assumption violated."); | ||||
|         } | ||||
|         FrameLayout container = fragmentViewHolder.getContainer(); | ||||
|         View view = fragment.getView(); | ||||
|         if (!fragment.isAdded() && view != null) { | ||||
|             throw new IllegalStateException("Design assumption violated."); | ||||
|         } | ||||
|         if (fragment.isAdded() && view == null) { | ||||
|             scheduleViewAttach(fragment, container); | ||||
|             return; | ||||
|         } | ||||
|         if (fragment.isAdded() && view.getParent() != null) { | ||||
|             if (view.getParent() != container) { | ||||
|                 addViewToContainer(view, container); | ||||
|             } | ||||
|         } else { | ||||
|             if (fragment.isAdded()) { | ||||
|                 addViewToContainer(view, container); | ||||
|                 return; | ||||
|             } | ||||
|             if (!shouldDelayFragmentTransactions()) { | ||||
|                 scheduleViewAttach(fragment, container); | ||||
|                 this.mFragmentManager.beginTransaction().add(fragment, "f" + fragmentViewHolder.getItemId()).setMaxLifecycle(fragment, Lifecycle.State.STARTED).commitNow(); | ||||
|                 this.mFragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(false); | ||||
|                 return; | ||||
|             } | ||||
|             if (this.mFragmentManager.isDestroyed()) { | ||||
|                 return; | ||||
|             } | ||||
|             this.mLifecycle.addObserver(new LifecycleEventObserver() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.2 | ||||
|                 @Override // androidx.lifecycle.LifecycleEventObserver | ||||
|                 public void onStateChanged(LifecycleOwner lifecycleOwner, Lifecycle.Event event) { | ||||
|                     if (FragmentStateAdapter.this.shouldDelayFragmentTransactions()) { | ||||
|                         return; | ||||
|                     } | ||||
|                     lifecycleOwner.getLifecycle().removeObserver(this); | ||||
|                     if (ViewCompat.isAttachedToWindow(fragmentViewHolder.getContainer())) { | ||||
|                         FragmentStateAdapter.this.placeFragmentInViewHolder(fragmentViewHolder); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void scheduleViewAttach(final Fragment fragment, final FrameLayout frameLayout) { | ||||
|         this.mFragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.3 | ||||
|             @Override // androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks | ||||
|             public void onFragmentViewCreated(FragmentManager fragmentManager, Fragment fragment2, View view, Bundle bundle) { | ||||
|                 if (fragment2 == fragment) { | ||||
|                     fragmentManager.unregisterFragmentLifecycleCallbacks(this); | ||||
|                     FragmentStateAdapter.this.addViewToContainer(view, frameLayout); | ||||
|                 } | ||||
|             } | ||||
|         }, false); | ||||
|     } | ||||
|  | ||||
|     void addViewToContainer(View view, FrameLayout frameLayout) { | ||||
|         if (frameLayout.getChildCount() > 1) { | ||||
|             throw new IllegalStateException("Design assumption violated."); | ||||
|         } | ||||
|         if (view.getParent() == frameLayout) { | ||||
|             return; | ||||
|         } | ||||
|         if (frameLayout.getChildCount() > 0) { | ||||
|             frameLayout.removeAllViews(); | ||||
|         } | ||||
|         if (view.getParent() != null) { | ||||
|             ((ViewGroup) view.getParent()).removeView(view); | ||||
|         } | ||||
|         frameLayout.addView(view); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final void onViewRecycled(FragmentViewHolder fragmentViewHolder) { | ||||
|         Long itemForViewHolder = itemForViewHolder(fragmentViewHolder.getContainer().getId()); | ||||
|         if (itemForViewHolder != null) { | ||||
|             removeFragment(itemForViewHolder.longValue()); | ||||
|             this.mItemIdToViewHolder.remove(itemForViewHolder.longValue()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void removeFragment(long j) { | ||||
|         ViewParent parent; | ||||
|         Fragment fragment = this.mFragments.get(j); | ||||
|         if (fragment == null) { | ||||
|             return; | ||||
|         } | ||||
|         if (fragment.getView() != null && (parent = fragment.getView().getParent()) != null) { | ||||
|             ((FrameLayout) parent).removeAllViews(); | ||||
|         } | ||||
|         if (!containsItem(j)) { | ||||
|             this.mSavedStates.remove(j); | ||||
|         } | ||||
|         if (!fragment.isAdded()) { | ||||
|             this.mFragments.remove(j); | ||||
|             return; | ||||
|         } | ||||
|         if (shouldDelayFragmentTransactions()) { | ||||
|             this.mHasStaleFragments = true; | ||||
|             return; | ||||
|         } | ||||
|         if (fragment.isAdded() && containsItem(j)) { | ||||
|             this.mSavedStates.put(j, this.mFragmentManager.saveFragmentInstanceState(fragment)); | ||||
|         } | ||||
|         this.mFragmentManager.beginTransaction().remove(fragment).commitNow(); | ||||
|         this.mFragments.remove(j); | ||||
|     } | ||||
|  | ||||
|     boolean shouldDelayFragmentTransactions() { | ||||
|         return this.mFragmentManager.isStateSaved(); | ||||
|     } | ||||
|  | ||||
|     public boolean containsItem(long j) { | ||||
|         return j >= 0 && j < ((long) getItemCount()); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.recyclerview.widget.RecyclerView.Adapter | ||||
|     public final void setHasStableIds(boolean z) { | ||||
|         throw new UnsupportedOperationException("Stable Ids are required for the adapter to function properly, and the adapter takes care of setting the flag."); | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.viewpager2.adapter.StatefulAdapter | ||||
|     public final Parcelable saveState() { | ||||
|         Bundle bundle = new Bundle(this.mFragments.size() + this.mSavedStates.size()); | ||||
|         for (int i = 0; i < this.mFragments.size(); i++) { | ||||
|             long keyAt = this.mFragments.keyAt(i); | ||||
|             Fragment fragment = this.mFragments.get(keyAt); | ||||
|             if (fragment != null && fragment.isAdded()) { | ||||
|                 this.mFragmentManager.putFragment(bundle, createKey(KEY_PREFIX_FRAGMENT, keyAt), fragment); | ||||
|             } | ||||
|         } | ||||
|         for (int i2 = 0; i2 < this.mSavedStates.size(); i2++) { | ||||
|             long keyAt2 = this.mSavedStates.keyAt(i2); | ||||
|             if (containsItem(keyAt2)) { | ||||
|                 bundle.putParcelable(createKey(KEY_PREFIX_STATE, keyAt2), this.mSavedStates.get(keyAt2)); | ||||
|             } | ||||
|         } | ||||
|         return bundle; | ||||
|     } | ||||
|  | ||||
|     @Override // androidx.viewpager2.adapter.StatefulAdapter | ||||
|     public final void restoreState(Parcelable parcelable) { | ||||
|         if (!this.mSavedStates.isEmpty() || !this.mFragments.isEmpty()) { | ||||
|             throw new IllegalStateException("Expected the adapter to be 'fresh' while restoring state."); | ||||
|         } | ||||
|         Bundle bundle = (Bundle) parcelable; | ||||
|         if (bundle.getClassLoader() == null) { | ||||
|             bundle.setClassLoader(getClass().getClassLoader()); | ||||
|         } | ||||
|         for (String str : bundle.keySet()) { | ||||
|             if (isValidKey(str, KEY_PREFIX_FRAGMENT)) { | ||||
|                 this.mFragments.put(parseIdFromKey(str, KEY_PREFIX_FRAGMENT), this.mFragmentManager.getFragment(bundle, str)); | ||||
|             } else if (isValidKey(str, KEY_PREFIX_STATE)) { | ||||
|                 long parseIdFromKey = parseIdFromKey(str, KEY_PREFIX_STATE); | ||||
|                 Fragment.SavedState savedState = (Fragment.SavedState) bundle.getParcelable(str); | ||||
|                 if (containsItem(parseIdFromKey)) { | ||||
|                     this.mSavedStates.put(parseIdFromKey, savedState); | ||||
|                 } | ||||
|             } else { | ||||
|                 throw new IllegalArgumentException("Unexpected key in savedState: " + str); | ||||
|             } | ||||
|         } | ||||
|         if (this.mFragments.isEmpty()) { | ||||
|             return; | ||||
|         } | ||||
|         this.mHasStaleFragments = true; | ||||
|         this.mIsInGracePeriod = true; | ||||
|         gcFragments(); | ||||
|         scheduleGracePeriodEnd(); | ||||
|     } | ||||
|  | ||||
|     private void scheduleGracePeriodEnd() { | ||||
|         final Handler handler = new Handler(Looper.getMainLooper()); | ||||
|         final Runnable runnable = new Runnable() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.4 | ||||
|             @Override // java.lang.Runnable | ||||
|             public void run() { | ||||
|                 FragmentStateAdapter.this.mIsInGracePeriod = false; | ||||
|                 FragmentStateAdapter.this.gcFragments(); | ||||
|             } | ||||
|         }; | ||||
|         this.mLifecycle.addObserver(new LifecycleEventObserver() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.5 | ||||
|             @Override // androidx.lifecycle.LifecycleEventObserver | ||||
|             public void onStateChanged(LifecycleOwner lifecycleOwner, Lifecycle.Event event) { | ||||
|                 if (event == Lifecycle.Event.ON_DESTROY) { | ||||
|                     handler.removeCallbacks(runnable); | ||||
|                     lifecycleOwner.getLifecycle().removeObserver(this); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         handler.postDelayed(runnable, GRACE_WINDOW_TIME_MS); | ||||
|     } | ||||
|  | ||||
|     private static String createKey(String str, long j) { | ||||
|         return str + j; | ||||
|     } | ||||
|  | ||||
|     private static boolean isValidKey(String str, String str2) { | ||||
|         return str.startsWith(str2) && str.length() > str2.length(); | ||||
|     } | ||||
|  | ||||
|     private static long parseIdFromKey(String str, String str2) { | ||||
|         return Long.parseLong(str.substring(str2.length())); | ||||
|     } | ||||
|  | ||||
|     class FragmentMaxLifecycleEnforcer { | ||||
|         private RecyclerView.AdapterDataObserver mDataObserver; | ||||
|         private LifecycleEventObserver mLifecycleObserver; | ||||
|         private ViewPager2.OnPageChangeCallback mPageChangeCallback; | ||||
|         private long mPrimaryItemId = -1; | ||||
|         private ViewPager2 mViewPager; | ||||
|  | ||||
|         FragmentMaxLifecycleEnforcer() { | ||||
|         } | ||||
|  | ||||
|         void register(RecyclerView recyclerView) { | ||||
|             this.mViewPager = inferViewPager(recyclerView); | ||||
|             ViewPager2.OnPageChangeCallback onPageChangeCallback = new ViewPager2.OnPageChangeCallback() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.FragmentMaxLifecycleEnforcer.1 | ||||
|                 @Override // androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback | ||||
|                 public void onPageScrollStateChanged(int i) { | ||||
|                     FragmentMaxLifecycleEnforcer.this.updateFragmentMaxLifecycle(false); | ||||
|                 } | ||||
|  | ||||
|                 @Override // androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback | ||||
|                 public void onPageSelected(int i) { | ||||
|                     FragmentMaxLifecycleEnforcer.this.updateFragmentMaxLifecycle(false); | ||||
|                 } | ||||
|             }; | ||||
|             this.mPageChangeCallback = onPageChangeCallback; | ||||
|             this.mViewPager.registerOnPageChangeCallback(onPageChangeCallback); | ||||
|             DataSetChangeObserver dataSetChangeObserver = new DataSetChangeObserver() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.FragmentMaxLifecycleEnforcer.2 | ||||
|                 @Override // androidx.viewpager2.adapter.FragmentStateAdapter.DataSetChangeObserver, androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|                 public void onChanged() { | ||||
|                     FragmentMaxLifecycleEnforcer.this.updateFragmentMaxLifecycle(true); | ||||
|                 } | ||||
|             }; | ||||
|             this.mDataObserver = dataSetChangeObserver; | ||||
|             FragmentStateAdapter.this.registerAdapterDataObserver(dataSetChangeObserver); | ||||
|             this.mLifecycleObserver = new LifecycleEventObserver() { // from class: androidx.viewpager2.adapter.FragmentStateAdapter.FragmentMaxLifecycleEnforcer.3 | ||||
|                 @Override // androidx.lifecycle.LifecycleEventObserver | ||||
|                 public void onStateChanged(LifecycleOwner lifecycleOwner, Lifecycle.Event event) { | ||||
|                     FragmentMaxLifecycleEnforcer.this.updateFragmentMaxLifecycle(false); | ||||
|                 } | ||||
|             }; | ||||
|             FragmentStateAdapter.this.mLifecycle.addObserver(this.mLifecycleObserver); | ||||
|         } | ||||
|  | ||||
|         void unregister(RecyclerView recyclerView) { | ||||
|             inferViewPager(recyclerView).unregisterOnPageChangeCallback(this.mPageChangeCallback); | ||||
|             FragmentStateAdapter.this.unregisterAdapterDataObserver(this.mDataObserver); | ||||
|             FragmentStateAdapter.this.mLifecycle.removeObserver(this.mLifecycleObserver); | ||||
|             this.mViewPager = null; | ||||
|         } | ||||
|  | ||||
|         void updateFragmentMaxLifecycle(boolean z) { | ||||
|             int currentItem; | ||||
|             Fragment fragment; | ||||
|             if (FragmentStateAdapter.this.shouldDelayFragmentTransactions() || this.mViewPager.getScrollState() != 0 || FragmentStateAdapter.this.mFragments.isEmpty() || FragmentStateAdapter.this.getItemCount() == 0 || (currentItem = this.mViewPager.getCurrentItem()) >= FragmentStateAdapter.this.getItemCount()) { | ||||
|                 return; | ||||
|             } | ||||
|             long itemId = FragmentStateAdapter.this.getItemId(currentItem); | ||||
|             if ((itemId != this.mPrimaryItemId || z) && (fragment = FragmentStateAdapter.this.mFragments.get(itemId)) != null && fragment.isAdded()) { | ||||
|                 this.mPrimaryItemId = itemId; | ||||
|                 FragmentTransaction beginTransaction = FragmentStateAdapter.this.mFragmentManager.beginTransaction(); | ||||
|                 Fragment fragment2 = null; | ||||
|                 for (int i = 0; i < FragmentStateAdapter.this.mFragments.size(); i++) { | ||||
|                     long keyAt = FragmentStateAdapter.this.mFragments.keyAt(i); | ||||
|                     Fragment valueAt = FragmentStateAdapter.this.mFragments.valueAt(i); | ||||
|                     if (valueAt.isAdded()) { | ||||
|                         if (keyAt != this.mPrimaryItemId) { | ||||
|                             beginTransaction.setMaxLifecycle(valueAt, Lifecycle.State.STARTED); | ||||
|                         } else { | ||||
|                             fragment2 = valueAt; | ||||
|                         } | ||||
|                         valueAt.setMenuVisibility(keyAt == this.mPrimaryItemId); | ||||
|                     } | ||||
|                 } | ||||
|                 if (fragment2 != null) { | ||||
|                     beginTransaction.setMaxLifecycle(fragment2, Lifecycle.State.RESUMED); | ||||
|                 } | ||||
|                 if (beginTransaction.isEmpty()) { | ||||
|                     return; | ||||
|                 } | ||||
|                 beginTransaction.commitNow(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         private ViewPager2 inferViewPager(RecyclerView recyclerView) { | ||||
|             ViewParent parent = recyclerView.getParent(); | ||||
|             if (parent instanceof ViewPager2) { | ||||
|                 return (ViewPager2) parent; | ||||
|             } | ||||
|             throw new IllegalStateException("Expected ViewPager2 instance. Got: " + parent); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static abstract class DataSetChangeObserver extends RecyclerView.AdapterDataObserver { | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public abstract void onChanged(); | ||||
|  | ||||
|         private DataSetChangeObserver() { | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public final void onItemRangeChanged(int i, int i2) { | ||||
|             onChanged(); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public final void onItemRangeChanged(int i, int i2, Object obj) { | ||||
|             onChanged(); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public final void onItemRangeInserted(int i, int i2) { | ||||
|             onChanged(); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public final void onItemRangeRemoved(int i, int i2) { | ||||
|             onChanged(); | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.recyclerview.widget.RecyclerView.AdapterDataObserver | ||||
|         public final void onItemRangeMoved(int i, int i2, int i3) { | ||||
|             onChanged(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,25 @@ | ||||
| package androidx.viewpager2.adapter; | ||||
|  | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.FrameLayout; | ||||
| import androidx.core.view.ViewCompat; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public final class FragmentViewHolder extends RecyclerView.ViewHolder { | ||||
|     private FragmentViewHolder(FrameLayout frameLayout) { | ||||
|         super(frameLayout); | ||||
|     } | ||||
|  | ||||
|     static FragmentViewHolder create(ViewGroup viewGroup) { | ||||
|         FrameLayout frameLayout = new FrameLayout(viewGroup.getContext()); | ||||
|         frameLayout.setLayoutParams(new ViewGroup.LayoutParams(-1, -1)); | ||||
|         frameLayout.setId(ViewCompat.generateViewId()); | ||||
|         frameLayout.setSaveEnabled(false); | ||||
|         return new FragmentViewHolder(frameLayout); | ||||
|     } | ||||
|  | ||||
|     FrameLayout getContainer() { | ||||
|         return (FrameLayout) this.itemView; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,10 @@ | ||||
| package androidx.viewpager2.adapter; | ||||
|  | ||||
| import android.os.Parcelable; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public interface StatefulAdapter { | ||||
|     void restoreState(Parcelable parcelable); | ||||
|  | ||||
|     Parcelable saveState(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user