ADD week 5
This commit is contained in:
614
02-Easy5/E5/sources/androidx/fragment/app/BackStackRecord.java
Normal file
614
02-Easy5/E5/sources/androidx/fragment/app/BackStackRecord.java
Normal file
@ -0,0 +1,614 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.Log;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class BackStackRecord extends FragmentTransaction implements FragmentManager.BackStackEntry, FragmentManager.OpGenerator {
|
||||
private static final String TAG = "FragmentManager";
|
||||
boolean mCommitted;
|
||||
int mIndex;
|
||||
final FragmentManager mManager;
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public int getId() {
|
||||
return this.mIndex;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder(128);
|
||||
sb.append("BackStackEntry{");
|
||||
sb.append(Integer.toHexString(System.identityHashCode(this)));
|
||||
if (this.mIndex >= 0) {
|
||||
sb.append(" #");
|
||||
sb.append(this.mIndex);
|
||||
}
|
||||
if (this.mName != null) {
|
||||
sb.append(" ");
|
||||
sb.append(this.mName);
|
||||
}
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void dump(String str, PrintWriter printWriter) {
|
||||
dump(str, printWriter, true);
|
||||
}
|
||||
|
||||
public void dump(String str, PrintWriter printWriter, boolean z) {
|
||||
String str2;
|
||||
if (z) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mName=");
|
||||
printWriter.print(this.mName);
|
||||
printWriter.print(" mIndex=");
|
||||
printWriter.print(this.mIndex);
|
||||
printWriter.print(" mCommitted=");
|
||||
printWriter.println(this.mCommitted);
|
||||
if (this.mTransition != 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mTransition=#");
|
||||
printWriter.print(Integer.toHexString(this.mTransition));
|
||||
}
|
||||
if (this.mEnterAnim != 0 || this.mExitAnim != 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mEnterAnim=#");
|
||||
printWriter.print(Integer.toHexString(this.mEnterAnim));
|
||||
printWriter.print(" mExitAnim=#");
|
||||
printWriter.println(Integer.toHexString(this.mExitAnim));
|
||||
}
|
||||
if (this.mPopEnterAnim != 0 || this.mPopExitAnim != 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mPopEnterAnim=#");
|
||||
printWriter.print(Integer.toHexString(this.mPopEnterAnim));
|
||||
printWriter.print(" mPopExitAnim=#");
|
||||
printWriter.println(Integer.toHexString(this.mPopExitAnim));
|
||||
}
|
||||
if (this.mBreadCrumbTitleRes != 0 || this.mBreadCrumbTitleText != null) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mBreadCrumbTitleRes=#");
|
||||
printWriter.print(Integer.toHexString(this.mBreadCrumbTitleRes));
|
||||
printWriter.print(" mBreadCrumbTitleText=");
|
||||
printWriter.println(this.mBreadCrumbTitleText);
|
||||
}
|
||||
if (this.mBreadCrumbShortTitleRes != 0 || this.mBreadCrumbShortTitleText != null) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("mBreadCrumbShortTitleRes=#");
|
||||
printWriter.print(Integer.toHexString(this.mBreadCrumbShortTitleRes));
|
||||
printWriter.print(" mBreadCrumbShortTitleText=");
|
||||
printWriter.println(this.mBreadCrumbShortTitleText);
|
||||
}
|
||||
}
|
||||
if (this.mOps.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
printWriter.print(str);
|
||||
printWriter.println("Operations:");
|
||||
int size = this.mOps.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i);
|
||||
switch (op.mCmd) {
|
||||
case 0:
|
||||
str2 = "NULL";
|
||||
break;
|
||||
case 1:
|
||||
str2 = "ADD";
|
||||
break;
|
||||
case 2:
|
||||
str2 = "REPLACE";
|
||||
break;
|
||||
case 3:
|
||||
str2 = "REMOVE";
|
||||
break;
|
||||
case 4:
|
||||
str2 = "HIDE";
|
||||
break;
|
||||
case 5:
|
||||
str2 = "SHOW";
|
||||
break;
|
||||
case 6:
|
||||
str2 = "DETACH";
|
||||
break;
|
||||
case 7:
|
||||
str2 = "ATTACH";
|
||||
break;
|
||||
case 8:
|
||||
str2 = "SET_PRIMARY_NAV";
|
||||
break;
|
||||
case 9:
|
||||
str2 = "UNSET_PRIMARY_NAV";
|
||||
break;
|
||||
case 10:
|
||||
str2 = "OP_SET_MAX_LIFECYCLE";
|
||||
break;
|
||||
default:
|
||||
str2 = "cmd=" + op.mCmd;
|
||||
break;
|
||||
}
|
||||
printWriter.print(str);
|
||||
printWriter.print(" Op #");
|
||||
printWriter.print(i);
|
||||
printWriter.print(": ");
|
||||
printWriter.print(str2);
|
||||
printWriter.print(" ");
|
||||
printWriter.println(op.mFragment);
|
||||
if (z) {
|
||||
if (op.mEnterAnim != 0 || op.mExitAnim != 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("enterAnim=#");
|
||||
printWriter.print(Integer.toHexString(op.mEnterAnim));
|
||||
printWriter.print(" exitAnim=#");
|
||||
printWriter.println(Integer.toHexString(op.mExitAnim));
|
||||
}
|
||||
if (op.mPopEnterAnim != 0 || op.mPopExitAnim != 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.print("popEnterAnim=#");
|
||||
printWriter.print(Integer.toHexString(op.mPopEnterAnim));
|
||||
printWriter.print(" popExitAnim=#");
|
||||
printWriter.println(Integer.toHexString(op.mPopExitAnim));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BackStackRecord(FragmentManager fragmentManager) {
|
||||
super(fragmentManager.getFragmentFactory(), fragmentManager.getHost() != null ? fragmentManager.getHost().getContext().getClassLoader() : null);
|
||||
this.mIndex = -1;
|
||||
this.mManager = fragmentManager;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public int getBreadCrumbTitleRes() {
|
||||
return this.mBreadCrumbTitleRes;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public int getBreadCrumbShortTitleRes() {
|
||||
return this.mBreadCrumbShortTitleRes;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public CharSequence getBreadCrumbTitle() {
|
||||
if (this.mBreadCrumbTitleRes != 0) {
|
||||
return this.mManager.getHost().getContext().getText(this.mBreadCrumbTitleRes);
|
||||
}
|
||||
return this.mBreadCrumbTitleText;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public CharSequence getBreadCrumbShortTitle() {
|
||||
if (this.mBreadCrumbShortTitleRes != 0) {
|
||||
return this.mManager.getHost().getContext().getText(this.mBreadCrumbShortTitleRes);
|
||||
}
|
||||
return this.mBreadCrumbShortTitleText;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
void doAddOp(int i, Fragment fragment, String str, int i2) {
|
||||
super.doAddOp(i, fragment, str, i2);
|
||||
fragment.mFragmentManager = this.mManager;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction remove(Fragment fragment) {
|
||||
if (fragment.mFragmentManager != null && fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalStateException("Cannot remove Fragment attached to a different FragmentManager. Fragment " + fragment.toString() + " is already attached to a FragmentManager.");
|
||||
}
|
||||
return super.remove(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction hide(Fragment fragment) {
|
||||
if (fragment.mFragmentManager != null && fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalStateException("Cannot hide Fragment attached to a different FragmentManager. Fragment " + fragment.toString() + " is already attached to a FragmentManager.");
|
||||
}
|
||||
return super.hide(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction show(Fragment fragment) {
|
||||
if (fragment.mFragmentManager != null && fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalStateException("Cannot show Fragment attached to a different FragmentManager. Fragment " + fragment.toString() + " is already attached to a FragmentManager.");
|
||||
}
|
||||
return super.show(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction detach(Fragment fragment) {
|
||||
if (fragment.mFragmentManager != null && fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalStateException("Cannot detach Fragment attached to a different FragmentManager. Fragment " + fragment.toString() + " is already attached to a FragmentManager.");
|
||||
}
|
||||
return super.detach(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction setPrimaryNavigationFragment(Fragment fragment) {
|
||||
if (fragment != null && fragment.mFragmentManager != null && fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalStateException("Cannot setPrimaryNavigation for Fragment attached to a different FragmentManager. Fragment " + fragment.toString() + " is already attached to a FragmentManager.");
|
||||
}
|
||||
return super.setPrimaryNavigationFragment(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public FragmentTransaction setMaxLifecycle(Fragment fragment, Lifecycle.State state) {
|
||||
if (fragment.mFragmentManager != this.mManager) {
|
||||
throw new IllegalArgumentException("Cannot setMaxLifecycle for Fragment not attached to FragmentManager " + this.mManager);
|
||||
}
|
||||
if (state == Lifecycle.State.INITIALIZED && fragment.mState > -1) {
|
||||
throw new IllegalArgumentException("Cannot set maximum Lifecycle to " + state + " after the Fragment has been created");
|
||||
}
|
||||
if (state == Lifecycle.State.DESTROYED) {
|
||||
throw new IllegalArgumentException("Cannot set maximum Lifecycle to " + state + ". Use remove() to remove the fragment from the FragmentManager and trigger its destruction.");
|
||||
}
|
||||
return super.setMaxLifecycle(fragment, state);
|
||||
}
|
||||
|
||||
void bumpBackStackNesting(int i) {
|
||||
if (this.mAddToBackStack) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Bump nesting in " + this + " by " + i);
|
||||
}
|
||||
int size = this.mOps.size();
|
||||
for (int i2 = 0; i2 < size; i2++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i2);
|
||||
if (op.mFragment != null) {
|
||||
op.mFragment.mBackStackNesting += i;
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Bump nesting of " + op.mFragment + " to " + op.mFragment.mBackStackNesting);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void runOnCommitRunnables() {
|
||||
if (this.mCommitRunnables != null) {
|
||||
for (int i = 0; i < this.mCommitRunnables.size(); i++) {
|
||||
this.mCommitRunnables.get(i).run();
|
||||
}
|
||||
this.mCommitRunnables = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public int commit() {
|
||||
return commitInternal(false);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public int commitAllowingStateLoss() {
|
||||
return commitInternal(true);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public void commitNow() {
|
||||
disallowAddToBackStack();
|
||||
this.mManager.execSingleAction(this, false);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public void commitNowAllowingStateLoss() {
|
||||
disallowAddToBackStack();
|
||||
this.mManager.execSingleAction(this, true);
|
||||
}
|
||||
|
||||
int commitInternal(boolean z) {
|
||||
if (this.mCommitted) {
|
||||
throw new IllegalStateException("commit already called");
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Commit: " + this);
|
||||
PrintWriter printWriter = new PrintWriter(new LogWriter(TAG));
|
||||
dump(" ", printWriter);
|
||||
printWriter.close();
|
||||
}
|
||||
this.mCommitted = true;
|
||||
if (this.mAddToBackStack) {
|
||||
this.mIndex = this.mManager.allocBackStackIndex();
|
||||
} else {
|
||||
this.mIndex = -1;
|
||||
}
|
||||
this.mManager.enqueueAction(this, z);
|
||||
return this.mIndex;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.OpGenerator
|
||||
public boolean generateOps(ArrayList<BackStackRecord> arrayList, ArrayList<Boolean> arrayList2) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Run: " + this);
|
||||
}
|
||||
arrayList.add(this);
|
||||
arrayList2.add(false);
|
||||
if (!this.mAddToBackStack) {
|
||||
return true;
|
||||
}
|
||||
this.mManager.addBackStackState(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean interactsWith(int i) {
|
||||
int size = this.mOps.size();
|
||||
for (int i2 = 0; i2 < size; i2++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i2);
|
||||
int i3 = op.mFragment != null ? op.mFragment.mContainerId : 0;
|
||||
if (i3 != 0 && i3 == i) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean interactsWith(ArrayList<BackStackRecord> arrayList, int i, int i2) {
|
||||
if (i2 == i) {
|
||||
return false;
|
||||
}
|
||||
int size = this.mOps.size();
|
||||
int i3 = -1;
|
||||
for (int i4 = 0; i4 < size; i4++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i4);
|
||||
int i5 = op.mFragment != null ? op.mFragment.mContainerId : 0;
|
||||
if (i5 != 0 && i5 != i3) {
|
||||
for (int i6 = i; i6 < i2; i6++) {
|
||||
BackStackRecord backStackRecord = arrayList.get(i6);
|
||||
int size2 = backStackRecord.mOps.size();
|
||||
for (int i7 = 0; i7 < size2; i7++) {
|
||||
FragmentTransaction.Op op2 = backStackRecord.mOps.get(i7);
|
||||
if ((op2.mFragment != null ? op2.mFragment.mContainerId : 0) == i5) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
i3 = i5;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void executeOps() {
|
||||
int size = this.mOps.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i);
|
||||
Fragment fragment = op.mFragment;
|
||||
if (fragment != null) {
|
||||
fragment.setPopDirection(false);
|
||||
fragment.setNextTransition(this.mTransition);
|
||||
fragment.setSharedElementNames(this.mSharedElementSourceNames, this.mSharedElementTargetNames);
|
||||
}
|
||||
switch (op.mCmd) {
|
||||
case 1:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, false);
|
||||
this.mManager.addFragment(fragment);
|
||||
break;
|
||||
case 2:
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown cmd: " + op.mCmd);
|
||||
case 3:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.removeFragment(fragment);
|
||||
break;
|
||||
case 4:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.hideFragment(fragment);
|
||||
break;
|
||||
case 5:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, false);
|
||||
this.mManager.showFragment(fragment);
|
||||
break;
|
||||
case 6:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.detachFragment(fragment);
|
||||
break;
|
||||
case 7:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, false);
|
||||
this.mManager.attachFragment(fragment);
|
||||
break;
|
||||
case 8:
|
||||
this.mManager.setPrimaryNavigationFragment(fragment);
|
||||
break;
|
||||
case 9:
|
||||
this.mManager.setPrimaryNavigationFragment(null);
|
||||
break;
|
||||
case 10:
|
||||
this.mManager.setMaxLifecycle(fragment, op.mCurrentMaxState);
|
||||
break;
|
||||
}
|
||||
if (!this.mReorderingAllowed && op.mCmd != 1 && fragment != null && !FragmentManager.USE_STATE_MANAGER) {
|
||||
this.mManager.moveFragmentToExpectedState(fragment);
|
||||
}
|
||||
}
|
||||
if (this.mReorderingAllowed || FragmentManager.USE_STATE_MANAGER) {
|
||||
return;
|
||||
}
|
||||
FragmentManager fragmentManager = this.mManager;
|
||||
fragmentManager.moveToState(fragmentManager.mCurState, true);
|
||||
}
|
||||
|
||||
void executePopOps(boolean z) {
|
||||
for (int size = this.mOps.size() - 1; size >= 0; size--) {
|
||||
FragmentTransaction.Op op = this.mOps.get(size);
|
||||
Fragment fragment = op.mFragment;
|
||||
if (fragment != null) {
|
||||
fragment.setPopDirection(true);
|
||||
fragment.setNextTransition(FragmentManager.reverseTransit(this.mTransition));
|
||||
fragment.setSharedElementNames(this.mSharedElementTargetNames, this.mSharedElementSourceNames);
|
||||
}
|
||||
switch (op.mCmd) {
|
||||
case 1:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, true);
|
||||
this.mManager.removeFragment(fragment);
|
||||
break;
|
||||
case 2:
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown cmd: " + op.mCmd);
|
||||
case 3:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.addFragment(fragment);
|
||||
break;
|
||||
case 4:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.showFragment(fragment);
|
||||
break;
|
||||
case 5:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, true);
|
||||
this.mManager.hideFragment(fragment);
|
||||
break;
|
||||
case 6:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.attachFragment(fragment);
|
||||
break;
|
||||
case 7:
|
||||
fragment.setAnimations(op.mEnterAnim, op.mExitAnim, op.mPopEnterAnim, op.mPopExitAnim);
|
||||
this.mManager.setExitAnimationOrder(fragment, true);
|
||||
this.mManager.detachFragment(fragment);
|
||||
break;
|
||||
case 8:
|
||||
this.mManager.setPrimaryNavigationFragment(null);
|
||||
break;
|
||||
case 9:
|
||||
this.mManager.setPrimaryNavigationFragment(fragment);
|
||||
break;
|
||||
case 10:
|
||||
this.mManager.setMaxLifecycle(fragment, op.mOldMaxState);
|
||||
break;
|
||||
}
|
||||
if (!this.mReorderingAllowed && op.mCmd != 3 && fragment != null && !FragmentManager.USE_STATE_MANAGER) {
|
||||
this.mManager.moveFragmentToExpectedState(fragment);
|
||||
}
|
||||
}
|
||||
if (this.mReorderingAllowed || !z || FragmentManager.USE_STATE_MANAGER) {
|
||||
return;
|
||||
}
|
||||
FragmentManager fragmentManager = this.mManager;
|
||||
fragmentManager.moveToState(fragmentManager.mCurState, true);
|
||||
}
|
||||
|
||||
Fragment expandOps(ArrayList<Fragment> arrayList, Fragment fragment) {
|
||||
Fragment fragment2 = fragment;
|
||||
int i = 0;
|
||||
while (i < this.mOps.size()) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i);
|
||||
int i2 = op.mCmd;
|
||||
if (i2 != 1) {
|
||||
if (i2 == 2) {
|
||||
Fragment fragment3 = op.mFragment;
|
||||
int i3 = fragment3.mContainerId;
|
||||
boolean z = false;
|
||||
for (int size = arrayList.size() - 1; size >= 0; size--) {
|
||||
Fragment fragment4 = arrayList.get(size);
|
||||
if (fragment4.mContainerId == i3) {
|
||||
if (fragment4 == fragment3) {
|
||||
z = true;
|
||||
} else {
|
||||
if (fragment4 == fragment2) {
|
||||
this.mOps.add(i, new FragmentTransaction.Op(9, fragment4));
|
||||
i++;
|
||||
fragment2 = null;
|
||||
}
|
||||
FragmentTransaction.Op op2 = new FragmentTransaction.Op(3, fragment4);
|
||||
op2.mEnterAnim = op.mEnterAnim;
|
||||
op2.mPopEnterAnim = op.mPopEnterAnim;
|
||||
op2.mExitAnim = op.mExitAnim;
|
||||
op2.mPopExitAnim = op.mPopExitAnim;
|
||||
this.mOps.add(i, op2);
|
||||
arrayList.remove(fragment4);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (z) {
|
||||
this.mOps.remove(i);
|
||||
i--;
|
||||
} else {
|
||||
op.mCmd = 1;
|
||||
arrayList.add(fragment3);
|
||||
}
|
||||
} else if (i2 == 3 || i2 == 6) {
|
||||
arrayList.remove(op.mFragment);
|
||||
if (op.mFragment == fragment2) {
|
||||
this.mOps.add(i, new FragmentTransaction.Op(9, op.mFragment));
|
||||
i++;
|
||||
fragment2 = null;
|
||||
}
|
||||
} else if (i2 != 7) {
|
||||
if (i2 == 8) {
|
||||
this.mOps.add(i, new FragmentTransaction.Op(9, fragment2));
|
||||
i++;
|
||||
fragment2 = op.mFragment;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
arrayList.add(op.mFragment);
|
||||
i++;
|
||||
}
|
||||
return fragment2;
|
||||
}
|
||||
|
||||
Fragment trackAddedFragmentsInPop(ArrayList<Fragment> arrayList, Fragment fragment) {
|
||||
for (int size = this.mOps.size() - 1; size >= 0; size--) {
|
||||
FragmentTransaction.Op op = this.mOps.get(size);
|
||||
int i = op.mCmd;
|
||||
if (i != 1) {
|
||||
if (i != 3) {
|
||||
switch (i) {
|
||||
case 8:
|
||||
fragment = null;
|
||||
break;
|
||||
case 9:
|
||||
fragment = op.mFragment;
|
||||
break;
|
||||
case 10:
|
||||
op.mCurrentMaxState = op.mOldMaxState;
|
||||
break;
|
||||
}
|
||||
}
|
||||
arrayList.add(op.mFragment);
|
||||
}
|
||||
arrayList.remove(op.mFragment);
|
||||
}
|
||||
return fragment;
|
||||
}
|
||||
|
||||
boolean isPostponed() {
|
||||
for (int i = 0; i < this.mOps.size(); i++) {
|
||||
if (isFragmentPostponed(this.mOps.get(i))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void setOnStartPostponedListener(Fragment.OnStartEnterTransitionListener onStartEnterTransitionListener) {
|
||||
for (int i = 0; i < this.mOps.size(); i++) {
|
||||
FragmentTransaction.Op op = this.mOps.get(i);
|
||||
if (isFragmentPostponed(op)) {
|
||||
op.mFragment.setOnStartEnterTransitionListener(onStartEnterTransitionListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isFragmentPostponed(FragmentTransaction.Op op) {
|
||||
Fragment fragment = op.mFragment;
|
||||
return (fragment == null || !fragment.mAdded || fragment.mView == null || fragment.mDetached || fragment.mHidden || !fragment.isPostponed()) ? false : true;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentManager.BackStackEntry
|
||||
public String getName() {
|
||||
return this.mName;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransaction
|
||||
public boolean isEmpty() {
|
||||
return this.mOps.isEmpty();
|
||||
}
|
||||
}
|
164
02-Easy5/E5/sources/androidx/fragment/app/BackStackState.java
Normal file
164
02-Easy5/E5/sources/androidx/fragment/app/BackStackState.java
Normal file
@ -0,0 +1,164 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class BackStackState implements Parcelable {
|
||||
public static final Parcelable.Creator<BackStackState> CREATOR = new Parcelable.Creator<BackStackState>() { // from class: androidx.fragment.app.BackStackState.1
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public BackStackState createFromParcel(Parcel parcel) {
|
||||
return new BackStackState(parcel);
|
||||
}
|
||||
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public BackStackState[] newArray(int i) {
|
||||
return new BackStackState[i];
|
||||
}
|
||||
};
|
||||
private static final String TAG = "FragmentManager";
|
||||
final int mBreadCrumbShortTitleRes;
|
||||
final CharSequence mBreadCrumbShortTitleText;
|
||||
final int mBreadCrumbTitleRes;
|
||||
final CharSequence mBreadCrumbTitleText;
|
||||
final int[] mCurrentMaxLifecycleStates;
|
||||
final ArrayList<String> mFragmentWhos;
|
||||
final int mIndex;
|
||||
final String mName;
|
||||
final int[] mOldMaxLifecycleStates;
|
||||
final int[] mOps;
|
||||
final boolean mReorderingAllowed;
|
||||
final ArrayList<String> mSharedElementSourceNames;
|
||||
final ArrayList<String> mSharedElementTargetNames;
|
||||
final int mTransition;
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public BackStackState(BackStackRecord backStackRecord) {
|
||||
int size = backStackRecord.mOps.size();
|
||||
this.mOps = new int[size * 5];
|
||||
if (!backStackRecord.mAddToBackStack) {
|
||||
throw new IllegalStateException("Not on back stack");
|
||||
}
|
||||
this.mFragmentWhos = new ArrayList<>(size);
|
||||
this.mOldMaxLifecycleStates = new int[size];
|
||||
this.mCurrentMaxLifecycleStates = new int[size];
|
||||
int i = 0;
|
||||
for (int i2 = 0; i2 < size; i2++) {
|
||||
FragmentTransaction.Op op = backStackRecord.mOps.get(i2);
|
||||
int i3 = i + 1;
|
||||
this.mOps[i] = op.mCmd;
|
||||
this.mFragmentWhos.add(op.mFragment != null ? op.mFragment.mWho : null);
|
||||
this.mOps[i3] = op.mEnterAnim;
|
||||
this.mOps[i + 2] = op.mExitAnim;
|
||||
int i4 = i + 4;
|
||||
this.mOps[i + 3] = op.mPopEnterAnim;
|
||||
i += 5;
|
||||
this.mOps[i4] = op.mPopExitAnim;
|
||||
this.mOldMaxLifecycleStates[i2] = op.mOldMaxState.ordinal();
|
||||
this.mCurrentMaxLifecycleStates[i2] = op.mCurrentMaxState.ordinal();
|
||||
}
|
||||
this.mTransition = backStackRecord.mTransition;
|
||||
this.mName = backStackRecord.mName;
|
||||
this.mIndex = backStackRecord.mIndex;
|
||||
this.mBreadCrumbTitleRes = backStackRecord.mBreadCrumbTitleRes;
|
||||
this.mBreadCrumbTitleText = backStackRecord.mBreadCrumbTitleText;
|
||||
this.mBreadCrumbShortTitleRes = backStackRecord.mBreadCrumbShortTitleRes;
|
||||
this.mBreadCrumbShortTitleText = backStackRecord.mBreadCrumbShortTitleText;
|
||||
this.mSharedElementSourceNames = backStackRecord.mSharedElementSourceNames;
|
||||
this.mSharedElementTargetNames = backStackRecord.mSharedElementTargetNames;
|
||||
this.mReorderingAllowed = backStackRecord.mReorderingAllowed;
|
||||
}
|
||||
|
||||
public BackStackState(Parcel parcel) {
|
||||
this.mOps = parcel.createIntArray();
|
||||
this.mFragmentWhos = parcel.createStringArrayList();
|
||||
this.mOldMaxLifecycleStates = parcel.createIntArray();
|
||||
this.mCurrentMaxLifecycleStates = parcel.createIntArray();
|
||||
this.mTransition = parcel.readInt();
|
||||
this.mName = parcel.readString();
|
||||
this.mIndex = parcel.readInt();
|
||||
this.mBreadCrumbTitleRes = parcel.readInt();
|
||||
this.mBreadCrumbTitleText = (CharSequence) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
|
||||
this.mBreadCrumbShortTitleRes = parcel.readInt();
|
||||
this.mBreadCrumbShortTitleText = (CharSequence) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
|
||||
this.mSharedElementSourceNames = parcel.createStringArrayList();
|
||||
this.mSharedElementTargetNames = parcel.createStringArrayList();
|
||||
this.mReorderingAllowed = parcel.readInt() != 0;
|
||||
}
|
||||
|
||||
public BackStackRecord instantiate(FragmentManager fragmentManager) {
|
||||
BackStackRecord backStackRecord = new BackStackRecord(fragmentManager);
|
||||
int i = 0;
|
||||
int i2 = 0;
|
||||
while (i < this.mOps.length) {
|
||||
FragmentTransaction.Op op = new FragmentTransaction.Op();
|
||||
int i3 = i + 1;
|
||||
op.mCmd = this.mOps[i];
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Instantiate " + backStackRecord + " op #" + i2 + " base fragment #" + this.mOps[i3]);
|
||||
}
|
||||
String str = this.mFragmentWhos.get(i2);
|
||||
if (str != null) {
|
||||
op.mFragment = fragmentManager.findActiveFragment(str);
|
||||
} else {
|
||||
op.mFragment = null;
|
||||
}
|
||||
op.mOldMaxState = Lifecycle.State.values()[this.mOldMaxLifecycleStates[i2]];
|
||||
op.mCurrentMaxState = Lifecycle.State.values()[this.mCurrentMaxLifecycleStates[i2]];
|
||||
op.mEnterAnim = this.mOps[i3];
|
||||
op.mExitAnim = this.mOps[i + 2];
|
||||
int i4 = i + 4;
|
||||
op.mPopEnterAnim = this.mOps[i + 3];
|
||||
i += 5;
|
||||
op.mPopExitAnim = this.mOps[i4];
|
||||
backStackRecord.mEnterAnim = op.mEnterAnim;
|
||||
backStackRecord.mExitAnim = op.mExitAnim;
|
||||
backStackRecord.mPopEnterAnim = op.mPopEnterAnim;
|
||||
backStackRecord.mPopExitAnim = op.mPopExitAnim;
|
||||
backStackRecord.addOp(op);
|
||||
i2++;
|
||||
}
|
||||
backStackRecord.mTransition = this.mTransition;
|
||||
backStackRecord.mName = this.mName;
|
||||
backStackRecord.mIndex = this.mIndex;
|
||||
backStackRecord.mAddToBackStack = true;
|
||||
backStackRecord.mBreadCrumbTitleRes = this.mBreadCrumbTitleRes;
|
||||
backStackRecord.mBreadCrumbTitleText = this.mBreadCrumbTitleText;
|
||||
backStackRecord.mBreadCrumbShortTitleRes = this.mBreadCrumbShortTitleRes;
|
||||
backStackRecord.mBreadCrumbShortTitleText = this.mBreadCrumbShortTitleText;
|
||||
backStackRecord.mSharedElementSourceNames = this.mSharedElementSourceNames;
|
||||
backStackRecord.mSharedElementTargetNames = this.mSharedElementTargetNames;
|
||||
backStackRecord.mReorderingAllowed = this.mReorderingAllowed;
|
||||
backStackRecord.bumpBackStackNesting(1);
|
||||
return backStackRecord;
|
||||
}
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public void writeToParcel(Parcel parcel, int i) {
|
||||
parcel.writeIntArray(this.mOps);
|
||||
parcel.writeStringList(this.mFragmentWhos);
|
||||
parcel.writeIntArray(this.mOldMaxLifecycleStates);
|
||||
parcel.writeIntArray(this.mCurrentMaxLifecycleStates);
|
||||
parcel.writeInt(this.mTransition);
|
||||
parcel.writeString(this.mName);
|
||||
parcel.writeInt(this.mIndex);
|
||||
parcel.writeInt(this.mBreadCrumbTitleRes);
|
||||
TextUtils.writeToParcel(this.mBreadCrumbTitleText, parcel, 0);
|
||||
parcel.writeInt(this.mBreadCrumbShortTitleRes);
|
||||
TextUtils.writeToParcel(this.mBreadCrumbShortTitleText, parcel, 0);
|
||||
parcel.writeStringList(this.mSharedElementSourceNames);
|
||||
parcel.writeStringList(this.mSharedElementTargetNames);
|
||||
parcel.writeInt(this.mReorderingAllowed ? 1 : 0);
|
||||
}
|
||||
}
|
@ -0,0 +1,824 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.Animation;
|
||||
import androidx.collection.ArrayMap;
|
||||
import androidx.core.app.SharedElementCallback;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import androidx.core.util.Preconditions;
|
||||
import androidx.core.view.OneShotPreDrawListener;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.ViewGroupCompat;
|
||||
import androidx.fragment.app.FragmentAnim;
|
||||
import androidx.fragment.app.SpecialEffectsController;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class DefaultSpecialEffectsController extends SpecialEffectsController {
|
||||
DefaultSpecialEffectsController(ViewGroup viewGroup) {
|
||||
super(viewGroup);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.SpecialEffectsController
|
||||
void executeOperations(List<SpecialEffectsController.Operation> list, boolean z) {
|
||||
SpecialEffectsController.Operation operation = null;
|
||||
SpecialEffectsController.Operation operation2 = null;
|
||||
for (SpecialEffectsController.Operation operation3 : list) {
|
||||
SpecialEffectsController.Operation.State from = SpecialEffectsController.Operation.State.from(operation3.getFragment().mView);
|
||||
int i = AnonymousClass10.$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[operation3.getFinalState().ordinal()];
|
||||
if (i == 1 || i == 2 || i == 3) {
|
||||
if (from == SpecialEffectsController.Operation.State.VISIBLE && operation == null) {
|
||||
operation = operation3;
|
||||
}
|
||||
} else if (i == 4 && from != SpecialEffectsController.Operation.State.VISIBLE) {
|
||||
operation2 = operation3;
|
||||
}
|
||||
}
|
||||
ArrayList arrayList = new ArrayList();
|
||||
ArrayList arrayList2 = new ArrayList();
|
||||
final ArrayList arrayList3 = new ArrayList(list);
|
||||
for (final SpecialEffectsController.Operation operation4 : list) {
|
||||
CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
operation4.markStartedSpecialEffect(cancellationSignal);
|
||||
arrayList.add(new AnimationInfo(operation4, cancellationSignal, z));
|
||||
CancellationSignal cancellationSignal2 = new CancellationSignal();
|
||||
operation4.markStartedSpecialEffect(cancellationSignal2);
|
||||
boolean z2 = false;
|
||||
if (z) {
|
||||
if (operation4 != operation) {
|
||||
arrayList2.add(new TransitionInfo(operation4, cancellationSignal2, z, z2));
|
||||
operation4.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (arrayList3.contains(operation4)) {
|
||||
arrayList3.remove(operation4);
|
||||
DefaultSpecialEffectsController.this.applyContainerChanges(operation4);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
z2 = true;
|
||||
arrayList2.add(new TransitionInfo(operation4, cancellationSignal2, z, z2));
|
||||
operation4.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (arrayList3.contains(operation4)) {
|
||||
arrayList3.remove(operation4);
|
||||
DefaultSpecialEffectsController.this.applyContainerChanges(operation4);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (operation4 != operation2) {
|
||||
arrayList2.add(new TransitionInfo(operation4, cancellationSignal2, z, z2));
|
||||
operation4.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (arrayList3.contains(operation4)) {
|
||||
arrayList3.remove(operation4);
|
||||
DefaultSpecialEffectsController.this.applyContainerChanges(operation4);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
z2 = true;
|
||||
arrayList2.add(new TransitionInfo(operation4, cancellationSignal2, z, z2));
|
||||
operation4.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (arrayList3.contains(operation4)) {
|
||||
arrayList3.remove(operation4);
|
||||
DefaultSpecialEffectsController.this.applyContainerChanges(operation4);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Map<SpecialEffectsController.Operation, Boolean> startTransitions = startTransitions(arrayList2, arrayList3, z, operation, operation2);
|
||||
startAnimations(arrayList, arrayList3, startTransitions.containsValue(true), startTransitions);
|
||||
Iterator<SpecialEffectsController.Operation> it = arrayList3.iterator();
|
||||
while (it.hasNext()) {
|
||||
applyContainerChanges(it.next());
|
||||
}
|
||||
arrayList3.clear();
|
||||
}
|
||||
|
||||
/* renamed from: androidx.fragment.app.DefaultSpecialEffectsController$10, reason: invalid class name */
|
||||
static /* synthetic */ class AnonymousClass10 {
|
||||
static final /* synthetic */ int[] $SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State;
|
||||
|
||||
static {
|
||||
int[] iArr = new int[SpecialEffectsController.Operation.State.values().length];
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State = iArr;
|
||||
try {
|
||||
iArr[SpecialEffectsController.Operation.State.GONE.ordinal()] = 1;
|
||||
} catch (NoSuchFieldError unused) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[SpecialEffectsController.Operation.State.INVISIBLE.ordinal()] = 2;
|
||||
} catch (NoSuchFieldError unused2) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[SpecialEffectsController.Operation.State.REMOVED.ordinal()] = 3;
|
||||
} catch (NoSuchFieldError unused3) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[SpecialEffectsController.Operation.State.VISIBLE.ordinal()] = 4;
|
||||
} catch (NoSuchFieldError unused4) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void startAnimations(List<AnimationInfo> list, List<SpecialEffectsController.Operation> list2, boolean z, Map<SpecialEffectsController.Operation, Boolean> map) {
|
||||
final ViewGroup container = getContainer();
|
||||
Context context = container.getContext();
|
||||
ArrayList arrayList = new ArrayList();
|
||||
boolean z2 = false;
|
||||
for (final AnimationInfo animationInfo : list) {
|
||||
if (animationInfo.isVisibilityUnchanged()) {
|
||||
animationInfo.completeSpecialEffect();
|
||||
} else {
|
||||
FragmentAnim.AnimationOrAnimator animation = animationInfo.getAnimation(context);
|
||||
if (animation == null) {
|
||||
animationInfo.completeSpecialEffect();
|
||||
} else {
|
||||
final Animator animator = animation.animator;
|
||||
if (animator == null) {
|
||||
arrayList.add(animationInfo);
|
||||
} else {
|
||||
final SpecialEffectsController.Operation operation = animationInfo.getOperation();
|
||||
Fragment fragment = operation.getFragment();
|
||||
if (Boolean.TRUE.equals(map.get(operation))) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "Ignoring Animator set on " + fragment + " as this Fragment was involved in a Transition.");
|
||||
}
|
||||
animationInfo.completeSpecialEffect();
|
||||
} else {
|
||||
final boolean z3 = operation.getFinalState() == SpecialEffectsController.Operation.State.GONE;
|
||||
if (z3) {
|
||||
list2.remove(operation);
|
||||
}
|
||||
final View view = fragment.mView;
|
||||
container.startViewTransition(view);
|
||||
animator.addListener(new AnimatorListenerAdapter() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.2
|
||||
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
||||
public void onAnimationEnd(Animator animator2) {
|
||||
container.endViewTransition(view);
|
||||
if (z3) {
|
||||
operation.getFinalState().applyState(view);
|
||||
}
|
||||
animationInfo.completeSpecialEffect();
|
||||
}
|
||||
});
|
||||
animator.setTarget(view);
|
||||
animator.start();
|
||||
animationInfo.getSignal().setOnCancelListener(new CancellationSignal.OnCancelListener() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.3
|
||||
@Override // androidx.core.os.CancellationSignal.OnCancelListener
|
||||
public void onCancel() {
|
||||
animator.end();
|
||||
}
|
||||
});
|
||||
z2 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Iterator it = arrayList.iterator();
|
||||
while (it.hasNext()) {
|
||||
final AnimationInfo animationInfo2 = (AnimationInfo) it.next();
|
||||
SpecialEffectsController.Operation operation2 = animationInfo2.getOperation();
|
||||
Fragment fragment2 = operation2.getFragment();
|
||||
if (z) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "Ignoring Animation set on " + fragment2 + " as Animations cannot run alongside Transitions.");
|
||||
}
|
||||
animationInfo2.completeSpecialEffect();
|
||||
} else if (z2) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "Ignoring Animation set on " + fragment2 + " as Animations cannot run alongside Animators.");
|
||||
}
|
||||
animationInfo2.completeSpecialEffect();
|
||||
} else {
|
||||
final View view2 = fragment2.mView;
|
||||
Animation animation2 = (Animation) Preconditions.checkNotNull(((FragmentAnim.AnimationOrAnimator) Preconditions.checkNotNull(animationInfo2.getAnimation(context))).animation);
|
||||
if (operation2.getFinalState() != SpecialEffectsController.Operation.State.REMOVED) {
|
||||
view2.startAnimation(animation2);
|
||||
animationInfo2.completeSpecialEffect();
|
||||
} else {
|
||||
container.startViewTransition(view2);
|
||||
FragmentAnim.EndViewTransitionAnimation endViewTransitionAnimation = new FragmentAnim.EndViewTransitionAnimation(animation2, container, view2);
|
||||
endViewTransitionAnimation.setAnimationListener(new Animation.AnimationListener() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.4
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationRepeat(Animation animation3) {
|
||||
}
|
||||
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationStart(Animation animation3) {
|
||||
}
|
||||
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationEnd(Animation animation3) {
|
||||
container.post(new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.4.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
container.endViewTransition(view2);
|
||||
animationInfo2.completeSpecialEffect();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
view2.startAnimation(endViewTransitionAnimation);
|
||||
}
|
||||
animationInfo2.getSignal().setOnCancelListener(new CancellationSignal.OnCancelListener() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.5
|
||||
@Override // androidx.core.os.CancellationSignal.OnCancelListener
|
||||
public void onCancel() {
|
||||
view2.clearAnimation();
|
||||
container.endViewTransition(view2);
|
||||
animationInfo2.completeSpecialEffect();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Map<SpecialEffectsController.Operation, Boolean> startTransitions(List<TransitionInfo> list, List<SpecialEffectsController.Operation> list2, final boolean z, final SpecialEffectsController.Operation operation, final SpecialEffectsController.Operation operation2) {
|
||||
Iterator<TransitionInfo> it;
|
||||
View view;
|
||||
Object obj;
|
||||
ArrayList<View> arrayList;
|
||||
Object obj2;
|
||||
ArrayList<View> arrayList2;
|
||||
HashMap hashMap;
|
||||
SpecialEffectsController.Operation operation3;
|
||||
View view2;
|
||||
Object mergeTransitionsTogether;
|
||||
ArrayMap arrayMap;
|
||||
SpecialEffectsController.Operation operation4;
|
||||
FragmentTransitionImpl fragmentTransitionImpl;
|
||||
ArrayList<View> arrayList3;
|
||||
HashMap hashMap2;
|
||||
Rect rect;
|
||||
SpecialEffectsController.Operation operation5;
|
||||
View view3;
|
||||
ArrayList<View> arrayList4;
|
||||
DefaultSpecialEffectsController defaultSpecialEffectsController;
|
||||
SharedElementCallback enterTransitionCallback;
|
||||
SharedElementCallback exitTransitionCallback;
|
||||
ArrayList<String> arrayList5;
|
||||
int i;
|
||||
View view4;
|
||||
final View view5;
|
||||
String findKeyForValue;
|
||||
ArrayList<String> arrayList6;
|
||||
DefaultSpecialEffectsController defaultSpecialEffectsController2 = this;
|
||||
boolean z2 = z;
|
||||
SpecialEffectsController.Operation operation6 = operation;
|
||||
SpecialEffectsController.Operation operation7 = operation2;
|
||||
HashMap hashMap3 = new HashMap();
|
||||
final FragmentTransitionImpl fragmentTransitionImpl2 = null;
|
||||
for (TransitionInfo transitionInfo : list) {
|
||||
if (!transitionInfo.isVisibilityUnchanged()) {
|
||||
FragmentTransitionImpl handlingImpl = transitionInfo.getHandlingImpl();
|
||||
if (fragmentTransitionImpl2 == null) {
|
||||
fragmentTransitionImpl2 = handlingImpl;
|
||||
} else if (handlingImpl != null && fragmentTransitionImpl2 != handlingImpl) {
|
||||
throw new IllegalArgumentException("Mixing framework transitions and AndroidX transitions is not allowed. Fragment " + transitionInfo.getOperation().getFragment() + " returned Transition " + transitionInfo.getTransition() + " which uses a different Transition type than other Fragments.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fragmentTransitionImpl2 == null) {
|
||||
for (TransitionInfo transitionInfo2 : list) {
|
||||
hashMap3.put(transitionInfo2.getOperation(), false);
|
||||
transitionInfo2.completeSpecialEffect();
|
||||
}
|
||||
return hashMap3;
|
||||
}
|
||||
View view6 = new View(getContainer().getContext());
|
||||
final Rect rect2 = new Rect();
|
||||
ArrayList<View> arrayList7 = new ArrayList<>();
|
||||
ArrayList<View> arrayList8 = new ArrayList<>();
|
||||
ArrayMap arrayMap2 = new ArrayMap();
|
||||
Object obj3 = null;
|
||||
View view7 = null;
|
||||
boolean z3 = false;
|
||||
for (TransitionInfo transitionInfo3 : list) {
|
||||
if (!transitionInfo3.hasSharedElementTransition() || operation6 == null || operation7 == null) {
|
||||
arrayMap = arrayMap2;
|
||||
operation4 = operation7;
|
||||
fragmentTransitionImpl = fragmentTransitionImpl2;
|
||||
arrayList3 = arrayList8;
|
||||
hashMap2 = hashMap3;
|
||||
rect = rect2;
|
||||
operation5 = operation6;
|
||||
view3 = view6;
|
||||
DefaultSpecialEffectsController defaultSpecialEffectsController3 = defaultSpecialEffectsController2;
|
||||
arrayList4 = arrayList7;
|
||||
defaultSpecialEffectsController = defaultSpecialEffectsController3;
|
||||
view7 = view7;
|
||||
} else {
|
||||
Object wrapTransitionInSet = fragmentTransitionImpl2.wrapTransitionInSet(fragmentTransitionImpl2.cloneTransition(transitionInfo3.getSharedElementTransition()));
|
||||
ArrayList<String> sharedElementSourceNames = operation2.getFragment().getSharedElementSourceNames();
|
||||
ArrayList<String> sharedElementSourceNames2 = operation.getFragment().getSharedElementSourceNames();
|
||||
ArrayList<String> sharedElementTargetNames = operation.getFragment().getSharedElementTargetNames();
|
||||
View view8 = view7;
|
||||
int i2 = 0;
|
||||
while (i2 < sharedElementTargetNames.size()) {
|
||||
int indexOf = sharedElementSourceNames.indexOf(sharedElementTargetNames.get(i2));
|
||||
ArrayList<String> arrayList9 = sharedElementTargetNames;
|
||||
if (indexOf != -1) {
|
||||
sharedElementSourceNames.set(indexOf, sharedElementSourceNames2.get(i2));
|
||||
}
|
||||
i2++;
|
||||
sharedElementTargetNames = arrayList9;
|
||||
}
|
||||
ArrayList<String> sharedElementTargetNames2 = operation2.getFragment().getSharedElementTargetNames();
|
||||
if (!z2) {
|
||||
enterTransitionCallback = operation.getFragment().getExitTransitionCallback();
|
||||
exitTransitionCallback = operation2.getFragment().getEnterTransitionCallback();
|
||||
} else {
|
||||
enterTransitionCallback = operation.getFragment().getEnterTransitionCallback();
|
||||
exitTransitionCallback = operation2.getFragment().getExitTransitionCallback();
|
||||
}
|
||||
int i3 = 0;
|
||||
for (int size = sharedElementSourceNames.size(); i3 < size; size = size) {
|
||||
arrayMap2.put(sharedElementSourceNames.get(i3), sharedElementTargetNames2.get(i3));
|
||||
i3++;
|
||||
}
|
||||
ArrayMap<String, View> arrayMap3 = new ArrayMap<>();
|
||||
defaultSpecialEffectsController2.findNamedViews(arrayMap3, operation.getFragment().mView);
|
||||
arrayMap3.retainAll(sharedElementSourceNames);
|
||||
if (enterTransitionCallback != null) {
|
||||
enterTransitionCallback.onMapSharedElements(sharedElementSourceNames, arrayMap3);
|
||||
int size2 = sharedElementSourceNames.size() - 1;
|
||||
while (size2 >= 0) {
|
||||
String str = sharedElementSourceNames.get(size2);
|
||||
View view9 = arrayMap3.get(str);
|
||||
if (view9 == null) {
|
||||
arrayMap2.remove(str);
|
||||
arrayList6 = sharedElementSourceNames;
|
||||
} else {
|
||||
arrayList6 = sharedElementSourceNames;
|
||||
if (!str.equals(ViewCompat.getTransitionName(view9))) {
|
||||
arrayMap2.put(ViewCompat.getTransitionName(view9), (String) arrayMap2.remove(str));
|
||||
}
|
||||
}
|
||||
size2--;
|
||||
sharedElementSourceNames = arrayList6;
|
||||
}
|
||||
arrayList5 = sharedElementSourceNames;
|
||||
} else {
|
||||
arrayList5 = sharedElementSourceNames;
|
||||
arrayMap2.retainAll(arrayMap3.keySet());
|
||||
}
|
||||
final ArrayMap<String, View> arrayMap4 = new ArrayMap<>();
|
||||
defaultSpecialEffectsController2.findNamedViews(arrayMap4, operation2.getFragment().mView);
|
||||
arrayMap4.retainAll(sharedElementTargetNames2);
|
||||
arrayMap4.retainAll(arrayMap2.values());
|
||||
if (exitTransitionCallback != null) {
|
||||
exitTransitionCallback.onMapSharedElements(sharedElementTargetNames2, arrayMap4);
|
||||
for (int size3 = sharedElementTargetNames2.size() - 1; size3 >= 0; size3--) {
|
||||
String str2 = sharedElementTargetNames2.get(size3);
|
||||
View view10 = arrayMap4.get(str2);
|
||||
if (view10 == null) {
|
||||
String findKeyForValue2 = FragmentTransition.findKeyForValue(arrayMap2, str2);
|
||||
if (findKeyForValue2 != null) {
|
||||
arrayMap2.remove(findKeyForValue2);
|
||||
}
|
||||
} else if (!str2.equals(ViewCompat.getTransitionName(view10)) && (findKeyForValue = FragmentTransition.findKeyForValue(arrayMap2, str2)) != null) {
|
||||
arrayMap2.put(findKeyForValue, ViewCompat.getTransitionName(view10));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FragmentTransition.retainValues(arrayMap2, arrayMap4);
|
||||
}
|
||||
defaultSpecialEffectsController2.retainMatchingViews(arrayMap3, arrayMap2.keySet());
|
||||
defaultSpecialEffectsController2.retainMatchingViews(arrayMap4, arrayMap2.values());
|
||||
if (arrayMap2.isEmpty()) {
|
||||
arrayList7.clear();
|
||||
arrayList8.clear();
|
||||
arrayMap = arrayMap2;
|
||||
arrayList3 = arrayList8;
|
||||
rect = rect2;
|
||||
view3 = view6;
|
||||
fragmentTransitionImpl = fragmentTransitionImpl2;
|
||||
view7 = view8;
|
||||
obj3 = null;
|
||||
operation4 = operation2;
|
||||
hashMap2 = hashMap3;
|
||||
operation5 = operation;
|
||||
DefaultSpecialEffectsController defaultSpecialEffectsController4 = defaultSpecialEffectsController2;
|
||||
arrayList4 = arrayList7;
|
||||
defaultSpecialEffectsController = defaultSpecialEffectsController4;
|
||||
} else {
|
||||
FragmentTransition.callSharedElementStartEnd(operation2.getFragment(), operation.getFragment(), z2, arrayMap3, true);
|
||||
HashMap hashMap4 = hashMap3;
|
||||
arrayMap = arrayMap2;
|
||||
View view11 = view6;
|
||||
ArrayList<View> arrayList10 = arrayList8;
|
||||
arrayList4 = arrayList7;
|
||||
OneShotPreDrawListener.add(getContainer(), new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.6
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
FragmentTransition.callSharedElementStartEnd(operation2.getFragment(), operation.getFragment(), z, arrayMap4, false);
|
||||
}
|
||||
});
|
||||
arrayList4.addAll(arrayMap3.values());
|
||||
if (arrayList5.isEmpty()) {
|
||||
i = 0;
|
||||
view7 = view8;
|
||||
} else {
|
||||
i = 0;
|
||||
View view12 = arrayMap3.get(arrayList5.get(0));
|
||||
fragmentTransitionImpl2.setEpicenter(wrapTransitionInSet, view12);
|
||||
view7 = view12;
|
||||
}
|
||||
arrayList10.addAll(arrayMap4.values());
|
||||
if (sharedElementTargetNames2.isEmpty() || (view5 = arrayMap4.get(sharedElementTargetNames2.get(i))) == null) {
|
||||
defaultSpecialEffectsController = this;
|
||||
view4 = view11;
|
||||
} else {
|
||||
defaultSpecialEffectsController = this;
|
||||
OneShotPreDrawListener.add(getContainer(), new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.7
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
fragmentTransitionImpl2.getBoundsOnScreen(view5, rect2);
|
||||
}
|
||||
});
|
||||
view4 = view11;
|
||||
z3 = true;
|
||||
}
|
||||
fragmentTransitionImpl2.setSharedElementTargets(wrapTransitionInSet, view4, arrayList4);
|
||||
rect = rect2;
|
||||
view3 = view4;
|
||||
arrayList3 = arrayList10;
|
||||
fragmentTransitionImpl = fragmentTransitionImpl2;
|
||||
fragmentTransitionImpl2.scheduleRemoveTargets(wrapTransitionInSet, null, null, null, null, wrapTransitionInSet, arrayList3);
|
||||
operation5 = operation;
|
||||
hashMap2 = hashMap4;
|
||||
hashMap2.put(operation5, true);
|
||||
operation4 = operation2;
|
||||
hashMap2.put(operation4, true);
|
||||
obj3 = wrapTransitionInSet;
|
||||
}
|
||||
}
|
||||
z2 = z;
|
||||
rect2 = rect;
|
||||
view6 = view3;
|
||||
arrayList8 = arrayList3;
|
||||
operation6 = operation5;
|
||||
hashMap3 = hashMap2;
|
||||
operation7 = operation4;
|
||||
fragmentTransitionImpl2 = fragmentTransitionImpl;
|
||||
arrayMap2 = arrayMap;
|
||||
ArrayList<View> arrayList11 = arrayList4;
|
||||
defaultSpecialEffectsController2 = defaultSpecialEffectsController;
|
||||
arrayList7 = arrayList11;
|
||||
}
|
||||
View view13 = view7;
|
||||
ArrayMap arrayMap5 = arrayMap2;
|
||||
SpecialEffectsController.Operation operation8 = operation7;
|
||||
FragmentTransitionImpl fragmentTransitionImpl3 = fragmentTransitionImpl2;
|
||||
boolean z4 = false;
|
||||
ArrayList<View> arrayList12 = arrayList8;
|
||||
HashMap hashMap5 = hashMap3;
|
||||
Rect rect3 = rect2;
|
||||
SpecialEffectsController.Operation operation9 = operation6;
|
||||
View view14 = view6;
|
||||
DefaultSpecialEffectsController defaultSpecialEffectsController5 = defaultSpecialEffectsController2;
|
||||
ArrayList<View> arrayList13 = arrayList7;
|
||||
ArrayList arrayList14 = new ArrayList();
|
||||
Iterator<TransitionInfo> it2 = list.iterator();
|
||||
Object obj4 = null;
|
||||
Object obj5 = null;
|
||||
while (it2.hasNext()) {
|
||||
TransitionInfo next = it2.next();
|
||||
if (next.isVisibilityUnchanged()) {
|
||||
it = it2;
|
||||
hashMap5.put(next.getOperation(), Boolean.valueOf(z4));
|
||||
next.completeSpecialEffect();
|
||||
} else {
|
||||
it = it2;
|
||||
Object cloneTransition = fragmentTransitionImpl3.cloneTransition(next.getTransition());
|
||||
SpecialEffectsController.Operation operation10 = next.getOperation();
|
||||
boolean z5 = obj3 != null && (operation10 == operation9 || operation10 == operation8);
|
||||
if (cloneTransition == null) {
|
||||
if (!z5) {
|
||||
hashMap5.put(operation10, Boolean.valueOf(z4));
|
||||
next.completeSpecialEffect();
|
||||
}
|
||||
arrayList = arrayList13;
|
||||
view = view14;
|
||||
arrayList2 = arrayList12;
|
||||
mergeTransitionsTogether = obj4;
|
||||
obj2 = obj5;
|
||||
hashMap = hashMap5;
|
||||
view2 = view13;
|
||||
} else {
|
||||
final ArrayList<View> arrayList15 = new ArrayList<>();
|
||||
Object obj6 = obj4;
|
||||
defaultSpecialEffectsController5.captureTransitioningViews(arrayList15, operation10.getFragment().mView);
|
||||
if (z5) {
|
||||
if (operation10 == operation9) {
|
||||
arrayList15.removeAll(arrayList13);
|
||||
} else {
|
||||
arrayList15.removeAll(arrayList12);
|
||||
}
|
||||
}
|
||||
if (arrayList15.isEmpty()) {
|
||||
fragmentTransitionImpl3.addTarget(cloneTransition, view14);
|
||||
arrayList = arrayList13;
|
||||
view = view14;
|
||||
arrayList2 = arrayList12;
|
||||
operation3 = operation10;
|
||||
obj2 = obj5;
|
||||
hashMap = hashMap5;
|
||||
obj = obj6;
|
||||
} else {
|
||||
fragmentTransitionImpl3.addTargets(cloneTransition, arrayList15);
|
||||
view = view14;
|
||||
obj = obj6;
|
||||
arrayList = arrayList13;
|
||||
obj2 = obj5;
|
||||
arrayList2 = arrayList12;
|
||||
hashMap = hashMap5;
|
||||
fragmentTransitionImpl3.scheduleRemoveTargets(cloneTransition, cloneTransition, arrayList15, null, null, null, null);
|
||||
if (operation10.getFinalState() == SpecialEffectsController.Operation.State.GONE) {
|
||||
operation3 = operation10;
|
||||
list2.remove(operation3);
|
||||
ArrayList<View> arrayList16 = new ArrayList<>(arrayList15);
|
||||
arrayList16.remove(operation3.getFragment().mView);
|
||||
fragmentTransitionImpl3.scheduleHideFragmentView(cloneTransition, operation3.getFragment().mView, arrayList16);
|
||||
OneShotPreDrawListener.add(getContainer(), new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.8
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
FragmentTransition.setViewVisibility(arrayList15, 4);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
operation3 = operation10;
|
||||
}
|
||||
}
|
||||
if (operation3.getFinalState() == SpecialEffectsController.Operation.State.VISIBLE) {
|
||||
arrayList14.addAll(arrayList15);
|
||||
if (z3) {
|
||||
fragmentTransitionImpl3.setEpicenter(cloneTransition, rect3);
|
||||
}
|
||||
view2 = view13;
|
||||
} else {
|
||||
view2 = view13;
|
||||
fragmentTransitionImpl3.setEpicenter(cloneTransition, view2);
|
||||
}
|
||||
hashMap.put(operation3, true);
|
||||
if (next.isOverlapAllowed()) {
|
||||
obj2 = fragmentTransitionImpl3.mergeTransitionsTogether(obj2, cloneTransition, null);
|
||||
mergeTransitionsTogether = obj;
|
||||
} else {
|
||||
mergeTransitionsTogether = fragmentTransitionImpl3.mergeTransitionsTogether(obj, cloneTransition, null);
|
||||
}
|
||||
}
|
||||
view13 = view2;
|
||||
obj5 = obj2;
|
||||
obj4 = mergeTransitionsTogether;
|
||||
hashMap5 = hashMap;
|
||||
view14 = view;
|
||||
arrayList13 = arrayList;
|
||||
arrayList12 = arrayList2;
|
||||
z4 = false;
|
||||
}
|
||||
it2 = it;
|
||||
}
|
||||
ArrayList<View> arrayList17 = arrayList13;
|
||||
ArrayList<View> arrayList18 = arrayList12;
|
||||
HashMap hashMap6 = hashMap5;
|
||||
Object mergeTransitionsInSequence = fragmentTransitionImpl3.mergeTransitionsInSequence(obj5, obj4, obj3);
|
||||
for (final TransitionInfo transitionInfo4 : list) {
|
||||
if (!transitionInfo4.isVisibilityUnchanged()) {
|
||||
Object transition = transitionInfo4.getTransition();
|
||||
SpecialEffectsController.Operation operation11 = transitionInfo4.getOperation();
|
||||
boolean z6 = obj3 != null && (operation11 == operation9 || operation11 == operation8);
|
||||
if (transition != null || z6) {
|
||||
if (!ViewCompat.isLaidOut(getContainer())) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Container " + getContainer() + " has not been laid out. Completing operation " + operation11);
|
||||
}
|
||||
transitionInfo4.completeSpecialEffect();
|
||||
} else {
|
||||
fragmentTransitionImpl3.setListenerForTransitionEnd(transitionInfo4.getOperation().getFragment(), mergeTransitionsInSequence, transitionInfo4.getSignal(), new Runnable() { // from class: androidx.fragment.app.DefaultSpecialEffectsController.9
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
transitionInfo4.completeSpecialEffect();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!ViewCompat.isLaidOut(getContainer())) {
|
||||
return hashMap6;
|
||||
}
|
||||
FragmentTransition.setViewVisibility(arrayList14, 4);
|
||||
ArrayList<String> prepareSetNameOverridesReordered = fragmentTransitionImpl3.prepareSetNameOverridesReordered(arrayList18);
|
||||
fragmentTransitionImpl3.beginDelayedTransition(getContainer(), mergeTransitionsInSequence);
|
||||
fragmentTransitionImpl3.setNameOverridesReordered(getContainer(), arrayList17, arrayList18, prepareSetNameOverridesReordered, arrayMap5);
|
||||
FragmentTransition.setViewVisibility(arrayList14, 0);
|
||||
fragmentTransitionImpl3.swapSharedElementTargets(obj3, arrayList17, arrayList18);
|
||||
return hashMap6;
|
||||
}
|
||||
|
||||
void retainMatchingViews(ArrayMap<String, View> arrayMap, Collection<String> collection) {
|
||||
Iterator<Map.Entry<String, View>> it = arrayMap.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
if (!collection.contains(ViewCompat.getTransitionName(it.next().getValue()))) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void captureTransitioningViews(ArrayList<View> arrayList, View view) {
|
||||
if (view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view;
|
||||
if (ViewGroupCompat.isTransitionGroup(viewGroup)) {
|
||||
if (arrayList.contains(view)) {
|
||||
return;
|
||||
}
|
||||
arrayList.add(viewGroup);
|
||||
return;
|
||||
}
|
||||
int childCount = viewGroup.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View childAt = viewGroup.getChildAt(i);
|
||||
if (childAt.getVisibility() == 0) {
|
||||
captureTransitioningViews(arrayList, childAt);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (arrayList.contains(view)) {
|
||||
return;
|
||||
}
|
||||
arrayList.add(view);
|
||||
}
|
||||
|
||||
void findNamedViews(Map<String, View> map, View view) {
|
||||
String transitionName = ViewCompat.getTransitionName(view);
|
||||
if (transitionName != null) {
|
||||
map.put(transitionName, view);
|
||||
}
|
||||
if (view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view;
|
||||
int childCount = viewGroup.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View childAt = viewGroup.getChildAt(i);
|
||||
if (childAt.getVisibility() == 0) {
|
||||
findNamedViews(map, childAt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void applyContainerChanges(SpecialEffectsController.Operation operation) {
|
||||
operation.getFinalState().applyState(operation.getFragment().mView);
|
||||
}
|
||||
|
||||
private static class SpecialEffectsInfo {
|
||||
private final SpecialEffectsController.Operation mOperation;
|
||||
private final CancellationSignal mSignal;
|
||||
|
||||
SpecialEffectsController.Operation getOperation() {
|
||||
return this.mOperation;
|
||||
}
|
||||
|
||||
CancellationSignal getSignal() {
|
||||
return this.mSignal;
|
||||
}
|
||||
|
||||
SpecialEffectsInfo(SpecialEffectsController.Operation operation, CancellationSignal cancellationSignal) {
|
||||
this.mOperation = operation;
|
||||
this.mSignal = cancellationSignal;
|
||||
}
|
||||
|
||||
boolean isVisibilityUnchanged() {
|
||||
SpecialEffectsController.Operation.State from = SpecialEffectsController.Operation.State.from(this.mOperation.getFragment().mView);
|
||||
SpecialEffectsController.Operation.State finalState = this.mOperation.getFinalState();
|
||||
return from == finalState || !(from == SpecialEffectsController.Operation.State.VISIBLE || finalState == SpecialEffectsController.Operation.State.VISIBLE);
|
||||
}
|
||||
|
||||
void completeSpecialEffect() {
|
||||
this.mOperation.completeSpecialEffect(this.mSignal);
|
||||
}
|
||||
}
|
||||
|
||||
private static class AnimationInfo extends SpecialEffectsInfo {
|
||||
private FragmentAnim.AnimationOrAnimator mAnimation;
|
||||
private boolean mIsPop;
|
||||
private boolean mLoadedAnim;
|
||||
|
||||
AnimationInfo(SpecialEffectsController.Operation operation, CancellationSignal cancellationSignal, boolean z) {
|
||||
super(operation, cancellationSignal);
|
||||
this.mLoadedAnim = false;
|
||||
this.mIsPop = z;
|
||||
}
|
||||
|
||||
FragmentAnim.AnimationOrAnimator getAnimation(Context context) {
|
||||
if (this.mLoadedAnim) {
|
||||
return this.mAnimation;
|
||||
}
|
||||
FragmentAnim.AnimationOrAnimator loadAnimation = FragmentAnim.loadAnimation(context, getOperation().getFragment(), getOperation().getFinalState() == SpecialEffectsController.Operation.State.VISIBLE, this.mIsPop);
|
||||
this.mAnimation = loadAnimation;
|
||||
this.mLoadedAnim = true;
|
||||
return loadAnimation;
|
||||
}
|
||||
}
|
||||
|
||||
private static class TransitionInfo extends SpecialEffectsInfo {
|
||||
private final boolean mOverlapAllowed;
|
||||
private final Object mSharedElementTransition;
|
||||
private final Object mTransition;
|
||||
|
||||
public Object getSharedElementTransition() {
|
||||
return this.mSharedElementTransition;
|
||||
}
|
||||
|
||||
Object getTransition() {
|
||||
return this.mTransition;
|
||||
}
|
||||
|
||||
public boolean hasSharedElementTransition() {
|
||||
return this.mSharedElementTransition != null;
|
||||
}
|
||||
|
||||
boolean isOverlapAllowed() {
|
||||
return this.mOverlapAllowed;
|
||||
}
|
||||
|
||||
TransitionInfo(SpecialEffectsController.Operation operation, CancellationSignal cancellationSignal, boolean z, boolean z2) {
|
||||
super(operation, cancellationSignal);
|
||||
Object exitTransition;
|
||||
Object enterTransition;
|
||||
boolean allowEnterTransitionOverlap;
|
||||
if (operation.getFinalState() == SpecialEffectsController.Operation.State.VISIBLE) {
|
||||
if (z) {
|
||||
enterTransition = operation.getFragment().getReenterTransition();
|
||||
} else {
|
||||
enterTransition = operation.getFragment().getEnterTransition();
|
||||
}
|
||||
this.mTransition = enterTransition;
|
||||
if (z) {
|
||||
allowEnterTransitionOverlap = operation.getFragment().getAllowReturnTransitionOverlap();
|
||||
} else {
|
||||
allowEnterTransitionOverlap = operation.getFragment().getAllowEnterTransitionOverlap();
|
||||
}
|
||||
this.mOverlapAllowed = allowEnterTransitionOverlap;
|
||||
} else {
|
||||
if (z) {
|
||||
exitTransition = operation.getFragment().getReturnTransition();
|
||||
} else {
|
||||
exitTransition = operation.getFragment().getExitTransition();
|
||||
}
|
||||
this.mTransition = exitTransition;
|
||||
this.mOverlapAllowed = true;
|
||||
}
|
||||
if (!z2) {
|
||||
this.mSharedElementTransition = null;
|
||||
} else if (z) {
|
||||
this.mSharedElementTransition = operation.getFragment().getSharedElementReturnTransition();
|
||||
} else {
|
||||
this.mSharedElementTransition = operation.getFragment().getSharedElementEnterTransition();
|
||||
}
|
||||
}
|
||||
|
||||
FragmentTransitionImpl getHandlingImpl() {
|
||||
FragmentTransitionImpl handlingImpl = getHandlingImpl(this.mTransition);
|
||||
FragmentTransitionImpl handlingImpl2 = getHandlingImpl(this.mSharedElementTransition);
|
||||
if (handlingImpl == null || handlingImpl2 == null || handlingImpl == handlingImpl2) {
|
||||
return handlingImpl != null ? handlingImpl : handlingImpl2;
|
||||
}
|
||||
throw new IllegalArgumentException("Mixing framework transitions and AndroidX transitions is not allowed. Fragment " + getOperation().getFragment() + " returned Transition " + this.mTransition + " which uses a different Transition type than its shared element transition " + this.mSharedElementTransition);
|
||||
}
|
||||
|
||||
private FragmentTransitionImpl getHandlingImpl(Object obj) {
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
if (FragmentTransition.PLATFORM_IMPL != null && FragmentTransition.PLATFORM_IMPL.canHandle(obj)) {
|
||||
return FragmentTransition.PLATFORM_IMPL;
|
||||
}
|
||||
if (FragmentTransition.SUPPORT_IMPL != null && FragmentTransition.SUPPORT_IMPL.canHandle(obj)) {
|
||||
return FragmentTransition.SUPPORT_IMPL;
|
||||
}
|
||||
throw new IllegalArgumentException("Transition " + obj + " for fragment " + getOperation().getFragment() + " is not a valid framework Transition or AndroidX Transition");
|
||||
}
|
||||
}
|
||||
}
|
510
02-Easy5/E5/sources/androidx/fragment/app/DialogFragment.java
Normal file
510
02-Easy5/E5/sources/androidx/fragment/app/DialogFragment.java
Normal file
@ -0,0 +1,510 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.R;
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewTreeLifecycleOwner;
|
||||
import androidx.lifecycle.ViewTreeViewModelStoreOwner;
|
||||
import androidx.savedstate.ViewTreeSavedStateRegistryOwner;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class DialogFragment extends Fragment implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
|
||||
private static final String SAVED_BACK_STACK_ID = "android:backStackId";
|
||||
private static final String SAVED_CANCELABLE = "android:cancelable";
|
||||
private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
|
||||
private static final String SAVED_INTERNAL_DIALOG_SHOWING = "android:dialogShowing";
|
||||
private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
|
||||
private static final String SAVED_STYLE = "android:style";
|
||||
private static final String SAVED_THEME = "android:theme";
|
||||
public static final int STYLE_NORMAL = 0;
|
||||
public static final int STYLE_NO_FRAME = 2;
|
||||
public static final int STYLE_NO_INPUT = 3;
|
||||
public static final int STYLE_NO_TITLE = 1;
|
||||
private int mBackStackId;
|
||||
private boolean mCancelable;
|
||||
private boolean mCreatingDialog;
|
||||
private Dialog mDialog;
|
||||
private boolean mDialogCreated;
|
||||
private Runnable mDismissRunnable;
|
||||
private boolean mDismissed;
|
||||
private Handler mHandler;
|
||||
private Observer<LifecycleOwner> mObserver;
|
||||
private DialogInterface.OnCancelListener mOnCancelListener;
|
||||
private DialogInterface.OnDismissListener mOnDismissListener;
|
||||
private boolean mShownByMe;
|
||||
private boolean mShowsDialog;
|
||||
private int mStyle;
|
||||
private int mTheme;
|
||||
private boolean mViewDestroyed;
|
||||
|
||||
public Dialog getDialog() {
|
||||
return this.mDialog;
|
||||
}
|
||||
|
||||
public boolean getShowsDialog() {
|
||||
return this.mShowsDialog;
|
||||
}
|
||||
|
||||
public int getTheme() {
|
||||
return this.mTheme;
|
||||
}
|
||||
|
||||
public boolean isCancelable() {
|
||||
return this.mCancelable;
|
||||
}
|
||||
|
||||
@Override // android.content.DialogInterface.OnCancelListener
|
||||
public void onCancel(DialogInterface dialogInterface) {
|
||||
}
|
||||
|
||||
boolean onHasView() {
|
||||
return this.mDialogCreated;
|
||||
}
|
||||
|
||||
public void setShowsDialog(boolean z) {
|
||||
this.mShowsDialog = z;
|
||||
}
|
||||
|
||||
public DialogFragment() {
|
||||
this.mDismissRunnable = new Runnable() { // from class: androidx.fragment.app.DialogFragment.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
DialogFragment.this.mOnDismissListener.onDismiss(DialogFragment.this.mDialog);
|
||||
}
|
||||
};
|
||||
this.mOnCancelListener = new DialogInterface.OnCancelListener() { // from class: androidx.fragment.app.DialogFragment.2
|
||||
@Override // android.content.DialogInterface.OnCancelListener
|
||||
public void onCancel(DialogInterface dialogInterface) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
DialogFragment dialogFragment = DialogFragment.this;
|
||||
dialogFragment.onCancel(dialogFragment.mDialog);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.mOnDismissListener = new DialogInterface.OnDismissListener() { // from class: androidx.fragment.app.DialogFragment.3
|
||||
@Override // android.content.DialogInterface.OnDismissListener
|
||||
public void onDismiss(DialogInterface dialogInterface) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
DialogFragment dialogFragment = DialogFragment.this;
|
||||
dialogFragment.onDismiss(dialogFragment.mDialog);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.mStyle = 0;
|
||||
this.mTheme = 0;
|
||||
this.mCancelable = true;
|
||||
this.mShowsDialog = true;
|
||||
this.mBackStackId = -1;
|
||||
this.mObserver = new Observer<LifecycleOwner>() { // from class: androidx.fragment.app.DialogFragment.4
|
||||
@Override // androidx.lifecycle.Observer
|
||||
public void onChanged(LifecycleOwner lifecycleOwner) {
|
||||
if (lifecycleOwner == null || !DialogFragment.this.mShowsDialog) {
|
||||
return;
|
||||
}
|
||||
View requireView = DialogFragment.this.requireView();
|
||||
if (requireView.getParent() == null) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d("FragmentManager", "DialogFragment " + this + " setting the content view on " + DialogFragment.this.mDialog);
|
||||
}
|
||||
DialogFragment.this.mDialog.setContentView(requireView);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
throw new IllegalStateException("DialogFragment can not be attached to a container view");
|
||||
}
|
||||
};
|
||||
this.mDialogCreated = false;
|
||||
}
|
||||
|
||||
public DialogFragment(int i) {
|
||||
super(i);
|
||||
this.mDismissRunnable = new Runnable() { // from class: androidx.fragment.app.DialogFragment.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
DialogFragment.this.mOnDismissListener.onDismiss(DialogFragment.this.mDialog);
|
||||
}
|
||||
};
|
||||
this.mOnCancelListener = new DialogInterface.OnCancelListener() { // from class: androidx.fragment.app.DialogFragment.2
|
||||
@Override // android.content.DialogInterface.OnCancelListener
|
||||
public void onCancel(DialogInterface dialogInterface) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
DialogFragment dialogFragment = DialogFragment.this;
|
||||
dialogFragment.onCancel(dialogFragment.mDialog);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.mOnDismissListener = new DialogInterface.OnDismissListener() { // from class: androidx.fragment.app.DialogFragment.3
|
||||
@Override // android.content.DialogInterface.OnDismissListener
|
||||
public void onDismiss(DialogInterface dialogInterface) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
DialogFragment dialogFragment = DialogFragment.this;
|
||||
dialogFragment.onDismiss(dialogFragment.mDialog);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.mStyle = 0;
|
||||
this.mTheme = 0;
|
||||
this.mCancelable = true;
|
||||
this.mShowsDialog = true;
|
||||
this.mBackStackId = -1;
|
||||
this.mObserver = new Observer<LifecycleOwner>() { // from class: androidx.fragment.app.DialogFragment.4
|
||||
@Override // androidx.lifecycle.Observer
|
||||
public void onChanged(LifecycleOwner lifecycleOwner) {
|
||||
if (lifecycleOwner == null || !DialogFragment.this.mShowsDialog) {
|
||||
return;
|
||||
}
|
||||
View requireView = DialogFragment.this.requireView();
|
||||
if (requireView.getParent() == null) {
|
||||
if (DialogFragment.this.mDialog != null) {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d("FragmentManager", "DialogFragment " + this + " setting the content view on " + DialogFragment.this.mDialog);
|
||||
}
|
||||
DialogFragment.this.mDialog.setContentView(requireView);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
throw new IllegalStateException("DialogFragment can not be attached to a container view");
|
||||
}
|
||||
};
|
||||
this.mDialogCreated = false;
|
||||
}
|
||||
|
||||
public void setStyle(int i, int i2) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.d("FragmentManager", "Setting style and theme for DialogFragment " + this + " to " + i + ", " + i2);
|
||||
}
|
||||
this.mStyle = i;
|
||||
if (i == 2 || i == 3) {
|
||||
this.mTheme = R.style.Theme.Panel;
|
||||
}
|
||||
if (i2 != 0) {
|
||||
this.mTheme = i2;
|
||||
}
|
||||
}
|
||||
|
||||
public void show(FragmentManager fragmentManager, String str) {
|
||||
this.mDismissed = false;
|
||||
this.mShownByMe = true;
|
||||
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
|
||||
beginTransaction.add(this, str);
|
||||
beginTransaction.commit();
|
||||
}
|
||||
|
||||
public int show(FragmentTransaction fragmentTransaction, String str) {
|
||||
this.mDismissed = false;
|
||||
this.mShownByMe = true;
|
||||
fragmentTransaction.add(this, str);
|
||||
this.mViewDestroyed = false;
|
||||
int commit = fragmentTransaction.commit();
|
||||
this.mBackStackId = commit;
|
||||
return commit;
|
||||
}
|
||||
|
||||
public void showNow(FragmentManager fragmentManager, String str) {
|
||||
this.mDismissed = false;
|
||||
this.mShownByMe = true;
|
||||
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
|
||||
beginTransaction.add(this, str);
|
||||
beginTransaction.commitNow();
|
||||
}
|
||||
|
||||
public void dismiss() {
|
||||
dismissInternal(false, false);
|
||||
}
|
||||
|
||||
public void dismissAllowingStateLoss() {
|
||||
dismissInternal(true, false);
|
||||
}
|
||||
|
||||
private void dismissInternal(boolean z, boolean z2) {
|
||||
if (this.mDismissed) {
|
||||
return;
|
||||
}
|
||||
this.mDismissed = true;
|
||||
this.mShownByMe = false;
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
dialog.setOnDismissListener(null);
|
||||
this.mDialog.dismiss();
|
||||
if (!z2) {
|
||||
if (Looper.myLooper() == this.mHandler.getLooper()) {
|
||||
onDismiss(this.mDialog);
|
||||
} else {
|
||||
this.mHandler.post(this.mDismissRunnable);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.mViewDestroyed = true;
|
||||
if (this.mBackStackId >= 0) {
|
||||
getParentFragmentManager().popBackStack(this.mBackStackId, 1);
|
||||
this.mBackStackId = -1;
|
||||
return;
|
||||
}
|
||||
FragmentTransaction beginTransaction = getParentFragmentManager().beginTransaction();
|
||||
beginTransaction.remove(this);
|
||||
if (z) {
|
||||
beginTransaction.commitAllowingStateLoss();
|
||||
} else {
|
||||
beginTransaction.commit();
|
||||
}
|
||||
}
|
||||
|
||||
public final Dialog requireDialog() {
|
||||
Dialog dialog = getDialog();
|
||||
if (dialog != null) {
|
||||
return dialog;
|
||||
}
|
||||
throw new IllegalStateException("DialogFragment " + this + " does not have a Dialog.");
|
||||
}
|
||||
|
||||
public void setCancelable(boolean z) {
|
||||
this.mCancelable = z;
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
dialog.setCancelable(z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
getViewLifecycleOwnerLiveData().observeForever(this.mObserver);
|
||||
if (this.mShownByMe) {
|
||||
return;
|
||||
}
|
||||
this.mDismissed = false;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onDetach() {
|
||||
super.onDetach();
|
||||
if (!this.mShownByMe && !this.mDismissed) {
|
||||
this.mDismissed = true;
|
||||
}
|
||||
getViewLifecycleOwnerLiveData().removeObserver(this.mObserver);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
this.mHandler = new Handler();
|
||||
this.mShowsDialog = this.mContainerId == 0;
|
||||
if (bundle != null) {
|
||||
this.mStyle = bundle.getInt(SAVED_STYLE, 0);
|
||||
this.mTheme = bundle.getInt(SAVED_THEME, 0);
|
||||
this.mCancelable = bundle.getBoolean(SAVED_CANCELABLE, true);
|
||||
this.mShowsDialog = bundle.getBoolean(SAVED_SHOWS_DIALOG, this.mShowsDialog);
|
||||
this.mBackStackId = bundle.getInt(SAVED_BACK_STACK_ID, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
void performCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
|
||||
Bundle bundle2;
|
||||
super.performCreateView(layoutInflater, viewGroup, bundle);
|
||||
if (this.mView != null || this.mDialog == null || bundle == null || (bundle2 = bundle.getBundle(SAVED_DIALOG_STATE_TAG)) == null) {
|
||||
return;
|
||||
}
|
||||
this.mDialog.onRestoreInstanceState(bundle2);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
FragmentContainer createFragmentContainer() {
|
||||
final FragmentContainer createFragmentContainer = super.createFragmentContainer();
|
||||
return new FragmentContainer() { // from class: androidx.fragment.app.DialogFragment.5
|
||||
@Override // androidx.fragment.app.FragmentContainer
|
||||
public View onFindViewById(int i) {
|
||||
if (createFragmentContainer.onHasView()) {
|
||||
return createFragmentContainer.onFindViewById(i);
|
||||
}
|
||||
return DialogFragment.this.onFindViewById(i);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentContainer
|
||||
public boolean onHasView() {
|
||||
return createFragmentContainer.onHasView() || DialogFragment.this.onHasView();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
View onFindViewById(int i) {
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
return dialog.findViewById(i);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public LayoutInflater onGetLayoutInflater(Bundle bundle) {
|
||||
LayoutInflater onGetLayoutInflater = super.onGetLayoutInflater(bundle);
|
||||
if (!this.mShowsDialog || this.mCreatingDialog) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
String str = "getting layout inflater for DialogFragment " + this;
|
||||
if (!this.mShowsDialog) {
|
||||
Log.d("FragmentManager", "mShowsDialog = false: " + str);
|
||||
} else {
|
||||
Log.d("FragmentManager", "mCreatingDialog = true: " + str);
|
||||
}
|
||||
}
|
||||
return onGetLayoutInflater;
|
||||
}
|
||||
prepareDialog(bundle);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.d("FragmentManager", "get layout inflater for DialogFragment " + this + " from dialog context");
|
||||
}
|
||||
Dialog dialog = this.mDialog;
|
||||
return dialog != null ? onGetLayoutInflater.cloneInContext(dialog.getContext()) : onGetLayoutInflater;
|
||||
}
|
||||
|
||||
public void setupDialog(Dialog dialog, int i) {
|
||||
if (i != 1 && i != 2) {
|
||||
if (i != 3) {
|
||||
return;
|
||||
}
|
||||
Window window = dialog.getWindow();
|
||||
if (window != null) {
|
||||
window.addFlags(24);
|
||||
}
|
||||
}
|
||||
dialog.requestWindowFeature(1);
|
||||
}
|
||||
|
||||
public Dialog onCreateDialog(Bundle bundle) {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d("FragmentManager", "onCreateDialog called for DialogFragment " + this);
|
||||
}
|
||||
return new Dialog(requireContext(), getTheme());
|
||||
}
|
||||
|
||||
@Override // android.content.DialogInterface.OnDismissListener
|
||||
public void onDismiss(DialogInterface dialogInterface) {
|
||||
if (this.mViewDestroyed) {
|
||||
return;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d("FragmentManager", "onDismiss called for DialogFragment " + this);
|
||||
}
|
||||
dismissInternal(true, true);
|
||||
}
|
||||
|
||||
private void prepareDialog(Bundle bundle) {
|
||||
if (this.mShowsDialog && !this.mDialogCreated) {
|
||||
try {
|
||||
this.mCreatingDialog = true;
|
||||
Dialog onCreateDialog = onCreateDialog(bundle);
|
||||
this.mDialog = onCreateDialog;
|
||||
if (this.mShowsDialog) {
|
||||
setupDialog(onCreateDialog, this.mStyle);
|
||||
Context context = getContext();
|
||||
if (context instanceof Activity) {
|
||||
this.mDialog.setOwnerActivity((Activity) context);
|
||||
}
|
||||
this.mDialog.setCancelable(this.mCancelable);
|
||||
this.mDialog.setOnCancelListener(this.mOnCancelListener);
|
||||
this.mDialog.setOnDismissListener(this.mOnDismissListener);
|
||||
this.mDialogCreated = true;
|
||||
} else {
|
||||
this.mDialog = null;
|
||||
}
|
||||
} finally {
|
||||
this.mCreatingDialog = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onViewStateRestored(Bundle bundle) {
|
||||
Bundle bundle2;
|
||||
super.onViewStateRestored(bundle);
|
||||
if (this.mDialog == null || bundle == null || (bundle2 = bundle.getBundle(SAVED_DIALOG_STATE_TAG)) == null) {
|
||||
return;
|
||||
}
|
||||
this.mDialog.onRestoreInstanceState(bundle2);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
this.mViewDestroyed = false;
|
||||
dialog.show();
|
||||
View decorView = this.mDialog.getWindow().getDecorView();
|
||||
ViewTreeLifecycleOwner.set(decorView, this);
|
||||
ViewTreeViewModelStoreOwner.set(decorView, this);
|
||||
ViewTreeSavedStateRegistryOwner.set(decorView, this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onSaveInstanceState(Bundle bundle) {
|
||||
super.onSaveInstanceState(bundle);
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
Bundle onSaveInstanceState = dialog.onSaveInstanceState();
|
||||
onSaveInstanceState.putBoolean(SAVED_INTERNAL_DIALOG_SHOWING, false);
|
||||
bundle.putBundle(SAVED_DIALOG_STATE_TAG, onSaveInstanceState);
|
||||
}
|
||||
int i = this.mStyle;
|
||||
if (i != 0) {
|
||||
bundle.putInt(SAVED_STYLE, i);
|
||||
}
|
||||
int i2 = this.mTheme;
|
||||
if (i2 != 0) {
|
||||
bundle.putInt(SAVED_THEME, i2);
|
||||
}
|
||||
boolean z = this.mCancelable;
|
||||
if (!z) {
|
||||
bundle.putBoolean(SAVED_CANCELABLE, z);
|
||||
}
|
||||
boolean z2 = this.mShowsDialog;
|
||||
if (!z2) {
|
||||
bundle.putBoolean(SAVED_SHOWS_DIALOG, z2);
|
||||
}
|
||||
int i3 = this.mBackStackId;
|
||||
if (i3 != -1) {
|
||||
bundle.putInt(SAVED_BACK_STACK_ID, i3);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
dialog.hide();
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
Dialog dialog = this.mDialog;
|
||||
if (dialog != null) {
|
||||
this.mViewDestroyed = true;
|
||||
dialog.setOnDismissListener(null);
|
||||
this.mDialog.dismiss();
|
||||
if (!this.mDismissed) {
|
||||
onDismiss(this.mDialog);
|
||||
}
|
||||
this.mDialog = null;
|
||||
this.mDialogCreated = false;
|
||||
}
|
||||
}
|
||||
}
|
1877
02-Easy5/E5/sources/androidx/fragment/app/Fragment.java
Normal file
1877
02-Easy5/E5/sources/androidx/fragment/app/Fragment.java
Normal file
File diff suppressed because it is too large
Load Diff
447
02-Easy5/E5/sources/androidx/fragment/app/FragmentActivity.java
Normal file
447
02-Easy5/E5/sources/androidx/fragment/app/FragmentActivity.java
Normal file
@ -0,0 +1,447 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import androidx.activity.ComponentActivity;
|
||||
import androidx.activity.OnBackPressedDispatcher;
|
||||
import androidx.activity.OnBackPressedDispatcherOwner;
|
||||
import androidx.activity.contextaware.OnContextAvailableListener;
|
||||
import androidx.activity.result.ActivityResultRegistry;
|
||||
import androidx.activity.result.ActivityResultRegistryOwner;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.app.SharedElementCallback;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.lifecycle.LifecycleRegistry;
|
||||
import androidx.lifecycle.ViewModelStore;
|
||||
import androidx.lifecycle.ViewModelStoreOwner;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.savedstate.SavedStateRegistry;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentActivity extends ComponentActivity implements ActivityCompat.OnRequestPermissionsResultCallback, ActivityCompat.RequestPermissionsRequestCodeValidator {
|
||||
static final String FRAGMENTS_TAG = "android:support:fragments";
|
||||
boolean mCreated;
|
||||
final LifecycleRegistry mFragmentLifecycleRegistry;
|
||||
final FragmentController mFragments;
|
||||
boolean mResumed;
|
||||
boolean mStopped;
|
||||
|
||||
@Deprecated
|
||||
public void onAttachFragment(Fragment fragment) {
|
||||
}
|
||||
|
||||
@Override // androidx.core.app.ActivityCompat.RequestPermissionsRequestCodeValidator
|
||||
@Deprecated
|
||||
public final void validateRequestPermissionsRequestCode(int i) {
|
||||
}
|
||||
|
||||
public FragmentActivity() {
|
||||
this.mFragments = FragmentController.createController(new HostCallbacks());
|
||||
this.mFragmentLifecycleRegistry = new LifecycleRegistry(this);
|
||||
this.mStopped = true;
|
||||
init();
|
||||
}
|
||||
|
||||
public FragmentActivity(int i) {
|
||||
super(i);
|
||||
this.mFragments = FragmentController.createController(new HostCallbacks());
|
||||
this.mFragmentLifecycleRegistry = new LifecycleRegistry(this);
|
||||
this.mStopped = true;
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
getSavedStateRegistry().registerSavedStateProvider(FRAGMENTS_TAG, new SavedStateRegistry.SavedStateProvider() { // from class: androidx.fragment.app.FragmentActivity.1
|
||||
@Override // androidx.savedstate.SavedStateRegistry.SavedStateProvider
|
||||
public Bundle saveState() {
|
||||
Bundle bundle = new Bundle();
|
||||
FragmentActivity.this.markFragmentsCreated();
|
||||
FragmentActivity.this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
|
||||
Parcelable saveAllState = FragmentActivity.this.mFragments.saveAllState();
|
||||
if (saveAllState != null) {
|
||||
bundle.putParcelable(FragmentActivity.FRAGMENTS_TAG, saveAllState);
|
||||
}
|
||||
return bundle;
|
||||
}
|
||||
});
|
||||
addOnContextAvailableListener(new OnContextAvailableListener() { // from class: androidx.fragment.app.FragmentActivity.2
|
||||
@Override // androidx.activity.contextaware.OnContextAvailableListener
|
||||
public void onContextAvailable(Context context) {
|
||||
FragmentActivity.this.mFragments.attachHost(null);
|
||||
Bundle consumeRestoredStateForKey = FragmentActivity.this.getSavedStateRegistry().consumeRestoredStateForKey(FragmentActivity.FRAGMENTS_TAG);
|
||||
if (consumeRestoredStateForKey != null) {
|
||||
FragmentActivity.this.mFragments.restoreSaveState(consumeRestoredStateForKey.getParcelable(FragmentActivity.FRAGMENTS_TAG));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity
|
||||
protected void onActivityResult(int i, int i2, Intent intent) {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onActivityResult(i, i2, intent);
|
||||
}
|
||||
|
||||
public void supportFinishAfterTransition() {
|
||||
ActivityCompat.finishAfterTransition(this);
|
||||
}
|
||||
|
||||
public void setEnterSharedElementCallback(SharedElementCallback sharedElementCallback) {
|
||||
ActivityCompat.setEnterSharedElementCallback(this, sharedElementCallback);
|
||||
}
|
||||
|
||||
public void setExitSharedElementCallback(SharedElementCallback sharedElementCallback) {
|
||||
ActivityCompat.setExitSharedElementCallback(this, sharedElementCallback);
|
||||
}
|
||||
|
||||
public void supportPostponeEnterTransition() {
|
||||
ActivityCompat.postponeEnterTransition(this);
|
||||
}
|
||||
|
||||
public void supportStartPostponedEnterTransition() {
|
||||
ActivityCompat.startPostponedEnterTransition(this);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity
|
||||
public void onMultiWindowModeChanged(boolean z) {
|
||||
this.mFragments.dispatchMultiWindowModeChanged(z);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity
|
||||
public void onPictureInPictureModeChanged(boolean z) {
|
||||
this.mFragments.dispatchPictureInPictureModeChanged(z);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity, android.content.ComponentCallbacks
|
||||
public void onConfigurationChanged(Configuration configuration) {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onConfigurationChanged(configuration);
|
||||
this.mFragments.dispatchConfigurationChanged(configuration);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
|
||||
protected void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
|
||||
this.mFragments.dispatchCreate();
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity, android.view.Window.Callback
|
||||
public boolean onCreatePanelMenu(int i, Menu menu) {
|
||||
if (i == 0) {
|
||||
return super.onCreatePanelMenu(i, menu) | this.mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
|
||||
}
|
||||
return super.onCreatePanelMenu(i, menu);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity, android.view.LayoutInflater.Factory2
|
||||
public View onCreateView(View view, String str, Context context, AttributeSet attributeSet) {
|
||||
View dispatchFragmentsOnCreateView = dispatchFragmentsOnCreateView(view, str, context, attributeSet);
|
||||
return dispatchFragmentsOnCreateView == null ? super.onCreateView(view, str, context, attributeSet) : dispatchFragmentsOnCreateView;
|
||||
}
|
||||
|
||||
@Override // android.app.Activity, android.view.LayoutInflater.Factory
|
||||
public View onCreateView(String str, Context context, AttributeSet attributeSet) {
|
||||
View dispatchFragmentsOnCreateView = dispatchFragmentsOnCreateView(null, str, context, attributeSet);
|
||||
return dispatchFragmentsOnCreateView == null ? super.onCreateView(str, context, attributeSet) : dispatchFragmentsOnCreateView;
|
||||
}
|
||||
|
||||
final View dispatchFragmentsOnCreateView(View view, String str, Context context, AttributeSet attributeSet) {
|
||||
return this.mFragments.onCreateView(view, str, context, attributeSet);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
this.mFragments.dispatchDestroy();
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity, android.content.ComponentCallbacks
|
||||
public void onLowMemory() {
|
||||
super.onLowMemory();
|
||||
this.mFragments.dispatchLowMemory();
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity, android.view.Window.Callback
|
||||
public boolean onMenuItemSelected(int i, MenuItem menuItem) {
|
||||
if (super.onMenuItemSelected(i, menuItem)) {
|
||||
return true;
|
||||
}
|
||||
if (i == 0) {
|
||||
return this.mFragments.dispatchOptionsItemSelected(menuItem);
|
||||
}
|
||||
if (i != 6) {
|
||||
return false;
|
||||
}
|
||||
return this.mFragments.dispatchContextItemSelected(menuItem);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity, android.view.Window.Callback
|
||||
public void onPanelClosed(int i, Menu menu) {
|
||||
if (i == 0) {
|
||||
this.mFragments.dispatchOptionsMenuClosed(menu);
|
||||
}
|
||||
super.onPanelClosed(i, menu);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
this.mResumed = false;
|
||||
this.mFragments.dispatchPause();
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity
|
||||
protected void onNewIntent(Intent intent) {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onNewIntent(intent);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
public void onStateNotSaved() {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onResume() {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onResume();
|
||||
this.mResumed = true;
|
||||
this.mFragments.execPendingActions();
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onPostResume() {
|
||||
super.onPostResume();
|
||||
onResumeFragments();
|
||||
}
|
||||
|
||||
protected void onResumeFragments() {
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
|
||||
this.mFragments.dispatchResume();
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity, android.view.Window.Callback
|
||||
public boolean onPreparePanel(int i, View view, Menu menu) {
|
||||
if (i == 0) {
|
||||
return onPrepareOptionsPanel(view, menu) | this.mFragments.dispatchPrepareOptionsMenu(menu);
|
||||
}
|
||||
return super.onPreparePanel(i, view, menu);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
|
||||
return super.onPreparePanel(0, view, menu);
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onStart() {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onStart();
|
||||
this.mStopped = false;
|
||||
if (!this.mCreated) {
|
||||
this.mCreated = true;
|
||||
this.mFragments.dispatchActivityCreated();
|
||||
}
|
||||
this.mFragments.execPendingActions();
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
|
||||
this.mFragments.dispatchStart();
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
this.mStopped = true;
|
||||
markFragmentsCreated();
|
||||
this.mFragments.dispatchStop();
|
||||
this.mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void supportInvalidateOptionsMenu() {
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override // android.app.Activity
|
||||
public void dump(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) {
|
||||
super.dump(str, fileDescriptor, printWriter, strArr);
|
||||
printWriter.print(str);
|
||||
printWriter.print("Local FragmentActivity ");
|
||||
printWriter.print(Integer.toHexString(System.identityHashCode(this)));
|
||||
printWriter.println(" State:");
|
||||
String str2 = str + " ";
|
||||
printWriter.print(str2);
|
||||
printWriter.print("mCreated=");
|
||||
printWriter.print(this.mCreated);
|
||||
printWriter.print(" mResumed=");
|
||||
printWriter.print(this.mResumed);
|
||||
printWriter.print(" mStopped=");
|
||||
printWriter.print(this.mStopped);
|
||||
if (getApplication() != null) {
|
||||
LoaderManager.getInstance(this).dump(str2, fileDescriptor, printWriter, strArr);
|
||||
}
|
||||
this.mFragments.getSupportFragmentManager().dump(str, fileDescriptor, printWriter, strArr);
|
||||
}
|
||||
|
||||
public FragmentManager getSupportFragmentManager() {
|
||||
return this.mFragments.getSupportFragmentManager();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public LoaderManager getSupportLoaderManager() {
|
||||
return LoaderManager.getInstance(this);
|
||||
}
|
||||
|
||||
@Override // androidx.activity.ComponentActivity, android.app.Activity
|
||||
public void onRequestPermissionsResult(int i, String[] strArr, int[] iArr) {
|
||||
this.mFragments.noteStateNotSaved();
|
||||
super.onRequestPermissionsResult(i, strArr, iArr);
|
||||
}
|
||||
|
||||
public void startActivityFromFragment(Fragment fragment, Intent intent, int i) {
|
||||
startActivityFromFragment(fragment, intent, i, (Bundle) null);
|
||||
}
|
||||
|
||||
public void startActivityFromFragment(Fragment fragment, Intent intent, int i, Bundle bundle) {
|
||||
if (i == -1) {
|
||||
ActivityCompat.startActivityForResult(this, intent, -1, bundle);
|
||||
} else {
|
||||
fragment.startActivityForResult(intent, i, bundle);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void startIntentSenderFromFragment(Fragment fragment, IntentSender intentSender, int i, Intent intent, int i2, int i3, int i4, Bundle bundle) throws IntentSender.SendIntentException {
|
||||
if (i == -1) {
|
||||
ActivityCompat.startIntentSenderForResult(this, intentSender, i, intent, i2, i3, i4, bundle);
|
||||
} else {
|
||||
fragment.startIntentSenderForResult(intentSender, i, intent, i2, i3, i4, bundle);
|
||||
}
|
||||
}
|
||||
|
||||
class HostCallbacks extends FragmentHostCallback<FragmentActivity> implements ViewModelStoreOwner, OnBackPressedDispatcherOwner, ActivityResultRegistryOwner, FragmentOnAttachListener {
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public FragmentActivity onGetHost() {
|
||||
return FragmentActivity.this;
|
||||
}
|
||||
|
||||
public HostCallbacks() {
|
||||
super(FragmentActivity.this);
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.LifecycleOwner
|
||||
public Lifecycle getLifecycle() {
|
||||
return FragmentActivity.this.mFragmentLifecycleRegistry;
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.ViewModelStoreOwner
|
||||
public ViewModelStore getViewModelStore() {
|
||||
return FragmentActivity.this.getViewModelStore();
|
||||
}
|
||||
|
||||
@Override // androidx.activity.OnBackPressedDispatcherOwner
|
||||
public OnBackPressedDispatcher getOnBackPressedDispatcher() {
|
||||
return FragmentActivity.this.getOnBackPressedDispatcher();
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public void onDump(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) {
|
||||
FragmentActivity.this.dump(str, fileDescriptor, printWriter, strArr);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public boolean onShouldSaveFragmentState(Fragment fragment) {
|
||||
return !FragmentActivity.this.isFinishing();
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public LayoutInflater onGetLayoutInflater() {
|
||||
return FragmentActivity.this.getLayoutInflater().cloneInContext(FragmentActivity.this);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public void onSupportInvalidateOptionsMenu() {
|
||||
FragmentActivity.this.supportInvalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public boolean onShouldShowRequestPermissionRationale(String str) {
|
||||
return ActivityCompat.shouldShowRequestPermissionRationale(FragmentActivity.this, str);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public boolean onHasWindowAnimations() {
|
||||
return FragmentActivity.this.getWindow() != null;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback
|
||||
public int onGetWindowAnimations() {
|
||||
Window window = FragmentActivity.this.getWindow();
|
||||
if (window == null) {
|
||||
return 0;
|
||||
}
|
||||
return window.getAttributes().windowAnimations;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentOnAttachListener
|
||||
public void onAttachFragment(FragmentManager fragmentManager, Fragment fragment) {
|
||||
FragmentActivity.this.onAttachFragment(fragment);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback, androidx.fragment.app.FragmentContainer
|
||||
public View onFindViewById(int i) {
|
||||
return FragmentActivity.this.findViewById(i);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentHostCallback, androidx.fragment.app.FragmentContainer
|
||||
public boolean onHasView() {
|
||||
Window window = FragmentActivity.this.getWindow();
|
||||
return (window == null || window.peekDecorView() == null) ? false : true;
|
||||
}
|
||||
|
||||
@Override // androidx.activity.result.ActivityResultRegistryOwner
|
||||
public ActivityResultRegistry getActivityResultRegistry() {
|
||||
return FragmentActivity.this.getActivityResultRegistry();
|
||||
}
|
||||
}
|
||||
|
||||
void markFragmentsCreated() {
|
||||
while (markState(getSupportFragmentManager(), Lifecycle.State.CREATED)) {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean markState(FragmentManager fragmentManager, Lifecycle.State state) {
|
||||
boolean z = false;
|
||||
for (Fragment fragment : fragmentManager.getFragments()) {
|
||||
if (fragment != null) {
|
||||
if (fragment.getHost() != null) {
|
||||
z |= markState(fragment.getChildFragmentManager(), state);
|
||||
}
|
||||
if (fragment.mViewLifecycleOwner != null && fragment.mViewLifecycleOwner.getLifecycle().getState().isAtLeast(Lifecycle.State.STARTED)) {
|
||||
fragment.mViewLifecycleOwner.setCurrentState(state);
|
||||
z = true;
|
||||
}
|
||||
if (fragment.mLifecycleRegistry.getState().isAtLeast(Lifecycle.State.STARTED)) {
|
||||
fragment.mLifecycleRegistry.setCurrentState(state);
|
||||
z = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return z;
|
||||
}
|
||||
}
|
239
02-Easy5/E5/sources/androidx/fragment/app/FragmentAnim.java
Normal file
239
02-Easy5/E5/sources/androidx/fragment/app/FragmentAnim.java
Normal file
@ -0,0 +1,239 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorInflater;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationSet;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.view.animation.Transformation;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import androidx.core.view.OneShotPreDrawListener;
|
||||
import androidx.fragment.R;
|
||||
import androidx.fragment.app.FragmentTransition;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentAnim {
|
||||
private FragmentAnim() {
|
||||
}
|
||||
|
||||
static AnimationOrAnimator loadAnimation(Context context, Fragment fragment, boolean z, boolean z2) {
|
||||
int nextTransition = fragment.getNextTransition();
|
||||
int nextAnim = getNextAnim(fragment, z, z2);
|
||||
fragment.setAnimations(0, 0, 0, 0);
|
||||
if (fragment.mContainer != null && fragment.mContainer.getTag(R.id.visible_removing_fragment_view_tag) != null) {
|
||||
fragment.mContainer.setTag(R.id.visible_removing_fragment_view_tag, null);
|
||||
}
|
||||
if (fragment.mContainer != null && fragment.mContainer.getLayoutTransition() != null) {
|
||||
return null;
|
||||
}
|
||||
Animation onCreateAnimation = fragment.onCreateAnimation(nextTransition, z, nextAnim);
|
||||
if (onCreateAnimation != null) {
|
||||
return new AnimationOrAnimator(onCreateAnimation);
|
||||
}
|
||||
Animator onCreateAnimator = fragment.onCreateAnimator(nextTransition, z, nextAnim);
|
||||
if (onCreateAnimator != null) {
|
||||
return new AnimationOrAnimator(onCreateAnimator);
|
||||
}
|
||||
if (nextAnim == 0 && nextTransition != 0) {
|
||||
nextAnim = transitToAnimResourceId(nextTransition, z);
|
||||
}
|
||||
if (nextAnim != 0) {
|
||||
boolean equals = "anim".equals(context.getResources().getResourceTypeName(nextAnim));
|
||||
if (equals) {
|
||||
try {
|
||||
Animation loadAnimation = AnimationUtils.loadAnimation(context, nextAnim);
|
||||
if (loadAnimation != null) {
|
||||
return new AnimationOrAnimator(loadAnimation);
|
||||
}
|
||||
} catch (Resources.NotFoundException e) {
|
||||
throw e;
|
||||
} catch (RuntimeException unused) {
|
||||
}
|
||||
}
|
||||
try {
|
||||
Animator loadAnimator = AnimatorInflater.loadAnimator(context, nextAnim);
|
||||
if (loadAnimator != null) {
|
||||
return new AnimationOrAnimator(loadAnimator);
|
||||
}
|
||||
} catch (RuntimeException e2) {
|
||||
if (equals) {
|
||||
throw e2;
|
||||
}
|
||||
Animation loadAnimation2 = AnimationUtils.loadAnimation(context, nextAnim);
|
||||
if (loadAnimation2 != null) {
|
||||
return new AnimationOrAnimator(loadAnimation2);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static int getNextAnim(Fragment fragment, boolean z, boolean z2) {
|
||||
if (z2) {
|
||||
if (z) {
|
||||
return fragment.getPopEnterAnim();
|
||||
}
|
||||
return fragment.getPopExitAnim();
|
||||
}
|
||||
if (z) {
|
||||
return fragment.getEnterAnim();
|
||||
}
|
||||
return fragment.getExitAnim();
|
||||
}
|
||||
|
||||
static void animateRemoveFragment(final Fragment fragment, AnimationOrAnimator animationOrAnimator, final FragmentTransition.Callback callback) {
|
||||
final View view = fragment.mView;
|
||||
final ViewGroup viewGroup = fragment.mContainer;
|
||||
viewGroup.startViewTransition(view);
|
||||
final CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() { // from class: androidx.fragment.app.FragmentAnim.1
|
||||
@Override // androidx.core.os.CancellationSignal.OnCancelListener
|
||||
public void onCancel() {
|
||||
if (Fragment.this.getAnimatingAway() != null) {
|
||||
View animatingAway = Fragment.this.getAnimatingAway();
|
||||
Fragment.this.setAnimatingAway(null);
|
||||
animatingAway.clearAnimation();
|
||||
}
|
||||
Fragment.this.setAnimator(null);
|
||||
}
|
||||
});
|
||||
callback.onStart(fragment, cancellationSignal);
|
||||
if (animationOrAnimator.animation != null) {
|
||||
EndViewTransitionAnimation endViewTransitionAnimation = new EndViewTransitionAnimation(animationOrAnimator.animation, viewGroup, view);
|
||||
fragment.setAnimatingAway(fragment.mView);
|
||||
endViewTransitionAnimation.setAnimationListener(new Animation.AnimationListener() { // from class: androidx.fragment.app.FragmentAnim.2
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationRepeat(Animation animation) {
|
||||
}
|
||||
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationStart(Animation animation) {
|
||||
}
|
||||
|
||||
@Override // android.view.animation.Animation.AnimationListener
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
viewGroup.post(new Runnable() { // from class: androidx.fragment.app.FragmentAnim.2.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (fragment.getAnimatingAway() != null) {
|
||||
fragment.setAnimatingAway(null);
|
||||
callback.onComplete(fragment, cancellationSignal);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
fragment.mView.startAnimation(endViewTransitionAnimation);
|
||||
return;
|
||||
}
|
||||
Animator animator = animationOrAnimator.animator;
|
||||
fragment.setAnimator(animationOrAnimator.animator);
|
||||
animator.addListener(new AnimatorListenerAdapter() { // from class: androidx.fragment.app.FragmentAnim.3
|
||||
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
||||
public void onAnimationEnd(Animator animator2) {
|
||||
viewGroup.endViewTransition(view);
|
||||
Animator animator3 = fragment.getAnimator();
|
||||
fragment.setAnimator(null);
|
||||
if (animator3 == null || viewGroup.indexOfChild(view) >= 0) {
|
||||
return;
|
||||
}
|
||||
callback.onComplete(fragment, cancellationSignal);
|
||||
}
|
||||
});
|
||||
animator.setTarget(fragment.mView);
|
||||
animator.start();
|
||||
}
|
||||
|
||||
private static int transitToAnimResourceId(int i, boolean z) {
|
||||
if (i == 4097) {
|
||||
return z ? R.animator.fragment_open_enter : R.animator.fragment_open_exit;
|
||||
}
|
||||
if (i == 4099) {
|
||||
return z ? R.animator.fragment_fade_enter : R.animator.fragment_fade_exit;
|
||||
}
|
||||
if (i != 8194) {
|
||||
return -1;
|
||||
}
|
||||
return z ? R.animator.fragment_close_enter : R.animator.fragment_close_exit;
|
||||
}
|
||||
|
||||
static class AnimationOrAnimator {
|
||||
public final Animation animation;
|
||||
public final Animator animator;
|
||||
|
||||
AnimationOrAnimator(Animation animation) {
|
||||
this.animation = animation;
|
||||
this.animator = null;
|
||||
if (animation == null) {
|
||||
throw new IllegalStateException("Animation cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
AnimationOrAnimator(Animator animator) {
|
||||
this.animation = null;
|
||||
this.animator = animator;
|
||||
if (animator == null) {
|
||||
throw new IllegalStateException("Animator cannot be null");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class EndViewTransitionAnimation extends AnimationSet implements Runnable {
|
||||
private boolean mAnimating;
|
||||
private final View mChild;
|
||||
private boolean mEnded;
|
||||
private final ViewGroup mParent;
|
||||
private boolean mTransitionEnded;
|
||||
|
||||
EndViewTransitionAnimation(Animation animation, ViewGroup viewGroup, View view) {
|
||||
super(false);
|
||||
this.mAnimating = true;
|
||||
this.mParent = viewGroup;
|
||||
this.mChild = view;
|
||||
addAnimation(animation);
|
||||
viewGroup.post(this);
|
||||
}
|
||||
|
||||
@Override // android.view.animation.AnimationSet, android.view.animation.Animation
|
||||
public boolean getTransformation(long j, Transformation transformation) {
|
||||
this.mAnimating = true;
|
||||
if (this.mEnded) {
|
||||
return !this.mTransitionEnded;
|
||||
}
|
||||
if (!super.getTransformation(j, transformation)) {
|
||||
this.mEnded = true;
|
||||
OneShotPreDrawListener.add(this.mParent, this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override // android.view.animation.Animation
|
||||
public boolean getTransformation(long j, Transformation transformation, float f) {
|
||||
this.mAnimating = true;
|
||||
if (this.mEnded) {
|
||||
return !this.mTransitionEnded;
|
||||
}
|
||||
if (!super.getTransformation(j, transformation, f)) {
|
||||
this.mEnded = true;
|
||||
OneShotPreDrawListener.add(this.mParent, this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (!this.mEnded && this.mAnimating) {
|
||||
this.mAnimating = false;
|
||||
this.mParent.post(this);
|
||||
} else {
|
||||
this.mParent.endViewTransition(this.mChild);
|
||||
this.mTransitionEnded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentContainer {
|
||||
public abstract View onFindViewById(int i);
|
||||
|
||||
public abstract boolean onHasView();
|
||||
|
||||
@Deprecated
|
||||
public Fragment instantiate(Context context, String str, Bundle bundle) {
|
||||
return Fragment.instantiate(context, str, bundle);
|
||||
}
|
||||
}
|
@ -0,0 +1,239 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.animation.LayoutTransition;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.os.Bundle;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.FrameLayout;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
import androidx.fragment.R;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public final class FragmentContainerView extends FrameLayout {
|
||||
private View.OnApplyWindowInsetsListener mApplyWindowInsetsListener;
|
||||
private ArrayList<View> mDisappearingFragmentChildren;
|
||||
private boolean mDrawDisappearingViewsFirst;
|
||||
private ArrayList<View> mTransitioningFragmentViews;
|
||||
|
||||
@Override // android.view.View
|
||||
public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
|
||||
return windowInsets;
|
||||
}
|
||||
|
||||
void setDrawDisappearingViewsLast(boolean z) {
|
||||
this.mDrawDisappearingViewsFirst = z;
|
||||
}
|
||||
|
||||
@Override // android.view.View
|
||||
public void setOnApplyWindowInsetsListener(View.OnApplyWindowInsetsListener onApplyWindowInsetsListener) {
|
||||
this.mApplyWindowInsetsListener = onApplyWindowInsetsListener;
|
||||
}
|
||||
|
||||
public FragmentContainerView(Context context) {
|
||||
super(context);
|
||||
this.mDrawDisappearingViewsFirst = true;
|
||||
}
|
||||
|
||||
public FragmentContainerView(Context context, AttributeSet attributeSet) {
|
||||
this(context, attributeSet, 0);
|
||||
}
|
||||
|
||||
public FragmentContainerView(Context context, AttributeSet attributeSet, int i) {
|
||||
super(context, attributeSet, i);
|
||||
String str;
|
||||
this.mDrawDisappearingViewsFirst = true;
|
||||
if (attributeSet != null) {
|
||||
String classAttribute = attributeSet.getClassAttribute();
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, R.styleable.FragmentContainerView);
|
||||
if (classAttribute == null) {
|
||||
classAttribute = obtainStyledAttributes.getString(R.styleable.FragmentContainerView_android_name);
|
||||
str = "android:name";
|
||||
} else {
|
||||
str = "class";
|
||||
}
|
||||
obtainStyledAttributes.recycle();
|
||||
if (classAttribute == null || isInEditMode()) {
|
||||
return;
|
||||
}
|
||||
throw new UnsupportedOperationException("FragmentContainerView must be within a FragmentActivity to use " + str + "=\"" + classAttribute + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
FragmentContainerView(Context context, AttributeSet attributeSet, FragmentManager fragmentManager) {
|
||||
super(context, attributeSet);
|
||||
String str;
|
||||
this.mDrawDisappearingViewsFirst = true;
|
||||
String classAttribute = attributeSet.getClassAttribute();
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, R.styleable.FragmentContainerView);
|
||||
classAttribute = classAttribute == null ? obtainStyledAttributes.getString(R.styleable.FragmentContainerView_android_name) : classAttribute;
|
||||
String string = obtainStyledAttributes.getString(R.styleable.FragmentContainerView_android_tag);
|
||||
obtainStyledAttributes.recycle();
|
||||
int id = getId();
|
||||
Fragment findFragmentById = fragmentManager.findFragmentById(id);
|
||||
if (classAttribute != null && findFragmentById == null) {
|
||||
if (id <= 0) {
|
||||
if (string != null) {
|
||||
str = " with tag " + string;
|
||||
} else {
|
||||
str = "";
|
||||
}
|
||||
throw new IllegalStateException("FragmentContainerView must have an android:id to add Fragment " + classAttribute + str);
|
||||
}
|
||||
Fragment instantiate = fragmentManager.getFragmentFactory().instantiate(context.getClassLoader(), classAttribute);
|
||||
instantiate.onInflate(context, attributeSet, (Bundle) null);
|
||||
fragmentManager.beginTransaction().setReorderingAllowed(true).add(this, instantiate, string).commitNowAllowingStateLoss();
|
||||
}
|
||||
fragmentManager.onContainerAvailable(this);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void setLayoutTransition(LayoutTransition layoutTransition) {
|
||||
throw new UnsupportedOperationException("FragmentContainerView does not support Layout Transitions or animateLayoutChanges=\"true\".");
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup, android.view.View
|
||||
public WindowInsets dispatchApplyWindowInsets(WindowInsets windowInsets) {
|
||||
WindowInsetsCompat onApplyWindowInsets;
|
||||
WindowInsetsCompat windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(windowInsets);
|
||||
View.OnApplyWindowInsetsListener onApplyWindowInsetsListener = this.mApplyWindowInsetsListener;
|
||||
if (onApplyWindowInsetsListener != null) {
|
||||
onApplyWindowInsets = WindowInsetsCompat.toWindowInsetsCompat(onApplyWindowInsetsListener.onApplyWindowInsets(this, windowInsets));
|
||||
} else {
|
||||
onApplyWindowInsets = ViewCompat.onApplyWindowInsets(this, windowInsetsCompat);
|
||||
}
|
||||
if (!onApplyWindowInsets.isConsumed()) {
|
||||
int childCount = getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
ViewCompat.dispatchApplyWindowInsets(getChildAt(i), onApplyWindowInsets);
|
||||
}
|
||||
}
|
||||
return windowInsets;
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup, android.view.View
|
||||
protected void dispatchDraw(Canvas canvas) {
|
||||
if (this.mDrawDisappearingViewsFirst && this.mDisappearingFragmentChildren != null) {
|
||||
for (int i = 0; i < this.mDisappearingFragmentChildren.size(); i++) {
|
||||
super.drawChild(canvas, this.mDisappearingFragmentChildren.get(i), getDrawingTime());
|
||||
}
|
||||
}
|
||||
super.dispatchDraw(canvas);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
protected boolean drawChild(Canvas canvas, View view, long j) {
|
||||
ArrayList<View> arrayList;
|
||||
if (!this.mDrawDisappearingViewsFirst || (arrayList = this.mDisappearingFragmentChildren) == null || arrayList.size() <= 0 || !this.mDisappearingFragmentChildren.contains(view)) {
|
||||
return super.drawChild(canvas, view, j);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void startViewTransition(View view) {
|
||||
if (view.getParent() == this) {
|
||||
if (this.mTransitioningFragmentViews == null) {
|
||||
this.mTransitioningFragmentViews = new ArrayList<>();
|
||||
}
|
||||
this.mTransitioningFragmentViews.add(view);
|
||||
}
|
||||
super.startViewTransition(view);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void endViewTransition(View view) {
|
||||
ArrayList<View> arrayList = this.mTransitioningFragmentViews;
|
||||
if (arrayList != null) {
|
||||
arrayList.remove(view);
|
||||
ArrayList<View> arrayList2 = this.mDisappearingFragmentChildren;
|
||||
if (arrayList2 != null && arrayList2.remove(view)) {
|
||||
this.mDrawDisappearingViewsFirst = true;
|
||||
}
|
||||
}
|
||||
super.endViewTransition(view);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void addView(View view, int i, ViewGroup.LayoutParams layoutParams) {
|
||||
if (FragmentManager.getViewFragment(view) == null) {
|
||||
throw new IllegalStateException("Views added to a FragmentContainerView must be associated with a Fragment. View " + view + " is not associated with a Fragment.");
|
||||
}
|
||||
super.addView(view, i, layoutParams);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
protected boolean addViewInLayout(View view, int i, ViewGroup.LayoutParams layoutParams, boolean z) {
|
||||
if (FragmentManager.getViewFragment(view) == null) {
|
||||
throw new IllegalStateException("Views added to a FragmentContainerView must be associated with a Fragment. View " + view + " is not associated with a Fragment.");
|
||||
}
|
||||
return super.addViewInLayout(view, i, layoutParams, z);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void removeViewAt(int i) {
|
||||
addDisappearingFragmentView(getChildAt(i));
|
||||
super.removeViewAt(i);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void removeViewInLayout(View view) {
|
||||
addDisappearingFragmentView(view);
|
||||
super.removeViewInLayout(view);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup, android.view.ViewManager
|
||||
public void removeView(View view) {
|
||||
addDisappearingFragmentView(view);
|
||||
super.removeView(view);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void removeViews(int i, int i2) {
|
||||
for (int i3 = i; i3 < i + i2; i3++) {
|
||||
addDisappearingFragmentView(getChildAt(i3));
|
||||
}
|
||||
super.removeViews(i, i2);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void removeViewsInLayout(int i, int i2) {
|
||||
for (int i3 = i; i3 < i + i2; i3++) {
|
||||
addDisappearingFragmentView(getChildAt(i3));
|
||||
}
|
||||
super.removeViewsInLayout(i, i2);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
public void removeAllViewsInLayout() {
|
||||
for (int childCount = getChildCount() - 1; childCount >= 0; childCount--) {
|
||||
addDisappearingFragmentView(getChildAt(childCount));
|
||||
}
|
||||
super.removeAllViewsInLayout();
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup
|
||||
protected void removeDetachedView(View view, boolean z) {
|
||||
if (z) {
|
||||
addDisappearingFragmentView(view);
|
||||
}
|
||||
super.removeDetachedView(view, z);
|
||||
}
|
||||
|
||||
private void addDisappearingFragmentView(View view) {
|
||||
ArrayList<View> arrayList = this.mTransitioningFragmentViews;
|
||||
if (arrayList == null || !arrayList.contains(view)) {
|
||||
return;
|
||||
}
|
||||
if (this.mDisappearingFragmentChildren == null) {
|
||||
this.mDisappearingFragmentChildren = new ArrayList<>();
|
||||
}
|
||||
this.mDisappearingFragmentChildren.add(view);
|
||||
}
|
||||
}
|
@ -0,0 +1,211 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import androidx.collection.SimpleArrayMap;
|
||||
import androidx.core.util.Preconditions;
|
||||
import androidx.lifecycle.ViewModelStoreOwner;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentController {
|
||||
private final FragmentHostCallback<?> mHost;
|
||||
|
||||
@Deprecated
|
||||
public void dispatchReallyStop() {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void doLoaderDestroy() {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void doLoaderRetain() {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void doLoaderStart() {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void doLoaderStop(boolean z) {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void dumpLoaders(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void reportLoaderStart() {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void restoreLoaderNonConfig(SimpleArrayMap<String, LoaderManager> simpleArrayMap) {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public SimpleArrayMap<String, LoaderManager> retainLoaderNonConfig() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static FragmentController createController(FragmentHostCallback<?> fragmentHostCallback) {
|
||||
return new FragmentController((FragmentHostCallback) Preconditions.checkNotNull(fragmentHostCallback, "callbacks == null"));
|
||||
}
|
||||
|
||||
private FragmentController(FragmentHostCallback<?> fragmentHostCallback) {
|
||||
this.mHost = fragmentHostCallback;
|
||||
}
|
||||
|
||||
public FragmentManager getSupportFragmentManager() {
|
||||
return this.mHost.mFragmentManager;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public LoaderManager getSupportLoaderManager() {
|
||||
throw new UnsupportedOperationException("Loaders are managed separately from FragmentController, use LoaderManager.getInstance() to obtain a LoaderManager.");
|
||||
}
|
||||
|
||||
public Fragment findFragmentByWho(String str) {
|
||||
return this.mHost.mFragmentManager.findFragmentByWho(str);
|
||||
}
|
||||
|
||||
public int getActiveFragmentsCount() {
|
||||
return this.mHost.mFragmentManager.getActiveFragmentCount();
|
||||
}
|
||||
|
||||
public List<Fragment> getActiveFragments(List<Fragment> list) {
|
||||
return this.mHost.mFragmentManager.getActiveFragments();
|
||||
}
|
||||
|
||||
public void attachHost(Fragment fragment) {
|
||||
FragmentManager fragmentManager = this.mHost.mFragmentManager;
|
||||
FragmentHostCallback<?> fragmentHostCallback = this.mHost;
|
||||
fragmentManager.attachController(fragmentHostCallback, fragmentHostCallback, fragment);
|
||||
}
|
||||
|
||||
public View onCreateView(View view, String str, Context context, AttributeSet attributeSet) {
|
||||
return this.mHost.mFragmentManager.getLayoutInflaterFactory().onCreateView(view, str, context, attributeSet);
|
||||
}
|
||||
|
||||
public void noteStateNotSaved() {
|
||||
this.mHost.mFragmentManager.noteStateNotSaved();
|
||||
}
|
||||
|
||||
public Parcelable saveAllState() {
|
||||
return this.mHost.mFragmentManager.saveAllState();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void restoreAllState(Parcelable parcelable, List<Fragment> list) {
|
||||
this.mHost.mFragmentManager.restoreAllState(parcelable, new FragmentManagerNonConfig(list, null, null));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void restoreAllState(Parcelable parcelable, FragmentManagerNonConfig fragmentManagerNonConfig) {
|
||||
this.mHost.mFragmentManager.restoreAllState(parcelable, fragmentManagerNonConfig);
|
||||
}
|
||||
|
||||
public void restoreSaveState(Parcelable parcelable) {
|
||||
FragmentHostCallback<?> fragmentHostCallback = this.mHost;
|
||||
if (!(fragmentHostCallback instanceof ViewModelStoreOwner)) {
|
||||
throw new IllegalStateException("Your FragmentHostCallback must implement ViewModelStoreOwner to call restoreSaveState(). Call restoreAllState() if you're still using retainNestedNonConfig().");
|
||||
}
|
||||
fragmentHostCallback.mFragmentManager.restoreSaveState(parcelable);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public List<Fragment> retainNonConfig() {
|
||||
FragmentManagerNonConfig retainNonConfig = this.mHost.mFragmentManager.retainNonConfig();
|
||||
if (retainNonConfig == null || retainNonConfig.getFragments() == null) {
|
||||
return null;
|
||||
}
|
||||
return new ArrayList(retainNonConfig.getFragments());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentManagerNonConfig retainNestedNonConfig() {
|
||||
return this.mHost.mFragmentManager.retainNonConfig();
|
||||
}
|
||||
|
||||
public void dispatchCreate() {
|
||||
this.mHost.mFragmentManager.dispatchCreate();
|
||||
}
|
||||
|
||||
public void dispatchActivityCreated() {
|
||||
this.mHost.mFragmentManager.dispatchActivityCreated();
|
||||
}
|
||||
|
||||
public void dispatchStart() {
|
||||
this.mHost.mFragmentManager.dispatchStart();
|
||||
}
|
||||
|
||||
public void dispatchResume() {
|
||||
this.mHost.mFragmentManager.dispatchResume();
|
||||
}
|
||||
|
||||
public void dispatchPause() {
|
||||
this.mHost.mFragmentManager.dispatchPause();
|
||||
}
|
||||
|
||||
public void dispatchStop() {
|
||||
this.mHost.mFragmentManager.dispatchStop();
|
||||
}
|
||||
|
||||
public void dispatchDestroyView() {
|
||||
this.mHost.mFragmentManager.dispatchDestroyView();
|
||||
}
|
||||
|
||||
public void dispatchDestroy() {
|
||||
this.mHost.mFragmentManager.dispatchDestroy();
|
||||
}
|
||||
|
||||
public void dispatchMultiWindowModeChanged(boolean z) {
|
||||
this.mHost.mFragmentManager.dispatchMultiWindowModeChanged(z);
|
||||
}
|
||||
|
||||
public void dispatchPictureInPictureModeChanged(boolean z) {
|
||||
this.mHost.mFragmentManager.dispatchPictureInPictureModeChanged(z);
|
||||
}
|
||||
|
||||
public void dispatchConfigurationChanged(Configuration configuration) {
|
||||
this.mHost.mFragmentManager.dispatchConfigurationChanged(configuration);
|
||||
}
|
||||
|
||||
public void dispatchLowMemory() {
|
||||
this.mHost.mFragmentManager.dispatchLowMemory();
|
||||
}
|
||||
|
||||
public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
|
||||
return this.mHost.mFragmentManager.dispatchCreateOptionsMenu(menu, menuInflater);
|
||||
}
|
||||
|
||||
public boolean dispatchPrepareOptionsMenu(Menu menu) {
|
||||
return this.mHost.mFragmentManager.dispatchPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
public boolean dispatchOptionsItemSelected(MenuItem menuItem) {
|
||||
return this.mHost.mFragmentManager.dispatchOptionsItemSelected(menuItem);
|
||||
}
|
||||
|
||||
public boolean dispatchContextItemSelected(MenuItem menuItem) {
|
||||
return this.mHost.mFragmentManager.dispatchContextItemSelected(menuItem);
|
||||
}
|
||||
|
||||
public void dispatchOptionsMenuClosed(Menu menu) {
|
||||
this.mHost.mFragmentManager.dispatchOptionsMenuClosed(menu);
|
||||
}
|
||||
|
||||
public boolean execPendingActions() {
|
||||
return this.mHost.mFragmentManager.execPendingActions(true);
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import androidx.collection.SimpleArrayMap;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentFactory {
|
||||
private static final SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> sClassCacheMap = new SimpleArrayMap<>();
|
||||
|
||||
private static Class<?> loadClass(ClassLoader classLoader, String str) throws ClassNotFoundException {
|
||||
SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> simpleArrayMap = sClassCacheMap;
|
||||
SimpleArrayMap<String, Class<?>> simpleArrayMap2 = simpleArrayMap.get(classLoader);
|
||||
if (simpleArrayMap2 == null) {
|
||||
simpleArrayMap2 = new SimpleArrayMap<>();
|
||||
simpleArrayMap.put(classLoader, simpleArrayMap2);
|
||||
}
|
||||
Class<?> cls = simpleArrayMap2.get(str);
|
||||
if (cls != null) {
|
||||
return cls;
|
||||
}
|
||||
Class<?> cls2 = Class.forName(str, false, classLoader);
|
||||
simpleArrayMap2.put(str, cls2);
|
||||
return cls2;
|
||||
}
|
||||
|
||||
static boolean isFragmentClass(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return Fragment.class.isAssignableFrom(loadClass(classLoader, str));
|
||||
} catch (ClassNotFoundException unused) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static Class<? extends Fragment> loadFragmentClass(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return loadClass(classLoader, str);
|
||||
} catch (ClassCastException e) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class is a valid subclass of Fragment", e);
|
||||
} catch (ClassNotFoundException e2) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists", e2);
|
||||
}
|
||||
}
|
||||
|
||||
public Fragment instantiate(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return loadFragmentClass(classLoader, str).getConstructor(new Class[0]).newInstance(new Object[0]);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists, is public, and has an empty constructor that is public", e);
|
||||
} catch (InstantiationException e2) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists, is public, and has an empty constructor that is public", e2);
|
||||
} catch (NoSuchMethodException e3) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": could not find Fragment constructor", e3);
|
||||
} catch (InvocationTargetException e4) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": calling Fragment constructor caused an exception", e4);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.util.Preconditions;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentHostCallback<E> extends FragmentContainer {
|
||||
private final Activity mActivity;
|
||||
private final Context mContext;
|
||||
final FragmentManager mFragmentManager;
|
||||
private final Handler mHandler;
|
||||
private final int mWindowAnimations;
|
||||
|
||||
Activity getActivity() {
|
||||
return this.mActivity;
|
||||
}
|
||||
|
||||
Context getContext() {
|
||||
return this.mContext;
|
||||
}
|
||||
|
||||
Handler getHandler() {
|
||||
return this.mHandler;
|
||||
}
|
||||
|
||||
public void onDump(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) {
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentContainer
|
||||
public View onFindViewById(int i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public abstract E onGetHost();
|
||||
|
||||
public int onGetWindowAnimations() {
|
||||
return this.mWindowAnimations;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentContainer
|
||||
public boolean onHasView() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onHasWindowAnimations() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void onRequestPermissionsFromFragment(Fragment fragment, String[] strArr, int i) {
|
||||
}
|
||||
|
||||
public boolean onShouldSaveFragmentState(Fragment fragment) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onShouldShowRequestPermissionRationale(String str) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void onSupportInvalidateOptionsMenu() {
|
||||
}
|
||||
|
||||
public FragmentHostCallback(Context context, Handler handler, int i) {
|
||||
this(context instanceof Activity ? (Activity) context : null, context, handler, i);
|
||||
}
|
||||
|
||||
FragmentHostCallback(FragmentActivity fragmentActivity) {
|
||||
this(fragmentActivity, fragmentActivity, new Handler(), 0);
|
||||
}
|
||||
|
||||
FragmentHostCallback(Activity activity, Context context, Handler handler, int i) {
|
||||
this.mFragmentManager = new FragmentManagerImpl();
|
||||
this.mActivity = activity;
|
||||
this.mContext = (Context) Preconditions.checkNotNull(context, "context == null");
|
||||
this.mHandler = (Handler) Preconditions.checkNotNull(handler, "handler == null");
|
||||
this.mWindowAnimations = i;
|
||||
}
|
||||
|
||||
public LayoutInflater onGetLayoutInflater() {
|
||||
return LayoutInflater.from(this.mContext);
|
||||
}
|
||||
|
||||
public void onStartActivityFromFragment(Fragment fragment, Intent intent, int i) {
|
||||
onStartActivityFromFragment(fragment, intent, i, null);
|
||||
}
|
||||
|
||||
public void onStartActivityFromFragment(Fragment fragment, Intent intent, int i, Bundle bundle) {
|
||||
if (i != -1) {
|
||||
throw new IllegalStateException("Starting activity with a requestCode requires a FragmentActivity host");
|
||||
}
|
||||
ContextCompat.startActivity(this.mContext, intent, bundle);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intentSender, int i, Intent intent, int i2, int i3, int i4, Bundle bundle) throws IntentSender.SendIntentException {
|
||||
if (i != -1) {
|
||||
throw new IllegalStateException("Starting intent sender with a requestCode requires a FragmentActivity host");
|
||||
}
|
||||
ActivityCompat.startIntentSenderForResult(this.mActivity, intentSender, i, intent, i2, i3, i4, bundle);
|
||||
}
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.fragment.R;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentLayoutInflaterFactory implements LayoutInflater.Factory2 {
|
||||
private static final String TAG = "FragmentManager";
|
||||
final FragmentManager mFragmentManager;
|
||||
|
||||
FragmentLayoutInflaterFactory(FragmentManager fragmentManager) {
|
||||
this.mFragmentManager = fragmentManager;
|
||||
}
|
||||
|
||||
@Override // android.view.LayoutInflater.Factory
|
||||
public View onCreateView(String str, Context context, AttributeSet attributeSet) {
|
||||
return onCreateView(null, str, context, attributeSet);
|
||||
}
|
||||
|
||||
@Override // android.view.LayoutInflater.Factory2
|
||||
public View onCreateView(View view, String str, Context context, AttributeSet attributeSet) {
|
||||
final FragmentStateManager createOrGetFragmentStateManager;
|
||||
if (FragmentContainerView.class.getName().equals(str)) {
|
||||
return new FragmentContainerView(context, attributeSet, this.mFragmentManager);
|
||||
}
|
||||
if (!"fragment".equals(str)) {
|
||||
return null;
|
||||
}
|
||||
String attributeValue = attributeSet.getAttributeValue(null, "class");
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, R.styleable.Fragment);
|
||||
if (attributeValue == null) {
|
||||
attributeValue = obtainStyledAttributes.getString(R.styleable.Fragment_android_name);
|
||||
}
|
||||
int resourceId = obtainStyledAttributes.getResourceId(R.styleable.Fragment_android_id, -1);
|
||||
String string = obtainStyledAttributes.getString(R.styleable.Fragment_android_tag);
|
||||
obtainStyledAttributes.recycle();
|
||||
if (attributeValue == null || !FragmentFactory.isFragmentClass(context.getClassLoader(), attributeValue)) {
|
||||
return null;
|
||||
}
|
||||
int id = view != null ? view.getId() : 0;
|
||||
if (id == -1 && resourceId == -1 && string == null) {
|
||||
throw new IllegalArgumentException(attributeSet.getPositionDescription() + ": Must specify unique android:id, android:tag, or have a parent with an id for " + attributeValue);
|
||||
}
|
||||
Fragment findFragmentById = resourceId != -1 ? this.mFragmentManager.findFragmentById(resourceId) : null;
|
||||
if (findFragmentById == null && string != null) {
|
||||
findFragmentById = this.mFragmentManager.findFragmentByTag(string);
|
||||
}
|
||||
if (findFragmentById == null && id != -1) {
|
||||
findFragmentById = this.mFragmentManager.findFragmentById(id);
|
||||
}
|
||||
if (findFragmentById == null) {
|
||||
findFragmentById = this.mFragmentManager.getFragmentFactory().instantiate(context.getClassLoader(), attributeValue);
|
||||
findFragmentById.mFromLayout = true;
|
||||
findFragmentById.mFragmentId = resourceId != 0 ? resourceId : id;
|
||||
findFragmentById.mContainerId = id;
|
||||
findFragmentById.mTag = string;
|
||||
findFragmentById.mInLayout = true;
|
||||
findFragmentById.mFragmentManager = this.mFragmentManager;
|
||||
findFragmentById.mHost = this.mFragmentManager.getHost();
|
||||
findFragmentById.onInflate(this.mFragmentManager.getHost().getContext(), attributeSet, findFragmentById.mSavedFragmentState);
|
||||
createOrGetFragmentStateManager = this.mFragmentManager.addFragment(findFragmentById);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Fragment " + findFragmentById + " has been inflated via the <fragment> tag: id=0x" + Integer.toHexString(resourceId));
|
||||
}
|
||||
} else {
|
||||
if (findFragmentById.mInLayout) {
|
||||
throw new IllegalArgumentException(attributeSet.getPositionDescription() + ": Duplicate id 0x" + Integer.toHexString(resourceId) + ", tag " + string + ", or parent id 0x" + Integer.toHexString(id) + " with another fragment for " + attributeValue);
|
||||
}
|
||||
findFragmentById.mInLayout = true;
|
||||
findFragmentById.mFragmentManager = this.mFragmentManager;
|
||||
findFragmentById.mHost = this.mFragmentManager.getHost();
|
||||
findFragmentById.onInflate(this.mFragmentManager.getHost().getContext(), attributeSet, findFragmentById.mSavedFragmentState);
|
||||
createOrGetFragmentStateManager = this.mFragmentManager.createOrGetFragmentStateManager(findFragmentById);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Retained Fragment " + findFragmentById + " has been re-attached via the <fragment> tag: id=0x" + Integer.toHexString(resourceId));
|
||||
}
|
||||
}
|
||||
findFragmentById.mContainer = (ViewGroup) view;
|
||||
createOrGetFragmentStateManager.moveToExpectedState();
|
||||
createOrGetFragmentStateManager.ensureInflatedView();
|
||||
if (findFragmentById.mView == null) {
|
||||
throw new IllegalStateException("Fragment " + attributeValue + " did not create a view.");
|
||||
}
|
||||
if (resourceId != 0) {
|
||||
findFragmentById.mView.setId(resourceId);
|
||||
}
|
||||
if (findFragmentById.mView.getTag() == null) {
|
||||
findFragmentById.mView.setTag(string);
|
||||
}
|
||||
findFragmentById.mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { // from class: androidx.fragment.app.FragmentLayoutInflaterFactory.1
|
||||
@Override // android.view.View.OnAttachStateChangeListener
|
||||
public void onViewDetachedFromWindow(View view2) {
|
||||
}
|
||||
|
||||
@Override // android.view.View.OnAttachStateChangeListener
|
||||
public void onViewAttachedToWindow(View view2) {
|
||||
Fragment fragment = createOrGetFragmentStateManager.getFragment();
|
||||
createOrGetFragmentStateManager.moveToExpectedState();
|
||||
SpecialEffectsController.getOrCreateController((ViewGroup) fragment.mView.getParent(), FragmentLayoutInflaterFactory.this.mFragmentManager).forceCompleteAllOperations();
|
||||
}
|
||||
});
|
||||
return findFragmentById.mView;
|
||||
}
|
||||
}
|
@ -0,0 +1,247 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import java.util.Iterator;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentLifecycleCallbacksDispatcher {
|
||||
private final FragmentManager mFragmentManager;
|
||||
private final CopyOnWriteArrayList<FragmentLifecycleCallbacksHolder> mLifecycleCallbacks = new CopyOnWriteArrayList<>();
|
||||
|
||||
private static final class FragmentLifecycleCallbacksHolder {
|
||||
final FragmentManager.FragmentLifecycleCallbacks mCallback;
|
||||
final boolean mRecursive;
|
||||
|
||||
FragmentLifecycleCallbacksHolder(FragmentManager.FragmentLifecycleCallbacks fragmentLifecycleCallbacks, boolean z) {
|
||||
this.mCallback = fragmentLifecycleCallbacks;
|
||||
this.mRecursive = z;
|
||||
}
|
||||
}
|
||||
|
||||
FragmentLifecycleCallbacksDispatcher(FragmentManager fragmentManager) {
|
||||
this.mFragmentManager = fragmentManager;
|
||||
}
|
||||
|
||||
public void registerFragmentLifecycleCallbacks(FragmentManager.FragmentLifecycleCallbacks fragmentLifecycleCallbacks, boolean z) {
|
||||
this.mLifecycleCallbacks.add(new FragmentLifecycleCallbacksHolder(fragmentLifecycleCallbacks, z));
|
||||
}
|
||||
|
||||
public void unregisterFragmentLifecycleCallbacks(FragmentManager.FragmentLifecycleCallbacks fragmentLifecycleCallbacks) {
|
||||
synchronized (this.mLifecycleCallbacks) {
|
||||
int size = this.mLifecycleCallbacks.size();
|
||||
int i = 0;
|
||||
while (true) {
|
||||
if (i >= size) {
|
||||
break;
|
||||
}
|
||||
if (this.mLifecycleCallbacks.get(i).mCallback == fragmentLifecycleCallbacks) {
|
||||
this.mLifecycleCallbacks.remove(i);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentPreAttached(Fragment fragment, boolean z) {
|
||||
Context context = this.mFragmentManager.getHost().getContext();
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentPreAttached(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentPreAttached(this.mFragmentManager, fragment, context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentAttached(Fragment fragment, boolean z) {
|
||||
Context context = this.mFragmentManager.getHost().getContext();
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentAttached(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentAttached(this.mFragmentManager, fragment, context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentPreCreated(Fragment fragment, Bundle bundle, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentPreCreated(fragment, bundle, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentPreCreated(this.mFragmentManager, fragment, bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentCreated(Fragment fragment, Bundle bundle, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentCreated(fragment, bundle, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentCreated(this.mFragmentManager, fragment, bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentActivityCreated(Fragment fragment, Bundle bundle, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentActivityCreated(fragment, bundle, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentActivityCreated(this.mFragmentManager, fragment, bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentViewCreated(Fragment fragment, View view, Bundle bundle, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentViewCreated(fragment, view, bundle, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentViewCreated(this.mFragmentManager, fragment, view, bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentStarted(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentStarted(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentStarted(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentResumed(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentResumed(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentResumed(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentPaused(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentPaused(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentPaused(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentStopped(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentStopped(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentStopped(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentSaveInstanceState(Fragment fragment, Bundle bundle, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentSaveInstanceState(fragment, bundle, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentSaveInstanceState(this.mFragmentManager, fragment, bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentViewDestroyed(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentViewDestroyed(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentViewDestroyed(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentDestroyed(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentDestroyed(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentDestroyed(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnFragmentDetached(Fragment fragment, boolean z) {
|
||||
Fragment parent = this.mFragmentManager.getParent();
|
||||
if (parent != null) {
|
||||
parent.getParentFragmentManager().getLifecycleCallbacksDispatcher().dispatchOnFragmentDetached(fragment, true);
|
||||
}
|
||||
Iterator<FragmentLifecycleCallbacksHolder> it = this.mLifecycleCallbacks.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentLifecycleCallbacksHolder next = it.next();
|
||||
if (!z || next.mRecursive) {
|
||||
next.mCallback.onFragmentDetached(this.mFragmentManager, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
2269
02-Easy5/E5/sources/androidx/fragment/app/FragmentManager.java
Normal file
2269
02-Easy5/E5/sources/androidx/fragment/app/FragmentManager.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,7 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentManagerImpl extends FragmentManager {
|
||||
FragmentManagerImpl() {
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import androidx.lifecycle.ViewModelStore;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
@Deprecated
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentManagerNonConfig {
|
||||
private final Map<String, FragmentManagerNonConfig> mChildNonConfigs;
|
||||
private final Collection<Fragment> mFragments;
|
||||
private final Map<String, ViewModelStore> mViewModelStores;
|
||||
|
||||
Map<String, FragmentManagerNonConfig> getChildNonConfigs() {
|
||||
return this.mChildNonConfigs;
|
||||
}
|
||||
|
||||
Collection<Fragment> getFragments() {
|
||||
return this.mFragments;
|
||||
}
|
||||
|
||||
Map<String, ViewModelStore> getViewModelStores() {
|
||||
return this.mViewModelStores;
|
||||
}
|
||||
|
||||
FragmentManagerNonConfig(Collection<Fragment> collection, Map<String, FragmentManagerNonConfig> map, Map<String, ViewModelStore> map2) {
|
||||
this.mFragments = collection;
|
||||
this.mChildNonConfigs = map;
|
||||
this.mViewModelStores = map2;
|
||||
}
|
||||
|
||||
boolean isRetaining(Fragment fragment) {
|
||||
Collection<Fragment> collection = this.mFragments;
|
||||
if (collection == null) {
|
||||
return false;
|
||||
}
|
||||
return collection.contains(fragment);
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class FragmentManagerState implements Parcelable {
|
||||
public static final Parcelable.Creator<FragmentManagerState> CREATOR = new Parcelable.Creator<FragmentManagerState>() { // from class: androidx.fragment.app.FragmentManagerState.1
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public FragmentManagerState createFromParcel(Parcel parcel) {
|
||||
return new FragmentManagerState(parcel);
|
||||
}
|
||||
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public FragmentManagerState[] newArray(int i) {
|
||||
return new FragmentManagerState[i];
|
||||
}
|
||||
};
|
||||
ArrayList<FragmentState> mActive;
|
||||
ArrayList<String> mAdded;
|
||||
BackStackState[] mBackStack;
|
||||
int mBackStackIndex;
|
||||
ArrayList<FragmentManager.LaunchedFragmentInfo> mLaunchedFragments;
|
||||
String mPrimaryNavActiveWho;
|
||||
ArrayList<String> mResultKeys;
|
||||
ArrayList<Bundle> mResults;
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public FragmentManagerState() {
|
||||
this.mPrimaryNavActiveWho = null;
|
||||
this.mResultKeys = new ArrayList<>();
|
||||
this.mResults = new ArrayList<>();
|
||||
}
|
||||
|
||||
public FragmentManagerState(Parcel parcel) {
|
||||
this.mPrimaryNavActiveWho = null;
|
||||
this.mResultKeys = new ArrayList<>();
|
||||
this.mResults = new ArrayList<>();
|
||||
this.mActive = parcel.createTypedArrayList(FragmentState.CREATOR);
|
||||
this.mAdded = parcel.createStringArrayList();
|
||||
this.mBackStack = (BackStackState[]) parcel.createTypedArray(BackStackState.CREATOR);
|
||||
this.mBackStackIndex = parcel.readInt();
|
||||
this.mPrimaryNavActiveWho = parcel.readString();
|
||||
this.mResultKeys = parcel.createStringArrayList();
|
||||
this.mResults = parcel.createTypedArrayList(Bundle.CREATOR);
|
||||
this.mLaunchedFragments = parcel.createTypedArrayList(FragmentManager.LaunchedFragmentInfo.CREATOR);
|
||||
}
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public void writeToParcel(Parcel parcel, int i) {
|
||||
parcel.writeTypedList(this.mActive);
|
||||
parcel.writeStringList(this.mAdded);
|
||||
parcel.writeTypedArray(this.mBackStack, i);
|
||||
parcel.writeInt(this.mBackStackIndex);
|
||||
parcel.writeString(this.mPrimaryNavActiveWho);
|
||||
parcel.writeStringList(this.mResultKeys);
|
||||
parcel.writeTypedList(this.mResults);
|
||||
parcel.writeTypedList(this.mLaunchedFragments);
|
||||
}
|
||||
}
|
@ -0,0 +1,234 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.Log;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.lifecycle.ViewModelStore;
|
||||
import androidx.lifecycle.viewmodel.CreationExtras;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class FragmentManagerViewModel extends ViewModel {
|
||||
private static final ViewModelProvider.Factory FACTORY = new ViewModelProvider.Factory() { // from class: androidx.fragment.app.FragmentManagerViewModel.1
|
||||
@Override // androidx.lifecycle.ViewModelProvider.Factory
|
||||
public /* synthetic */ ViewModel create(Class cls, CreationExtras creationExtras) {
|
||||
return ViewModelProvider.Factory.CC.$default$create(this, cls, creationExtras);
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.ViewModelProvider.Factory
|
||||
public <T extends ViewModel> T create(Class<T> cls) {
|
||||
return new FragmentManagerViewModel(true);
|
||||
}
|
||||
};
|
||||
private static final String TAG = "FragmentManager";
|
||||
private final boolean mStateAutomaticallySaved;
|
||||
private final HashMap<String, Fragment> mRetainedFragments = new HashMap<>();
|
||||
private final HashMap<String, FragmentManagerViewModel> mChildNonConfigs = new HashMap<>();
|
||||
private final HashMap<String, ViewModelStore> mViewModelStores = new HashMap<>();
|
||||
private boolean mHasBeenCleared = false;
|
||||
private boolean mHasSavedSnapshot = false;
|
||||
private boolean mIsStateSaved = false;
|
||||
|
||||
boolean isCleared() {
|
||||
return this.mHasBeenCleared;
|
||||
}
|
||||
|
||||
void setIsStateSaved(boolean z) {
|
||||
this.mIsStateSaved = z;
|
||||
}
|
||||
|
||||
static FragmentManagerViewModel getInstance(ViewModelStore viewModelStore) {
|
||||
return (FragmentManagerViewModel) new ViewModelProvider(viewModelStore, FACTORY).get(FragmentManagerViewModel.class);
|
||||
}
|
||||
|
||||
FragmentManagerViewModel(boolean z) {
|
||||
this.mStateAutomaticallySaved = z;
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.ViewModel
|
||||
protected void onCleared() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "onCleared called for " + this);
|
||||
}
|
||||
this.mHasBeenCleared = true;
|
||||
}
|
||||
|
||||
void addRetainedFragment(Fragment fragment) {
|
||||
if (this.mIsStateSaved) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Ignoring addRetainedFragment as the state is already saved");
|
||||
}
|
||||
} else {
|
||||
if (this.mRetainedFragments.containsKey(fragment.mWho)) {
|
||||
return;
|
||||
}
|
||||
this.mRetainedFragments.put(fragment.mWho, fragment);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Updating retained Fragments: Added " + fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Fragment findRetainedFragmentByWho(String str) {
|
||||
return this.mRetainedFragments.get(str);
|
||||
}
|
||||
|
||||
Collection<Fragment> getRetainedFragments() {
|
||||
return new ArrayList(this.mRetainedFragments.values());
|
||||
}
|
||||
|
||||
boolean shouldDestroy(Fragment fragment) {
|
||||
if (this.mRetainedFragments.containsKey(fragment.mWho)) {
|
||||
return this.mStateAutomaticallySaved ? this.mHasBeenCleared : !this.mHasSavedSnapshot;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void removeRetainedFragment(Fragment fragment) {
|
||||
if (this.mIsStateSaved) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Ignoring removeRetainedFragment as the state is already saved");
|
||||
}
|
||||
} else {
|
||||
if (this.mRetainedFragments.remove(fragment.mWho) == null || !FragmentManager.isLoggingEnabled(2)) {
|
||||
return;
|
||||
}
|
||||
Log.v(TAG, "Updating retained Fragments: Removed " + fragment);
|
||||
}
|
||||
}
|
||||
|
||||
FragmentManagerViewModel getChildNonConfig(Fragment fragment) {
|
||||
FragmentManagerViewModel fragmentManagerViewModel = this.mChildNonConfigs.get(fragment.mWho);
|
||||
if (fragmentManagerViewModel != null) {
|
||||
return fragmentManagerViewModel;
|
||||
}
|
||||
FragmentManagerViewModel fragmentManagerViewModel2 = new FragmentManagerViewModel(this.mStateAutomaticallySaved);
|
||||
this.mChildNonConfigs.put(fragment.mWho, fragmentManagerViewModel2);
|
||||
return fragmentManagerViewModel2;
|
||||
}
|
||||
|
||||
ViewModelStore getViewModelStore(Fragment fragment) {
|
||||
ViewModelStore viewModelStore = this.mViewModelStores.get(fragment.mWho);
|
||||
if (viewModelStore != null) {
|
||||
return viewModelStore;
|
||||
}
|
||||
ViewModelStore viewModelStore2 = new ViewModelStore();
|
||||
this.mViewModelStores.put(fragment.mWho, viewModelStore2);
|
||||
return viewModelStore2;
|
||||
}
|
||||
|
||||
void clearNonConfigState(Fragment fragment) {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "Clearing non-config state for " + fragment);
|
||||
}
|
||||
FragmentManagerViewModel fragmentManagerViewModel = this.mChildNonConfigs.get(fragment.mWho);
|
||||
if (fragmentManagerViewModel != null) {
|
||||
fragmentManagerViewModel.onCleared();
|
||||
this.mChildNonConfigs.remove(fragment.mWho);
|
||||
}
|
||||
ViewModelStore viewModelStore = this.mViewModelStores.get(fragment.mWho);
|
||||
if (viewModelStore != null) {
|
||||
viewModelStore.clear();
|
||||
this.mViewModelStores.remove(fragment.mWho);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
void restoreFromSnapshot(FragmentManagerNonConfig fragmentManagerNonConfig) {
|
||||
this.mRetainedFragments.clear();
|
||||
this.mChildNonConfigs.clear();
|
||||
this.mViewModelStores.clear();
|
||||
if (fragmentManagerNonConfig != null) {
|
||||
Collection<Fragment> fragments = fragmentManagerNonConfig.getFragments();
|
||||
if (fragments != null) {
|
||||
for (Fragment fragment : fragments) {
|
||||
if (fragment != null) {
|
||||
this.mRetainedFragments.put(fragment.mWho, fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
Map<String, FragmentManagerNonConfig> childNonConfigs = fragmentManagerNonConfig.getChildNonConfigs();
|
||||
if (childNonConfigs != null) {
|
||||
for (Map.Entry<String, FragmentManagerNonConfig> entry : childNonConfigs.entrySet()) {
|
||||
FragmentManagerViewModel fragmentManagerViewModel = new FragmentManagerViewModel(this.mStateAutomaticallySaved);
|
||||
fragmentManagerViewModel.restoreFromSnapshot(entry.getValue());
|
||||
this.mChildNonConfigs.put(entry.getKey(), fragmentManagerViewModel);
|
||||
}
|
||||
}
|
||||
Map<String, ViewModelStore> viewModelStores = fragmentManagerNonConfig.getViewModelStores();
|
||||
if (viewModelStores != null) {
|
||||
this.mViewModelStores.putAll(viewModelStores);
|
||||
}
|
||||
}
|
||||
this.mHasSavedSnapshot = false;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
FragmentManagerNonConfig getSnapshot() {
|
||||
if (this.mRetainedFragments.isEmpty() && this.mChildNonConfigs.isEmpty() && this.mViewModelStores.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
HashMap hashMap = new HashMap();
|
||||
for (Map.Entry<String, FragmentManagerViewModel> entry : this.mChildNonConfigs.entrySet()) {
|
||||
FragmentManagerNonConfig snapshot = entry.getValue().getSnapshot();
|
||||
if (snapshot != null) {
|
||||
hashMap.put(entry.getKey(), snapshot);
|
||||
}
|
||||
}
|
||||
this.mHasSavedSnapshot = true;
|
||||
if (this.mRetainedFragments.isEmpty() && hashMap.isEmpty() && this.mViewModelStores.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return new FragmentManagerNonConfig(new ArrayList(this.mRetainedFragments.values()), hashMap, new HashMap(this.mViewModelStores));
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null || getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
FragmentManagerViewModel fragmentManagerViewModel = (FragmentManagerViewModel) obj;
|
||||
return this.mRetainedFragments.equals(fragmentManagerViewModel.mRetainedFragments) && this.mChildNonConfigs.equals(fragmentManagerViewModel.mChildNonConfigs) && this.mViewModelStores.equals(fragmentManagerViewModel.mViewModelStores);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return (((this.mRetainedFragments.hashCode() * 31) + this.mChildNonConfigs.hashCode()) * 31) + this.mViewModelStores.hashCode();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder("FragmentManagerViewModel{");
|
||||
sb.append(Integer.toHexString(System.identityHashCode(this)));
|
||||
sb.append("} Fragments (");
|
||||
Iterator<Fragment> it = this.mRetainedFragments.values().iterator();
|
||||
while (it.hasNext()) {
|
||||
sb.append(it.next());
|
||||
if (it.hasNext()) {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
sb.append(") Child Non Config (");
|
||||
Iterator<String> it2 = this.mChildNonConfigs.keySet().iterator();
|
||||
while (it2.hasNext()) {
|
||||
sb.append(it2.next());
|
||||
if (it2.hasNext()) {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
sb.append(") ViewModelStores (");
|
||||
Iterator<String> it3 = this.mViewModelStores.keySet().iterator();
|
||||
while (it3.hasNext()) {
|
||||
sb.append(it3.next());
|
||||
if (it3.hasNext()) {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
sb.append(')');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface FragmentOnAttachListener {
|
||||
void onAttachFragment(FragmentManager fragmentManager, Fragment fragment);
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Parcelable;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
|
||||
@Deprecated
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentPagerAdapter extends PagerAdapter {
|
||||
public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;
|
||||
|
||||
@Deprecated
|
||||
public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = "FragmentPagerAdapter";
|
||||
private final int mBehavior;
|
||||
private FragmentTransaction mCurTransaction;
|
||||
private Fragment mCurrentPrimaryItem;
|
||||
private boolean mExecutingFinishUpdate;
|
||||
private final FragmentManager mFragmentManager;
|
||||
|
||||
public abstract Fragment getItem(int i);
|
||||
|
||||
public long getItemId(int i) {
|
||||
return i;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void restoreState(Parcelable parcelable, ClassLoader classLoader) {
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public Parcelable saveState() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentPagerAdapter(FragmentManager fragmentManager) {
|
||||
this(fragmentManager, 0);
|
||||
}
|
||||
|
||||
public FragmentPagerAdapter(FragmentManager fragmentManager, int i) {
|
||||
this.mCurTransaction = null;
|
||||
this.mCurrentPrimaryItem = null;
|
||||
this.mFragmentManager = fragmentManager;
|
||||
this.mBehavior = i;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void startUpdate(ViewGroup viewGroup) {
|
||||
if (viewGroup.getId() != -1) {
|
||||
return;
|
||||
}
|
||||
throw new IllegalStateException("ViewPager with adapter " + this + " requires a view id");
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public Object instantiateItem(ViewGroup viewGroup, int i) {
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
long itemId = getItemId(i);
|
||||
Fragment findFragmentByTag = this.mFragmentManager.findFragmentByTag(makeFragmentName(viewGroup.getId(), itemId));
|
||||
if (findFragmentByTag != null) {
|
||||
this.mCurTransaction.attach(findFragmentByTag);
|
||||
} else {
|
||||
findFragmentByTag = getItem(i);
|
||||
this.mCurTransaction.add(viewGroup.getId(), findFragmentByTag, makeFragmentName(viewGroup.getId(), itemId));
|
||||
}
|
||||
if (findFragmentByTag != this.mCurrentPrimaryItem) {
|
||||
findFragmentByTag.setMenuVisibility(false);
|
||||
if (this.mBehavior == 1) {
|
||||
this.mCurTransaction.setMaxLifecycle(findFragmentByTag, Lifecycle.State.STARTED);
|
||||
} else {
|
||||
findFragmentByTag.setUserVisibleHint(false);
|
||||
}
|
||||
}
|
||||
return findFragmentByTag;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void destroyItem(ViewGroup viewGroup, int i, Object obj) {
|
||||
Fragment fragment = (Fragment) obj;
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
this.mCurTransaction.detach(fragment);
|
||||
if (fragment.equals(this.mCurrentPrimaryItem)) {
|
||||
this.mCurrentPrimaryItem = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void setPrimaryItem(ViewGroup viewGroup, int i, Object obj) {
|
||||
Fragment fragment = (Fragment) obj;
|
||||
Fragment fragment2 = this.mCurrentPrimaryItem;
|
||||
if (fragment != fragment2) {
|
||||
if (fragment2 != null) {
|
||||
fragment2.setMenuVisibility(false);
|
||||
if (this.mBehavior == 1) {
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
this.mCurTransaction.setMaxLifecycle(this.mCurrentPrimaryItem, Lifecycle.State.STARTED);
|
||||
} else {
|
||||
this.mCurrentPrimaryItem.setUserVisibleHint(false);
|
||||
}
|
||||
}
|
||||
fragment.setMenuVisibility(true);
|
||||
if (this.mBehavior == 1) {
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
this.mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
|
||||
} else {
|
||||
fragment.setUserVisibleHint(true);
|
||||
}
|
||||
this.mCurrentPrimaryItem = fragment;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void finishUpdate(ViewGroup viewGroup) {
|
||||
FragmentTransaction fragmentTransaction = this.mCurTransaction;
|
||||
if (fragmentTransaction != null) {
|
||||
if (!this.mExecutingFinishUpdate) {
|
||||
try {
|
||||
this.mExecutingFinishUpdate = true;
|
||||
fragmentTransaction.commitNowAllowingStateLoss();
|
||||
} finally {
|
||||
this.mExecutingFinishUpdate = false;
|
||||
}
|
||||
}
|
||||
this.mCurTransaction = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public boolean isViewFromObject(View view, Object obj) {
|
||||
return ((Fragment) obj).getView() == view;
|
||||
}
|
||||
|
||||
private static String makeFragmentName(int i, long j) {
|
||||
return "android:switcher:" + i + ":" + j;
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface FragmentResultListener {
|
||||
void onFragmentResult(String str, Bundle bundle);
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface FragmentResultOwner {
|
||||
void clearFragmentResult(String str);
|
||||
|
||||
void clearFragmentResultListener(String str);
|
||||
|
||||
void setFragmentResult(String str, Bundle bundle);
|
||||
|
||||
void setFragmentResultListener(String str, LifecycleOwner lifecycleOwner, FragmentResultListener fragmentResultListener);
|
||||
}
|
122
02-Easy5/E5/sources/androidx/fragment/app/FragmentState.java
Normal file
122
02-Easy5/E5/sources/androidx/fragment/app/FragmentState.java
Normal file
@ -0,0 +1,122 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class FragmentState implements Parcelable {
|
||||
public static final Parcelable.Creator<FragmentState> CREATOR = new Parcelable.Creator<FragmentState>() { // from class: androidx.fragment.app.FragmentState.1
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public FragmentState createFromParcel(Parcel parcel) {
|
||||
return new FragmentState(parcel);
|
||||
}
|
||||
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public FragmentState[] newArray(int i) {
|
||||
return new FragmentState[i];
|
||||
}
|
||||
};
|
||||
final Bundle mArguments;
|
||||
final String mClassName;
|
||||
final int mContainerId;
|
||||
final boolean mDetached;
|
||||
final int mFragmentId;
|
||||
final boolean mFromLayout;
|
||||
final boolean mHidden;
|
||||
final int mMaxLifecycleState;
|
||||
final boolean mRemoving;
|
||||
final boolean mRetainInstance;
|
||||
Bundle mSavedFragmentState;
|
||||
final String mTag;
|
||||
final String mWho;
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
FragmentState(Fragment fragment) {
|
||||
this.mClassName = fragment.getClass().getName();
|
||||
this.mWho = fragment.mWho;
|
||||
this.mFromLayout = fragment.mFromLayout;
|
||||
this.mFragmentId = fragment.mFragmentId;
|
||||
this.mContainerId = fragment.mContainerId;
|
||||
this.mTag = fragment.mTag;
|
||||
this.mRetainInstance = fragment.mRetainInstance;
|
||||
this.mRemoving = fragment.mRemoving;
|
||||
this.mDetached = fragment.mDetached;
|
||||
this.mArguments = fragment.mArguments;
|
||||
this.mHidden = fragment.mHidden;
|
||||
this.mMaxLifecycleState = fragment.mMaxState.ordinal();
|
||||
}
|
||||
|
||||
FragmentState(Parcel parcel) {
|
||||
this.mClassName = parcel.readString();
|
||||
this.mWho = parcel.readString();
|
||||
this.mFromLayout = parcel.readInt() != 0;
|
||||
this.mFragmentId = parcel.readInt();
|
||||
this.mContainerId = parcel.readInt();
|
||||
this.mTag = parcel.readString();
|
||||
this.mRetainInstance = parcel.readInt() != 0;
|
||||
this.mRemoving = parcel.readInt() != 0;
|
||||
this.mDetached = parcel.readInt() != 0;
|
||||
this.mArguments = parcel.readBundle();
|
||||
this.mHidden = parcel.readInt() != 0;
|
||||
this.mSavedFragmentState = parcel.readBundle();
|
||||
this.mMaxLifecycleState = parcel.readInt();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder(128);
|
||||
sb.append("FragmentState{");
|
||||
sb.append(this.mClassName);
|
||||
sb.append(" (");
|
||||
sb.append(this.mWho);
|
||||
sb.append(")}:");
|
||||
if (this.mFromLayout) {
|
||||
sb.append(" fromLayout");
|
||||
}
|
||||
if (this.mContainerId != 0) {
|
||||
sb.append(" id=0x");
|
||||
sb.append(Integer.toHexString(this.mContainerId));
|
||||
}
|
||||
String str = this.mTag;
|
||||
if (str != null && !str.isEmpty()) {
|
||||
sb.append(" tag=");
|
||||
sb.append(this.mTag);
|
||||
}
|
||||
if (this.mRetainInstance) {
|
||||
sb.append(" retainInstance");
|
||||
}
|
||||
if (this.mRemoving) {
|
||||
sb.append(" removing");
|
||||
}
|
||||
if (this.mDetached) {
|
||||
sb.append(" detached");
|
||||
}
|
||||
if (this.mHidden) {
|
||||
sb.append(" hidden");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override // android.os.Parcelable
|
||||
public void writeToParcel(Parcel parcel, int i) {
|
||||
parcel.writeString(this.mClassName);
|
||||
parcel.writeString(this.mWho);
|
||||
parcel.writeInt(this.mFromLayout ? 1 : 0);
|
||||
parcel.writeInt(this.mFragmentId);
|
||||
parcel.writeInt(this.mContainerId);
|
||||
parcel.writeString(this.mTag);
|
||||
parcel.writeInt(this.mRetainInstance ? 1 : 0);
|
||||
parcel.writeInt(this.mRemoving ? 1 : 0);
|
||||
parcel.writeInt(this.mDetached ? 1 : 0);
|
||||
parcel.writeBundle(this.mArguments);
|
||||
parcel.writeInt(this.mHidden ? 1 : 0);
|
||||
parcel.writeBundle(this.mSavedFragmentState);
|
||||
parcel.writeInt(this.mMaxLifecycleState);
|
||||
}
|
||||
}
|
@ -0,0 +1,697 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import androidx.core.os.EnvironmentCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.R;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.SpecialEffectsController;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.lifecycle.ViewModelStoreOwner;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentStateManager {
|
||||
private static final String TAG = "FragmentManager";
|
||||
private static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state";
|
||||
private static final String TARGET_STATE_TAG = "android:target_state";
|
||||
private static final String USER_VISIBLE_HINT_TAG = "android:user_visible_hint";
|
||||
private static final String VIEW_REGISTRY_STATE_TAG = "android:view_registry_state";
|
||||
private static final String VIEW_STATE_TAG = "android:view_state";
|
||||
private final FragmentLifecycleCallbacksDispatcher mDispatcher;
|
||||
private final Fragment mFragment;
|
||||
private final FragmentStore mFragmentStore;
|
||||
private boolean mMovingToState = false;
|
||||
private int mFragmentManagerState = -1;
|
||||
|
||||
Fragment getFragment() {
|
||||
return this.mFragment;
|
||||
}
|
||||
|
||||
void setFragmentManagerState(int i) {
|
||||
this.mFragmentManagerState = i;
|
||||
}
|
||||
|
||||
FragmentStateManager(FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher, FragmentStore fragmentStore, Fragment fragment) {
|
||||
this.mDispatcher = fragmentLifecycleCallbacksDispatcher;
|
||||
this.mFragmentStore = fragmentStore;
|
||||
this.mFragment = fragment;
|
||||
}
|
||||
|
||||
FragmentStateManager(FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher, FragmentStore fragmentStore, ClassLoader classLoader, FragmentFactory fragmentFactory, FragmentState fragmentState) {
|
||||
this.mDispatcher = fragmentLifecycleCallbacksDispatcher;
|
||||
this.mFragmentStore = fragmentStore;
|
||||
Fragment instantiate = fragmentFactory.instantiate(classLoader, fragmentState.mClassName);
|
||||
this.mFragment = instantiate;
|
||||
if (fragmentState.mArguments != null) {
|
||||
fragmentState.mArguments.setClassLoader(classLoader);
|
||||
}
|
||||
instantiate.setArguments(fragmentState.mArguments);
|
||||
instantiate.mWho = fragmentState.mWho;
|
||||
instantiate.mFromLayout = fragmentState.mFromLayout;
|
||||
instantiate.mRestored = true;
|
||||
instantiate.mFragmentId = fragmentState.mFragmentId;
|
||||
instantiate.mContainerId = fragmentState.mContainerId;
|
||||
instantiate.mTag = fragmentState.mTag;
|
||||
instantiate.mRetainInstance = fragmentState.mRetainInstance;
|
||||
instantiate.mRemoving = fragmentState.mRemoving;
|
||||
instantiate.mDetached = fragmentState.mDetached;
|
||||
instantiate.mHidden = fragmentState.mHidden;
|
||||
instantiate.mMaxState = Lifecycle.State.values()[fragmentState.mMaxLifecycleState];
|
||||
if (fragmentState.mSavedFragmentState != null) {
|
||||
instantiate.mSavedFragmentState = fragmentState.mSavedFragmentState;
|
||||
} else {
|
||||
instantiate.mSavedFragmentState = new Bundle();
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Instantiated fragment " + instantiate);
|
||||
}
|
||||
}
|
||||
|
||||
FragmentStateManager(FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher, FragmentStore fragmentStore, Fragment fragment, FragmentState fragmentState) {
|
||||
this.mDispatcher = fragmentLifecycleCallbacksDispatcher;
|
||||
this.mFragmentStore = fragmentStore;
|
||||
this.mFragment = fragment;
|
||||
fragment.mSavedViewState = null;
|
||||
fragment.mSavedViewRegistryState = null;
|
||||
fragment.mBackStackNesting = 0;
|
||||
fragment.mInLayout = false;
|
||||
fragment.mAdded = false;
|
||||
fragment.mTargetWho = fragment.mTarget != null ? fragment.mTarget.mWho : null;
|
||||
fragment.mTarget = null;
|
||||
if (fragmentState.mSavedFragmentState != null) {
|
||||
fragment.mSavedFragmentState = fragmentState.mSavedFragmentState;
|
||||
} else {
|
||||
fragment.mSavedFragmentState = new Bundle();
|
||||
}
|
||||
}
|
||||
|
||||
int computeExpectedState() {
|
||||
if (this.mFragment.mFragmentManager == null) {
|
||||
return this.mFragment.mState;
|
||||
}
|
||||
int i = this.mFragmentManagerState;
|
||||
int i2 = AnonymousClass2.$SwitchMap$androidx$lifecycle$Lifecycle$State[this.mFragment.mMaxState.ordinal()];
|
||||
if (i2 != 1) {
|
||||
if (i2 == 2) {
|
||||
i = Math.min(i, 5);
|
||||
} else if (i2 == 3) {
|
||||
i = Math.min(i, 1);
|
||||
} else if (i2 == 4) {
|
||||
i = Math.min(i, 0);
|
||||
} else {
|
||||
i = Math.min(i, -1);
|
||||
}
|
||||
}
|
||||
if (this.mFragment.mFromLayout) {
|
||||
if (this.mFragment.mInLayout) {
|
||||
i = Math.max(this.mFragmentManagerState, 2);
|
||||
if (this.mFragment.mView != null && this.mFragment.mView.getParent() == null) {
|
||||
i = Math.min(i, 2);
|
||||
}
|
||||
} else {
|
||||
i = this.mFragmentManagerState < 4 ? Math.min(i, this.mFragment.mState) : Math.min(i, 1);
|
||||
}
|
||||
}
|
||||
if (!this.mFragment.mAdded) {
|
||||
i = Math.min(i, 1);
|
||||
}
|
||||
SpecialEffectsController.Operation.LifecycleImpact awaitingCompletionLifecycleImpact = (!FragmentManager.USE_STATE_MANAGER || this.mFragment.mContainer == null) ? null : SpecialEffectsController.getOrCreateController(this.mFragment.mContainer, this.mFragment.getParentFragmentManager()).getAwaitingCompletionLifecycleImpact(this);
|
||||
if (awaitingCompletionLifecycleImpact == SpecialEffectsController.Operation.LifecycleImpact.ADDING) {
|
||||
i = Math.min(i, 6);
|
||||
} else if (awaitingCompletionLifecycleImpact == SpecialEffectsController.Operation.LifecycleImpact.REMOVING) {
|
||||
i = Math.max(i, 3);
|
||||
} else if (this.mFragment.mRemoving) {
|
||||
if (this.mFragment.isInBackStack()) {
|
||||
i = Math.min(i, 1);
|
||||
} else {
|
||||
i = Math.min(i, -1);
|
||||
}
|
||||
}
|
||||
if (this.mFragment.mDeferStart && this.mFragment.mState < 5) {
|
||||
i = Math.min(i, 4);
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "computeExpectedState() of " + i + " for " + this.mFragment);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/* renamed from: androidx.fragment.app.FragmentStateManager$2, reason: invalid class name */
|
||||
static /* synthetic */ class AnonymousClass2 {
|
||||
static final /* synthetic */ int[] $SwitchMap$androidx$lifecycle$Lifecycle$State;
|
||||
|
||||
static {
|
||||
int[] iArr = new int[Lifecycle.State.values().length];
|
||||
$SwitchMap$androidx$lifecycle$Lifecycle$State = iArr;
|
||||
try {
|
||||
iArr[Lifecycle.State.RESUMED.ordinal()] = 1;
|
||||
} catch (NoSuchFieldError unused) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$lifecycle$Lifecycle$State[Lifecycle.State.STARTED.ordinal()] = 2;
|
||||
} catch (NoSuchFieldError unused2) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$lifecycle$Lifecycle$State[Lifecycle.State.CREATED.ordinal()] = 3;
|
||||
} catch (NoSuchFieldError unused3) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$lifecycle$Lifecycle$State[Lifecycle.State.INITIALIZED.ordinal()] = 4;
|
||||
} catch (NoSuchFieldError unused4) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void moveToExpectedState() {
|
||||
if (this.mMovingToState) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Ignoring re-entrant call to moveToExpectedState() for " + getFragment());
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
try {
|
||||
this.mMovingToState = true;
|
||||
while (true) {
|
||||
int computeExpectedState = computeExpectedState();
|
||||
if (computeExpectedState != this.mFragment.mState) {
|
||||
if (computeExpectedState > this.mFragment.mState) {
|
||||
switch (this.mFragment.mState + 1) {
|
||||
case 0:
|
||||
attach();
|
||||
break;
|
||||
case 1:
|
||||
create();
|
||||
break;
|
||||
case 2:
|
||||
ensureInflatedView();
|
||||
createView();
|
||||
break;
|
||||
case 3:
|
||||
activityCreated();
|
||||
break;
|
||||
case 4:
|
||||
if (this.mFragment.mView != null && this.mFragment.mContainer != null) {
|
||||
SpecialEffectsController.getOrCreateController(this.mFragment.mContainer, this.mFragment.getParentFragmentManager()).enqueueAdd(SpecialEffectsController.Operation.State.from(this.mFragment.mView.getVisibility()), this);
|
||||
}
|
||||
this.mFragment.mState = 4;
|
||||
break;
|
||||
case 5:
|
||||
start();
|
||||
break;
|
||||
case 6:
|
||||
this.mFragment.mState = 6;
|
||||
break;
|
||||
case 7:
|
||||
resume();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (this.mFragment.mState - 1) {
|
||||
case -1:
|
||||
detach();
|
||||
break;
|
||||
case 0:
|
||||
destroy();
|
||||
break;
|
||||
case 1:
|
||||
destroyFragmentView();
|
||||
this.mFragment.mState = 1;
|
||||
break;
|
||||
case 2:
|
||||
this.mFragment.mInLayout = false;
|
||||
this.mFragment.mState = 2;
|
||||
break;
|
||||
case 3:
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom ACTIVITY_CREATED: " + this.mFragment);
|
||||
}
|
||||
if (this.mFragment.mView != null && this.mFragment.mSavedViewState == null) {
|
||||
saveViewState();
|
||||
}
|
||||
if (this.mFragment.mView != null && this.mFragment.mContainer != null) {
|
||||
SpecialEffectsController.getOrCreateController(this.mFragment.mContainer, this.mFragment.getParentFragmentManager()).enqueueRemove(this);
|
||||
}
|
||||
this.mFragment.mState = 3;
|
||||
break;
|
||||
case 4:
|
||||
stop();
|
||||
break;
|
||||
case 5:
|
||||
this.mFragment.mState = 5;
|
||||
break;
|
||||
case 6:
|
||||
pause();
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (FragmentManager.USE_STATE_MANAGER && this.mFragment.mHiddenChanged) {
|
||||
if (this.mFragment.mView != null && this.mFragment.mContainer != null) {
|
||||
SpecialEffectsController orCreateController = SpecialEffectsController.getOrCreateController(this.mFragment.mContainer, this.mFragment.getParentFragmentManager());
|
||||
if (this.mFragment.mHidden) {
|
||||
orCreateController.enqueueHide(this);
|
||||
} else {
|
||||
orCreateController.enqueueShow(this);
|
||||
}
|
||||
}
|
||||
if (this.mFragment.mFragmentManager != null) {
|
||||
this.mFragment.mFragmentManager.invalidateMenuForFragment(this.mFragment);
|
||||
}
|
||||
this.mFragment.mHiddenChanged = false;
|
||||
Fragment fragment = this.mFragment;
|
||||
fragment.onHiddenChanged(fragment.mHidden);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
this.mMovingToState = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ensureInflatedView() {
|
||||
if (this.mFragment.mFromLayout && this.mFragment.mInLayout && !this.mFragment.mPerformedCreateView) {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto CREATE_VIEW: " + this.mFragment);
|
||||
}
|
||||
Fragment fragment = this.mFragment;
|
||||
fragment.performCreateView(fragment.performGetLayoutInflater(fragment.mSavedFragmentState), null, this.mFragment.mSavedFragmentState);
|
||||
if (this.mFragment.mView != null) {
|
||||
this.mFragment.mView.setSaveFromParentEnabled(false);
|
||||
this.mFragment.mView.setTag(R.id.fragment_container_view_tag, this.mFragment);
|
||||
if (this.mFragment.mHidden) {
|
||||
this.mFragment.mView.setVisibility(8);
|
||||
}
|
||||
this.mFragment.performViewCreated();
|
||||
FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher = this.mDispatcher;
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragmentLifecycleCallbacksDispatcher.dispatchOnFragmentViewCreated(fragment2, fragment2.mView, this.mFragment.mSavedFragmentState, false);
|
||||
this.mFragment.mState = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void restoreState(ClassLoader classLoader) {
|
||||
if (this.mFragment.mSavedFragmentState == null) {
|
||||
return;
|
||||
}
|
||||
this.mFragment.mSavedFragmentState.setClassLoader(classLoader);
|
||||
Fragment fragment = this.mFragment;
|
||||
fragment.mSavedViewState = fragment.mSavedFragmentState.getSparseParcelableArray(VIEW_STATE_TAG);
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragment2.mSavedViewRegistryState = fragment2.mSavedFragmentState.getBundle(VIEW_REGISTRY_STATE_TAG);
|
||||
Fragment fragment3 = this.mFragment;
|
||||
fragment3.mTargetWho = fragment3.mSavedFragmentState.getString(TARGET_STATE_TAG);
|
||||
if (this.mFragment.mTargetWho != null) {
|
||||
Fragment fragment4 = this.mFragment;
|
||||
fragment4.mTargetRequestCode = fragment4.mSavedFragmentState.getInt(TARGET_REQUEST_CODE_STATE_TAG, 0);
|
||||
}
|
||||
if (this.mFragment.mSavedUserVisibleHint != null) {
|
||||
Fragment fragment5 = this.mFragment;
|
||||
fragment5.mUserVisibleHint = fragment5.mSavedUserVisibleHint.booleanValue();
|
||||
this.mFragment.mSavedUserVisibleHint = null;
|
||||
} else {
|
||||
Fragment fragment6 = this.mFragment;
|
||||
fragment6.mUserVisibleHint = fragment6.mSavedFragmentState.getBoolean(USER_VISIBLE_HINT_TAG, true);
|
||||
}
|
||||
if (this.mFragment.mUserVisibleHint) {
|
||||
return;
|
||||
}
|
||||
this.mFragment.mDeferStart = true;
|
||||
}
|
||||
|
||||
void attach() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto ATTACHED: " + this.mFragment);
|
||||
}
|
||||
FragmentStateManager fragmentStateManager = null;
|
||||
if (this.mFragment.mTarget != null) {
|
||||
FragmentStateManager fragmentStateManager2 = this.mFragmentStore.getFragmentStateManager(this.mFragment.mTarget.mWho);
|
||||
if (fragmentStateManager2 == null) {
|
||||
throw new IllegalStateException("Fragment " + this.mFragment + " declared target fragment " + this.mFragment.mTarget + " that does not belong to this FragmentManager!");
|
||||
}
|
||||
Fragment fragment = this.mFragment;
|
||||
fragment.mTargetWho = fragment.mTarget.mWho;
|
||||
this.mFragment.mTarget = null;
|
||||
fragmentStateManager = fragmentStateManager2;
|
||||
} else if (this.mFragment.mTargetWho != null && (fragmentStateManager = this.mFragmentStore.getFragmentStateManager(this.mFragment.mTargetWho)) == null) {
|
||||
throw new IllegalStateException("Fragment " + this.mFragment + " declared target fragment " + this.mFragment.mTargetWho + " that does not belong to this FragmentManager!");
|
||||
}
|
||||
if (fragmentStateManager != null && (FragmentManager.USE_STATE_MANAGER || fragmentStateManager.getFragment().mState < 1)) {
|
||||
fragmentStateManager.moveToExpectedState();
|
||||
}
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragment2.mHost = fragment2.mFragmentManager.getHost();
|
||||
Fragment fragment3 = this.mFragment;
|
||||
fragment3.mParentFragment = fragment3.mFragmentManager.getParent();
|
||||
this.mDispatcher.dispatchOnFragmentPreAttached(this.mFragment, false);
|
||||
this.mFragment.performAttach();
|
||||
this.mDispatcher.dispatchOnFragmentAttached(this.mFragment, false);
|
||||
}
|
||||
|
||||
void create() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto CREATED: " + this.mFragment);
|
||||
}
|
||||
if (!this.mFragment.mIsCreated) {
|
||||
FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher = this.mDispatcher;
|
||||
Fragment fragment = this.mFragment;
|
||||
fragmentLifecycleCallbacksDispatcher.dispatchOnFragmentPreCreated(fragment, fragment.mSavedFragmentState, false);
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragment2.performCreate(fragment2.mSavedFragmentState);
|
||||
FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher2 = this.mDispatcher;
|
||||
Fragment fragment3 = this.mFragment;
|
||||
fragmentLifecycleCallbacksDispatcher2.dispatchOnFragmentCreated(fragment3, fragment3.mSavedFragmentState, false);
|
||||
return;
|
||||
}
|
||||
Fragment fragment4 = this.mFragment;
|
||||
fragment4.restoreChildFragmentState(fragment4.mSavedFragmentState);
|
||||
this.mFragment.mState = 1;
|
||||
}
|
||||
|
||||
void createView() {
|
||||
ViewGroup viewGroup;
|
||||
String str;
|
||||
if (this.mFragment.mFromLayout) {
|
||||
return;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto CREATE_VIEW: " + this.mFragment);
|
||||
}
|
||||
Fragment fragment = this.mFragment;
|
||||
LayoutInflater performGetLayoutInflater = fragment.performGetLayoutInflater(fragment.mSavedFragmentState);
|
||||
if (this.mFragment.mContainer != null) {
|
||||
viewGroup = this.mFragment.mContainer;
|
||||
} else if (this.mFragment.mContainerId == 0) {
|
||||
viewGroup = null;
|
||||
} else {
|
||||
if (this.mFragment.mContainerId == -1) {
|
||||
throw new IllegalArgumentException("Cannot create fragment " + this.mFragment + " for a container view with no id");
|
||||
}
|
||||
viewGroup = (ViewGroup) this.mFragment.mFragmentManager.getContainer().onFindViewById(this.mFragment.mContainerId);
|
||||
if (viewGroup == null && !this.mFragment.mRestored) {
|
||||
try {
|
||||
str = this.mFragment.getResources().getResourceName(this.mFragment.mContainerId);
|
||||
} catch (Resources.NotFoundException unused) {
|
||||
str = EnvironmentCompat.MEDIA_UNKNOWN;
|
||||
}
|
||||
throw new IllegalArgumentException("No view found for id 0x" + Integer.toHexString(this.mFragment.mContainerId) + " (" + str + ") for fragment " + this.mFragment);
|
||||
}
|
||||
}
|
||||
this.mFragment.mContainer = viewGroup;
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragment2.performCreateView(performGetLayoutInflater, viewGroup, fragment2.mSavedFragmentState);
|
||||
if (this.mFragment.mView != null) {
|
||||
boolean z = false;
|
||||
this.mFragment.mView.setSaveFromParentEnabled(false);
|
||||
this.mFragment.mView.setTag(R.id.fragment_container_view_tag, this.mFragment);
|
||||
if (viewGroup != null) {
|
||||
addViewToContainer();
|
||||
}
|
||||
if (this.mFragment.mHidden) {
|
||||
this.mFragment.mView.setVisibility(8);
|
||||
}
|
||||
if (ViewCompat.isAttachedToWindow(this.mFragment.mView)) {
|
||||
ViewCompat.requestApplyInsets(this.mFragment.mView);
|
||||
} else {
|
||||
final View view = this.mFragment.mView;
|
||||
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { // from class: androidx.fragment.app.FragmentStateManager.1
|
||||
@Override // android.view.View.OnAttachStateChangeListener
|
||||
public void onViewDetachedFromWindow(View view2) {
|
||||
}
|
||||
|
||||
@Override // android.view.View.OnAttachStateChangeListener
|
||||
public void onViewAttachedToWindow(View view2) {
|
||||
view.removeOnAttachStateChangeListener(this);
|
||||
ViewCompat.requestApplyInsets(view);
|
||||
}
|
||||
});
|
||||
}
|
||||
this.mFragment.performViewCreated();
|
||||
FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher = this.mDispatcher;
|
||||
Fragment fragment3 = this.mFragment;
|
||||
fragmentLifecycleCallbacksDispatcher.dispatchOnFragmentViewCreated(fragment3, fragment3.mView, this.mFragment.mSavedFragmentState, false);
|
||||
int visibility = this.mFragment.mView.getVisibility();
|
||||
float alpha = this.mFragment.mView.getAlpha();
|
||||
if (FragmentManager.USE_STATE_MANAGER) {
|
||||
this.mFragment.setPostOnViewCreatedAlpha(alpha);
|
||||
if (this.mFragment.mContainer != null && visibility == 0) {
|
||||
View findFocus = this.mFragment.mView.findFocus();
|
||||
if (findFocus != null) {
|
||||
this.mFragment.setFocusedView(findFocus);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "requestFocus: Saved focused view " + findFocus + " for Fragment " + this.mFragment);
|
||||
}
|
||||
}
|
||||
this.mFragment.mView.setAlpha(0.0f);
|
||||
}
|
||||
} else {
|
||||
Fragment fragment4 = this.mFragment;
|
||||
if (visibility == 0 && fragment4.mContainer != null) {
|
||||
z = true;
|
||||
}
|
||||
fragment4.mIsNewlyAdded = z;
|
||||
}
|
||||
}
|
||||
this.mFragment.mState = 2;
|
||||
}
|
||||
|
||||
void activityCreated() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto ACTIVITY_CREATED: " + this.mFragment);
|
||||
}
|
||||
Fragment fragment = this.mFragment;
|
||||
fragment.performActivityCreated(fragment.mSavedFragmentState);
|
||||
FragmentLifecycleCallbacksDispatcher fragmentLifecycleCallbacksDispatcher = this.mDispatcher;
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragmentLifecycleCallbacksDispatcher.dispatchOnFragmentActivityCreated(fragment2, fragment2.mSavedFragmentState, false);
|
||||
}
|
||||
|
||||
void start() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto STARTED: " + this.mFragment);
|
||||
}
|
||||
this.mFragment.performStart();
|
||||
this.mDispatcher.dispatchOnFragmentStarted(this.mFragment, false);
|
||||
}
|
||||
|
||||
void resume() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "moveto RESUMED: " + this.mFragment);
|
||||
}
|
||||
View focusedView = this.mFragment.getFocusedView();
|
||||
if (focusedView != null && isFragmentViewChild(focusedView)) {
|
||||
boolean requestFocus = focusedView.requestFocus();
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
StringBuilder sb = new StringBuilder("requestFocus: Restoring focused view ");
|
||||
sb.append(focusedView);
|
||||
sb.append(" ");
|
||||
sb.append(requestFocus ? "succeeded" : "failed");
|
||||
sb.append(" on Fragment ");
|
||||
sb.append(this.mFragment);
|
||||
sb.append(" resulting in focused view ");
|
||||
sb.append(this.mFragment.mView.findFocus());
|
||||
Log.v(TAG, sb.toString());
|
||||
}
|
||||
}
|
||||
this.mFragment.setFocusedView(null);
|
||||
this.mFragment.performResume();
|
||||
this.mDispatcher.dispatchOnFragmentResumed(this.mFragment, false);
|
||||
this.mFragment.mSavedFragmentState = null;
|
||||
this.mFragment.mSavedViewState = null;
|
||||
this.mFragment.mSavedViewRegistryState = null;
|
||||
}
|
||||
|
||||
private boolean isFragmentViewChild(View view) {
|
||||
if (view == this.mFragment.mView) {
|
||||
return true;
|
||||
}
|
||||
for (ViewParent parent = view.getParent(); parent != null; parent = parent.getParent()) {
|
||||
if (parent == this.mFragment.mView) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void pause() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom RESUMED: " + this.mFragment);
|
||||
}
|
||||
this.mFragment.performPause();
|
||||
this.mDispatcher.dispatchOnFragmentPaused(this.mFragment, false);
|
||||
}
|
||||
|
||||
void stop() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom STARTED: " + this.mFragment);
|
||||
}
|
||||
this.mFragment.performStop();
|
||||
this.mDispatcher.dispatchOnFragmentStopped(this.mFragment, false);
|
||||
}
|
||||
|
||||
FragmentState saveState() {
|
||||
FragmentState fragmentState = new FragmentState(this.mFragment);
|
||||
if (this.mFragment.mState > -1 && fragmentState.mSavedFragmentState == null) {
|
||||
fragmentState.mSavedFragmentState = saveBasicState();
|
||||
if (this.mFragment.mTargetWho != null) {
|
||||
if (fragmentState.mSavedFragmentState == null) {
|
||||
fragmentState.mSavedFragmentState = new Bundle();
|
||||
}
|
||||
fragmentState.mSavedFragmentState.putString(TARGET_STATE_TAG, this.mFragment.mTargetWho);
|
||||
if (this.mFragment.mTargetRequestCode != 0) {
|
||||
fragmentState.mSavedFragmentState.putInt(TARGET_REQUEST_CODE_STATE_TAG, this.mFragment.mTargetRequestCode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fragmentState.mSavedFragmentState = this.mFragment.mSavedFragmentState;
|
||||
}
|
||||
return fragmentState;
|
||||
}
|
||||
|
||||
Fragment.SavedState saveInstanceState() {
|
||||
Bundle saveBasicState;
|
||||
if (this.mFragment.mState <= -1 || (saveBasicState = saveBasicState()) == null) {
|
||||
return null;
|
||||
}
|
||||
return new Fragment.SavedState(saveBasicState);
|
||||
}
|
||||
|
||||
private Bundle saveBasicState() {
|
||||
Bundle bundle = new Bundle();
|
||||
this.mFragment.performSaveInstanceState(bundle);
|
||||
this.mDispatcher.dispatchOnFragmentSaveInstanceState(this.mFragment, bundle, false);
|
||||
if (bundle.isEmpty()) {
|
||||
bundle = null;
|
||||
}
|
||||
if (this.mFragment.mView != null) {
|
||||
saveViewState();
|
||||
}
|
||||
if (this.mFragment.mSavedViewState != null) {
|
||||
if (bundle == null) {
|
||||
bundle = new Bundle();
|
||||
}
|
||||
bundle.putSparseParcelableArray(VIEW_STATE_TAG, this.mFragment.mSavedViewState);
|
||||
}
|
||||
if (this.mFragment.mSavedViewRegistryState != null) {
|
||||
if (bundle == null) {
|
||||
bundle = new Bundle();
|
||||
}
|
||||
bundle.putBundle(VIEW_REGISTRY_STATE_TAG, this.mFragment.mSavedViewRegistryState);
|
||||
}
|
||||
if (!this.mFragment.mUserVisibleHint) {
|
||||
if (bundle == null) {
|
||||
bundle = new Bundle();
|
||||
}
|
||||
bundle.putBoolean(USER_VISIBLE_HINT_TAG, this.mFragment.mUserVisibleHint);
|
||||
}
|
||||
return bundle;
|
||||
}
|
||||
|
||||
void saveViewState() {
|
||||
if (this.mFragment.mView == null) {
|
||||
return;
|
||||
}
|
||||
SparseArray<Parcelable> sparseArray = new SparseArray<>();
|
||||
this.mFragment.mView.saveHierarchyState(sparseArray);
|
||||
if (sparseArray.size() > 0) {
|
||||
this.mFragment.mSavedViewState = sparseArray;
|
||||
}
|
||||
Bundle bundle = new Bundle();
|
||||
this.mFragment.mViewLifecycleOwner.performSave(bundle);
|
||||
if (bundle.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
this.mFragment.mSavedViewRegistryState = bundle;
|
||||
}
|
||||
|
||||
void destroyFragmentView() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom CREATE_VIEW: " + this.mFragment);
|
||||
}
|
||||
if (this.mFragment.mContainer != null && this.mFragment.mView != null) {
|
||||
this.mFragment.mContainer.removeView(this.mFragment.mView);
|
||||
}
|
||||
this.mFragment.performDestroyView();
|
||||
this.mDispatcher.dispatchOnFragmentViewDestroyed(this.mFragment, false);
|
||||
this.mFragment.mContainer = null;
|
||||
this.mFragment.mView = null;
|
||||
this.mFragment.mViewLifecycleOwner = null;
|
||||
this.mFragment.mViewLifecycleOwnerLiveData.setValue(null);
|
||||
this.mFragment.mInLayout = false;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
Fragment findActiveFragment;
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom CREATED: " + this.mFragment);
|
||||
}
|
||||
boolean z = true;
|
||||
boolean z2 = this.mFragment.mRemoving && !this.mFragment.isInBackStack();
|
||||
if (z2 || this.mFragmentStore.getNonConfig().shouldDestroy(this.mFragment)) {
|
||||
FragmentHostCallback<?> fragmentHostCallback = this.mFragment.mHost;
|
||||
if (fragmentHostCallback instanceof ViewModelStoreOwner) {
|
||||
z = this.mFragmentStore.getNonConfig().isCleared();
|
||||
} else if (fragmentHostCallback.getContext() instanceof Activity) {
|
||||
z = true ^ ((Activity) fragmentHostCallback.getContext()).isChangingConfigurations();
|
||||
}
|
||||
if (z2 || z) {
|
||||
this.mFragmentStore.getNonConfig().clearNonConfigState(this.mFragment);
|
||||
}
|
||||
this.mFragment.performDestroy();
|
||||
this.mDispatcher.dispatchOnFragmentDestroyed(this.mFragment, false);
|
||||
for (FragmentStateManager fragmentStateManager : this.mFragmentStore.getActiveFragmentStateManagers()) {
|
||||
if (fragmentStateManager != null) {
|
||||
Fragment fragment = fragmentStateManager.getFragment();
|
||||
if (this.mFragment.mWho.equals(fragment.mTargetWho)) {
|
||||
fragment.mTarget = this.mFragment;
|
||||
fragment.mTargetWho = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.mFragment.mTargetWho != null) {
|
||||
Fragment fragment2 = this.mFragment;
|
||||
fragment2.mTarget = this.mFragmentStore.findActiveFragment(fragment2.mTargetWho);
|
||||
}
|
||||
this.mFragmentStore.makeInactive(this);
|
||||
return;
|
||||
}
|
||||
if (this.mFragment.mTargetWho != null && (findActiveFragment = this.mFragmentStore.findActiveFragment(this.mFragment.mTargetWho)) != null && findActiveFragment.mRetainInstance) {
|
||||
this.mFragment.mTarget = findActiveFragment;
|
||||
}
|
||||
this.mFragment.mState = 0;
|
||||
}
|
||||
|
||||
void detach() {
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "movefrom ATTACHED: " + this.mFragment);
|
||||
}
|
||||
this.mFragment.performDetach();
|
||||
this.mDispatcher.dispatchOnFragmentDetached(this.mFragment, false);
|
||||
this.mFragment.mState = -1;
|
||||
this.mFragment.mHost = null;
|
||||
this.mFragment.mParentFragment = null;
|
||||
this.mFragment.mFragmentManager = null;
|
||||
if ((!this.mFragment.mRemoving || this.mFragment.isInBackStack()) && !this.mFragmentStore.getNonConfig().shouldDestroy(this.mFragment)) {
|
||||
return;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(3)) {
|
||||
Log.d(TAG, "initState called for fragment: " + this.mFragment);
|
||||
}
|
||||
this.mFragment.initState();
|
||||
}
|
||||
|
||||
void addViewToContainer() {
|
||||
this.mFragment.mContainer.addView(this.mFragment.mView, this.mFragmentStore.findFragmentIndexInContainer(this.mFragment));
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.CLASS)
|
||||
/* loaded from: classes.dex */
|
||||
public @interface FragmentStateManagerControl {
|
||||
}
|
@ -0,0 +1,203 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@Deprecated
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentStatePagerAdapter extends PagerAdapter {
|
||||
public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;
|
||||
|
||||
@Deprecated
|
||||
public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = "FragmentStatePagerAdapt";
|
||||
private final int mBehavior;
|
||||
private FragmentTransaction mCurTransaction;
|
||||
private Fragment mCurrentPrimaryItem;
|
||||
private boolean mExecutingFinishUpdate;
|
||||
private final FragmentManager mFragmentManager;
|
||||
private ArrayList<Fragment> mFragments;
|
||||
private ArrayList<Fragment.SavedState> mSavedState;
|
||||
|
||||
public abstract Fragment getItem(int i);
|
||||
|
||||
@Deprecated
|
||||
public FragmentStatePagerAdapter(FragmentManager fragmentManager) {
|
||||
this(fragmentManager, 0);
|
||||
}
|
||||
|
||||
public FragmentStatePagerAdapter(FragmentManager fragmentManager, int i) {
|
||||
this.mCurTransaction = null;
|
||||
this.mSavedState = new ArrayList<>();
|
||||
this.mFragments = new ArrayList<>();
|
||||
this.mCurrentPrimaryItem = null;
|
||||
this.mFragmentManager = fragmentManager;
|
||||
this.mBehavior = i;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void startUpdate(ViewGroup viewGroup) {
|
||||
if (viewGroup.getId() != -1) {
|
||||
return;
|
||||
}
|
||||
throw new IllegalStateException("ViewPager with adapter " + this + " requires a view id");
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public Object instantiateItem(ViewGroup viewGroup, int i) {
|
||||
Fragment.SavedState savedState;
|
||||
Fragment fragment;
|
||||
if (this.mFragments.size() > i && (fragment = this.mFragments.get(i)) != null) {
|
||||
return fragment;
|
||||
}
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
Fragment item = getItem(i);
|
||||
if (this.mSavedState.size() > i && (savedState = this.mSavedState.get(i)) != null) {
|
||||
item.setInitialSavedState(savedState);
|
||||
}
|
||||
while (this.mFragments.size() <= i) {
|
||||
this.mFragments.add(null);
|
||||
}
|
||||
item.setMenuVisibility(false);
|
||||
if (this.mBehavior == 0) {
|
||||
item.setUserVisibleHint(false);
|
||||
}
|
||||
this.mFragments.set(i, item);
|
||||
this.mCurTransaction.add(viewGroup.getId(), item);
|
||||
if (this.mBehavior == 1) {
|
||||
this.mCurTransaction.setMaxLifecycle(item, Lifecycle.State.STARTED);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void destroyItem(ViewGroup viewGroup, int i, Object obj) {
|
||||
Fragment fragment = (Fragment) obj;
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
while (this.mSavedState.size() <= i) {
|
||||
this.mSavedState.add(null);
|
||||
}
|
||||
this.mSavedState.set(i, fragment.isAdded() ? this.mFragmentManager.saveFragmentInstanceState(fragment) : null);
|
||||
this.mFragments.set(i, null);
|
||||
this.mCurTransaction.remove(fragment);
|
||||
if (fragment.equals(this.mCurrentPrimaryItem)) {
|
||||
this.mCurrentPrimaryItem = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void setPrimaryItem(ViewGroup viewGroup, int i, Object obj) {
|
||||
Fragment fragment = (Fragment) obj;
|
||||
Fragment fragment2 = this.mCurrentPrimaryItem;
|
||||
if (fragment != fragment2) {
|
||||
if (fragment2 != null) {
|
||||
fragment2.setMenuVisibility(false);
|
||||
if (this.mBehavior == 1) {
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
this.mCurTransaction.setMaxLifecycle(this.mCurrentPrimaryItem, Lifecycle.State.STARTED);
|
||||
} else {
|
||||
this.mCurrentPrimaryItem.setUserVisibleHint(false);
|
||||
}
|
||||
}
|
||||
fragment.setMenuVisibility(true);
|
||||
if (this.mBehavior == 1) {
|
||||
if (this.mCurTransaction == null) {
|
||||
this.mCurTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
this.mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
|
||||
} else {
|
||||
fragment.setUserVisibleHint(true);
|
||||
}
|
||||
this.mCurrentPrimaryItem = fragment;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void finishUpdate(ViewGroup viewGroup) {
|
||||
FragmentTransaction fragmentTransaction = this.mCurTransaction;
|
||||
if (fragmentTransaction != null) {
|
||||
if (!this.mExecutingFinishUpdate) {
|
||||
try {
|
||||
this.mExecutingFinishUpdate = true;
|
||||
fragmentTransaction.commitNowAllowingStateLoss();
|
||||
} finally {
|
||||
this.mExecutingFinishUpdate = false;
|
||||
}
|
||||
}
|
||||
this.mCurTransaction = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public boolean isViewFromObject(View view, Object obj) {
|
||||
return ((Fragment) obj).getView() == view;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public Parcelable saveState() {
|
||||
Bundle bundle;
|
||||
if (this.mSavedState.size() > 0) {
|
||||
bundle = new Bundle();
|
||||
Fragment.SavedState[] savedStateArr = new Fragment.SavedState[this.mSavedState.size()];
|
||||
this.mSavedState.toArray(savedStateArr);
|
||||
bundle.putParcelableArray("states", savedStateArr);
|
||||
} else {
|
||||
bundle = null;
|
||||
}
|
||||
for (int i = 0; i < this.mFragments.size(); i++) {
|
||||
Fragment fragment = this.mFragments.get(i);
|
||||
if (fragment != null && fragment.isAdded()) {
|
||||
if (bundle == null) {
|
||||
bundle = new Bundle();
|
||||
}
|
||||
this.mFragmentManager.putFragment(bundle, "f" + i, fragment);
|
||||
}
|
||||
}
|
||||
return bundle;
|
||||
}
|
||||
|
||||
@Override // androidx.viewpager.widget.PagerAdapter
|
||||
public void restoreState(Parcelable parcelable, ClassLoader classLoader) {
|
||||
if (parcelable != null) {
|
||||
Bundle bundle = (Bundle) parcelable;
|
||||
bundle.setClassLoader(classLoader);
|
||||
Parcelable[] parcelableArray = bundle.getParcelableArray("states");
|
||||
this.mSavedState.clear();
|
||||
this.mFragments.clear();
|
||||
if (parcelableArray != null) {
|
||||
for (Parcelable parcelable2 : parcelableArray) {
|
||||
this.mSavedState.add((Fragment.SavedState) parcelable2);
|
||||
}
|
||||
}
|
||||
for (String str : bundle.keySet()) {
|
||||
if (str.startsWith("f")) {
|
||||
int parseInt = Integer.parseInt(str.substring(1));
|
||||
Fragment fragment = this.mFragmentManager.getFragment(bundle, str);
|
||||
if (fragment != null) {
|
||||
while (this.mFragments.size() <= parseInt) {
|
||||
this.mFragments.add(null);
|
||||
}
|
||||
fragment.setMenuVisibility(false);
|
||||
this.mFragments.set(parseInt, fragment);
|
||||
} else {
|
||||
Log.w(TAG, "Bad fragment at key " + str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
319
02-Easy5/E5/sources/androidx/fragment/app/FragmentStore.java
Normal file
319
02-Easy5/E5/sources/androidx/fragment/app/FragmentStore.java
Normal file
@ -0,0 +1,319 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.ViewGroup;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentStore {
|
||||
private static final String TAG = "FragmentManager";
|
||||
private FragmentManagerViewModel mNonConfig;
|
||||
private final ArrayList<Fragment> mAdded = new ArrayList<>();
|
||||
private final HashMap<String, FragmentStateManager> mActive = new HashMap<>();
|
||||
|
||||
FragmentManagerViewModel getNonConfig() {
|
||||
return this.mNonConfig;
|
||||
}
|
||||
|
||||
void setNonConfig(FragmentManagerViewModel fragmentManagerViewModel) {
|
||||
this.mNonConfig = fragmentManagerViewModel;
|
||||
}
|
||||
|
||||
FragmentStore() {
|
||||
}
|
||||
|
||||
void resetActiveFragments() {
|
||||
this.mActive.clear();
|
||||
}
|
||||
|
||||
void restoreAddedFragments(List<String> list) {
|
||||
this.mAdded.clear();
|
||||
if (list != null) {
|
||||
for (String str : list) {
|
||||
Fragment findActiveFragment = findActiveFragment(str);
|
||||
if (findActiveFragment == null) {
|
||||
throw new IllegalStateException("No instantiated fragment for (" + str + ")");
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "restoreSaveState: added (" + str + "): " + findActiveFragment);
|
||||
}
|
||||
addFragment(findActiveFragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void makeActive(FragmentStateManager fragmentStateManager) {
|
||||
Fragment fragment = fragmentStateManager.getFragment();
|
||||
if (containsActiveFragment(fragment.mWho)) {
|
||||
return;
|
||||
}
|
||||
this.mActive.put(fragment.mWho, fragmentStateManager);
|
||||
if (fragment.mRetainInstanceChangedWhileDetached) {
|
||||
if (fragment.mRetainInstance) {
|
||||
this.mNonConfig.addRetainedFragment(fragment);
|
||||
} else {
|
||||
this.mNonConfig.removeRetainedFragment(fragment);
|
||||
}
|
||||
fragment.mRetainInstanceChangedWhileDetached = false;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Added fragment to active set " + fragment);
|
||||
}
|
||||
}
|
||||
|
||||
void addFragment(Fragment fragment) {
|
||||
if (this.mAdded.contains(fragment)) {
|
||||
throw new IllegalStateException("Fragment already added: " + fragment);
|
||||
}
|
||||
synchronized (this.mAdded) {
|
||||
this.mAdded.add(fragment);
|
||||
}
|
||||
fragment.mAdded = true;
|
||||
}
|
||||
|
||||
void dispatchStateChange(int i) {
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
fragmentStateManager.setFragmentManagerState(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void moveToExpectedState() {
|
||||
Iterator<Fragment> it = this.mAdded.iterator();
|
||||
while (it.hasNext()) {
|
||||
FragmentStateManager fragmentStateManager = this.mActive.get(it.next().mWho);
|
||||
if (fragmentStateManager != null) {
|
||||
fragmentStateManager.moveToExpectedState();
|
||||
}
|
||||
}
|
||||
for (FragmentStateManager fragmentStateManager2 : this.mActive.values()) {
|
||||
if (fragmentStateManager2 != null) {
|
||||
fragmentStateManager2.moveToExpectedState();
|
||||
Fragment fragment = fragmentStateManager2.getFragment();
|
||||
if (fragment.mRemoving && !fragment.isInBackStack()) {
|
||||
makeInactive(fragmentStateManager2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void removeFragment(Fragment fragment) {
|
||||
synchronized (this.mAdded) {
|
||||
this.mAdded.remove(fragment);
|
||||
}
|
||||
fragment.mAdded = false;
|
||||
}
|
||||
|
||||
void makeInactive(FragmentStateManager fragmentStateManager) {
|
||||
Fragment fragment = fragmentStateManager.getFragment();
|
||||
if (fragment.mRetainInstance) {
|
||||
this.mNonConfig.removeRetainedFragment(fragment);
|
||||
}
|
||||
if (this.mActive.put(fragment.mWho, null) != null && FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Removed fragment from active set " + fragment);
|
||||
}
|
||||
}
|
||||
|
||||
void burpActive() {
|
||||
this.mActive.values().removeAll(Collections.singleton(null));
|
||||
}
|
||||
|
||||
ArrayList<FragmentState> saveActiveFragments() {
|
||||
ArrayList<FragmentState> arrayList = new ArrayList<>(this.mActive.size());
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
Fragment fragment = fragmentStateManager.getFragment();
|
||||
FragmentState saveState = fragmentStateManager.saveState();
|
||||
arrayList.add(saveState);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "Saved state of " + fragment + ": " + saveState.mSavedFragmentState);
|
||||
}
|
||||
}
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
ArrayList<String> saveAddedFragments() {
|
||||
synchronized (this.mAdded) {
|
||||
if (this.mAdded.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
ArrayList<String> arrayList = new ArrayList<>(this.mAdded.size());
|
||||
Iterator<Fragment> it = this.mAdded.iterator();
|
||||
while (it.hasNext()) {
|
||||
Fragment next = it.next();
|
||||
arrayList.add(next.mWho);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v(TAG, "saveAllState: adding fragment (" + next.mWho + "): " + next);
|
||||
}
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
}
|
||||
|
||||
List<FragmentStateManager> getActiveFragmentStateManagers() {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
arrayList.add(fragmentStateManager);
|
||||
}
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
List<Fragment> getFragments() {
|
||||
ArrayList arrayList;
|
||||
if (this.mAdded.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
synchronized (this.mAdded) {
|
||||
arrayList = new ArrayList(this.mAdded);
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
List<Fragment> getActiveFragments() {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
arrayList.add(fragmentStateManager.getFragment());
|
||||
} else {
|
||||
arrayList.add(null);
|
||||
}
|
||||
}
|
||||
return arrayList;
|
||||
}
|
||||
|
||||
int getActiveFragmentCount() {
|
||||
return this.mActive.size();
|
||||
}
|
||||
|
||||
Fragment findFragmentById(int i) {
|
||||
for (int size = this.mAdded.size() - 1; size >= 0; size--) {
|
||||
Fragment fragment = this.mAdded.get(size);
|
||||
if (fragment != null && fragment.mFragmentId == i) {
|
||||
return fragment;
|
||||
}
|
||||
}
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
Fragment fragment2 = fragmentStateManager.getFragment();
|
||||
if (fragment2.mFragmentId == i) {
|
||||
return fragment2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Fragment findFragmentByTag(String str) {
|
||||
if (str != null) {
|
||||
for (int size = this.mAdded.size() - 1; size >= 0; size--) {
|
||||
Fragment fragment = this.mAdded.get(size);
|
||||
if (fragment != null && str.equals(fragment.mTag)) {
|
||||
return fragment;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (str == null) {
|
||||
return null;
|
||||
}
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null) {
|
||||
Fragment fragment2 = fragmentStateManager.getFragment();
|
||||
if (str.equals(fragment2.mTag)) {
|
||||
return fragment2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
boolean containsActiveFragment(String str) {
|
||||
return this.mActive.get(str) != null;
|
||||
}
|
||||
|
||||
FragmentStateManager getFragmentStateManager(String str) {
|
||||
return this.mActive.get(str);
|
||||
}
|
||||
|
||||
Fragment findFragmentByWho(String str) {
|
||||
Fragment findFragmentByWho;
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
if (fragmentStateManager != null && (findFragmentByWho = fragmentStateManager.getFragment().findFragmentByWho(str)) != null) {
|
||||
return findFragmentByWho;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Fragment findActiveFragment(String str) {
|
||||
FragmentStateManager fragmentStateManager = this.mActive.get(str);
|
||||
if (fragmentStateManager != null) {
|
||||
return fragmentStateManager.getFragment();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
int findFragmentIndexInContainer(Fragment fragment) {
|
||||
ViewGroup viewGroup = fragment.mContainer;
|
||||
if (viewGroup == null) {
|
||||
return -1;
|
||||
}
|
||||
int indexOf = this.mAdded.indexOf(fragment);
|
||||
for (int i = indexOf - 1; i >= 0; i--) {
|
||||
Fragment fragment2 = this.mAdded.get(i);
|
||||
if (fragment2.mContainer == viewGroup && fragment2.mView != null) {
|
||||
return viewGroup.indexOfChild(fragment2.mView) + 1;
|
||||
}
|
||||
}
|
||||
while (true) {
|
||||
indexOf++;
|
||||
if (indexOf >= this.mAdded.size()) {
|
||||
return -1;
|
||||
}
|
||||
Fragment fragment3 = this.mAdded.get(indexOf);
|
||||
if (fragment3.mContainer == viewGroup && fragment3.mView != null) {
|
||||
return viewGroup.indexOfChild(fragment3.mView);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dump(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) {
|
||||
String str2 = str + " ";
|
||||
if (!this.mActive.isEmpty()) {
|
||||
printWriter.print(str);
|
||||
printWriter.println("Active Fragments:");
|
||||
for (FragmentStateManager fragmentStateManager : this.mActive.values()) {
|
||||
printWriter.print(str);
|
||||
if (fragmentStateManager != null) {
|
||||
Fragment fragment = fragmentStateManager.getFragment();
|
||||
printWriter.println(fragment);
|
||||
fragment.dump(str2, fileDescriptor, printWriter, strArr);
|
||||
} else {
|
||||
printWriter.println("null");
|
||||
}
|
||||
}
|
||||
}
|
||||
int size = this.mAdded.size();
|
||||
if (size > 0) {
|
||||
printWriter.print(str);
|
||||
printWriter.println("Added Fragments:");
|
||||
for (int i = 0; i < size; i++) {
|
||||
Fragment fragment2 = this.mAdded.get(i);
|
||||
printWriter.print(str);
|
||||
printWriter.print(" #");
|
||||
printWriter.print(i);
|
||||
printWriter.print(": ");
|
||||
printWriter.println(fragment2.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
300
02-Easy5/E5/sources/androidx/fragment/app/FragmentTabHost.java
Normal file
300
02-Easy5/E5/sources/androidx/fragment/app/FragmentTabHost.java
Normal file
@ -0,0 +1,300 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.R;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TabHost;
|
||||
import android.widget.TabWidget;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@Deprecated
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentTabHost extends TabHost implements TabHost.OnTabChangeListener {
|
||||
private boolean mAttached;
|
||||
private int mContainerId;
|
||||
private Context mContext;
|
||||
private FragmentManager mFragmentManager;
|
||||
private TabInfo mLastTab;
|
||||
private TabHost.OnTabChangeListener mOnTabChangeListener;
|
||||
private FrameLayout mRealTabContent;
|
||||
private final ArrayList<TabInfo> mTabs;
|
||||
|
||||
@Override // android.widget.TabHost
|
||||
@Deprecated
|
||||
public void setOnTabChangedListener(TabHost.OnTabChangeListener onTabChangeListener) {
|
||||
this.mOnTabChangeListener = onTabChangeListener;
|
||||
}
|
||||
|
||||
static final class TabInfo {
|
||||
final Bundle args;
|
||||
final Class<?> clss;
|
||||
Fragment fragment;
|
||||
final String tag;
|
||||
|
||||
TabInfo(String str, Class<?> cls, Bundle bundle) {
|
||||
this.tag = str;
|
||||
this.clss = cls;
|
||||
this.args = bundle;
|
||||
}
|
||||
}
|
||||
|
||||
static class DummyTabFactory implements TabHost.TabContentFactory {
|
||||
private final Context mContext;
|
||||
|
||||
public DummyTabFactory(Context context) {
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
@Override // android.widget.TabHost.TabContentFactory
|
||||
public View createTabContent(String str) {
|
||||
View view = new View(this.mContext);
|
||||
view.setMinimumWidth(0);
|
||||
view.setMinimumHeight(0);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
|
||||
static class SavedState extends View.BaseSavedState {
|
||||
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { // from class: androidx.fragment.app.FragmentTabHost.SavedState.1
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public SavedState createFromParcel(Parcel parcel) {
|
||||
return new SavedState(parcel);
|
||||
}
|
||||
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // android.os.Parcelable.Creator
|
||||
public SavedState[] newArray(int i) {
|
||||
return new SavedState[i];
|
||||
}
|
||||
};
|
||||
String curTab;
|
||||
|
||||
SavedState(Parcelable parcelable) {
|
||||
super(parcelable);
|
||||
}
|
||||
|
||||
SavedState(Parcel parcel) {
|
||||
super(parcel);
|
||||
this.curTab = parcel.readString();
|
||||
}
|
||||
|
||||
@Override // android.view.View.BaseSavedState, android.view.AbsSavedState, android.os.Parcelable
|
||||
public void writeToParcel(Parcel parcel, int i) {
|
||||
super.writeToParcel(parcel, i);
|
||||
parcel.writeString(this.curTab);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "FragmentTabHost.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " curTab=" + this.curTab + "}";
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTabHost(Context context) {
|
||||
super(context, null);
|
||||
this.mTabs = new ArrayList<>();
|
||||
initFragmentTabHost(context, null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTabHost(Context context, AttributeSet attributeSet) {
|
||||
super(context, attributeSet);
|
||||
this.mTabs = new ArrayList<>();
|
||||
initFragmentTabHost(context, attributeSet);
|
||||
}
|
||||
|
||||
private void initFragmentTabHost(Context context, AttributeSet attributeSet) {
|
||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, new int[]{R.attr.inflatedId}, 0, 0);
|
||||
this.mContainerId = obtainStyledAttributes.getResourceId(0, 0);
|
||||
obtainStyledAttributes.recycle();
|
||||
super.setOnTabChangedListener(this);
|
||||
}
|
||||
|
||||
private void ensureHierarchy(Context context) {
|
||||
if (findViewById(R.id.tabs) == null) {
|
||||
LinearLayout linearLayout = new LinearLayout(context);
|
||||
linearLayout.setOrientation(1);
|
||||
addView(linearLayout, new FrameLayout.LayoutParams(-1, -1));
|
||||
TabWidget tabWidget = new TabWidget(context);
|
||||
tabWidget.setId(R.id.tabs);
|
||||
tabWidget.setOrientation(0);
|
||||
linearLayout.addView(tabWidget, new LinearLayout.LayoutParams(-1, -2, 0.0f));
|
||||
FrameLayout frameLayout = new FrameLayout(context);
|
||||
frameLayout.setId(R.id.tabcontent);
|
||||
linearLayout.addView(frameLayout, new LinearLayout.LayoutParams(0, 0, 0.0f));
|
||||
FrameLayout frameLayout2 = new FrameLayout(context);
|
||||
this.mRealTabContent = frameLayout2;
|
||||
frameLayout2.setId(this.mContainerId);
|
||||
linearLayout.addView(frameLayout2, new LinearLayout.LayoutParams(-1, 0, 1.0f));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.widget.TabHost
|
||||
@Deprecated
|
||||
public void setup() {
|
||||
throw new IllegalStateException("Must call setup() that takes a Context and FragmentManager");
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setup(Context context, FragmentManager fragmentManager) {
|
||||
ensureHierarchy(context);
|
||||
super.setup();
|
||||
this.mContext = context;
|
||||
this.mFragmentManager = fragmentManager;
|
||||
ensureContent();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setup(Context context, FragmentManager fragmentManager, int i) {
|
||||
ensureHierarchy(context);
|
||||
super.setup();
|
||||
this.mContext = context;
|
||||
this.mFragmentManager = fragmentManager;
|
||||
this.mContainerId = i;
|
||||
ensureContent();
|
||||
this.mRealTabContent.setId(i);
|
||||
if (getId() == -1) {
|
||||
setId(R.id.tabhost);
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureContent() {
|
||||
if (this.mRealTabContent == null) {
|
||||
FrameLayout frameLayout = (FrameLayout) findViewById(this.mContainerId);
|
||||
this.mRealTabContent = frameLayout;
|
||||
if (frameLayout != null) {
|
||||
return;
|
||||
}
|
||||
throw new IllegalStateException("No tab content FrameLayout found for id " + this.mContainerId);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void addTab(TabHost.TabSpec tabSpec, Class<?> cls, Bundle bundle) {
|
||||
tabSpec.setContent(new DummyTabFactory(this.mContext));
|
||||
String tag = tabSpec.getTag();
|
||||
TabInfo tabInfo = new TabInfo(tag, cls, bundle);
|
||||
if (this.mAttached) {
|
||||
tabInfo.fragment = this.mFragmentManager.findFragmentByTag(tag);
|
||||
if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
|
||||
FragmentTransaction beginTransaction = this.mFragmentManager.beginTransaction();
|
||||
beginTransaction.detach(tabInfo.fragment);
|
||||
beginTransaction.commit();
|
||||
}
|
||||
}
|
||||
this.mTabs.add(tabInfo);
|
||||
addTab(tabSpec);
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup, android.view.View
|
||||
@Deprecated
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
String currentTabTag = getCurrentTabTag();
|
||||
int size = this.mTabs.size();
|
||||
FragmentTransaction fragmentTransaction = null;
|
||||
for (int i = 0; i < size; i++) {
|
||||
TabInfo tabInfo = this.mTabs.get(i);
|
||||
tabInfo.fragment = this.mFragmentManager.findFragmentByTag(tabInfo.tag);
|
||||
if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
|
||||
if (tabInfo.tag.equals(currentTabTag)) {
|
||||
this.mLastTab = tabInfo;
|
||||
} else {
|
||||
if (fragmentTransaction == null) {
|
||||
fragmentTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
fragmentTransaction.detach(tabInfo.fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.mAttached = true;
|
||||
FragmentTransaction doTabChanged = doTabChanged(currentTabTag, fragmentTransaction);
|
||||
if (doTabChanged != null) {
|
||||
doTabChanged.commit();
|
||||
this.mFragmentManager.executePendingTransactions();
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.view.ViewGroup, android.view.View
|
||||
@Deprecated
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
this.mAttached = false;
|
||||
}
|
||||
|
||||
@Override // android.view.View
|
||||
@Deprecated
|
||||
protected Parcelable onSaveInstanceState() {
|
||||
SavedState savedState = new SavedState(super.onSaveInstanceState());
|
||||
savedState.curTab = getCurrentTabTag();
|
||||
return savedState;
|
||||
}
|
||||
|
||||
@Override // android.view.View
|
||||
@Deprecated
|
||||
protected void onRestoreInstanceState(Parcelable parcelable) {
|
||||
if (!(parcelable instanceof SavedState)) {
|
||||
super.onRestoreInstanceState(parcelable);
|
||||
return;
|
||||
}
|
||||
SavedState savedState = (SavedState) parcelable;
|
||||
super.onRestoreInstanceState(savedState.getSuperState());
|
||||
setCurrentTabByTag(savedState.curTab);
|
||||
}
|
||||
|
||||
@Override // android.widget.TabHost.OnTabChangeListener
|
||||
@Deprecated
|
||||
public void onTabChanged(String str) {
|
||||
FragmentTransaction doTabChanged;
|
||||
if (this.mAttached && (doTabChanged = doTabChanged(str, null)) != null) {
|
||||
doTabChanged.commit();
|
||||
}
|
||||
TabHost.OnTabChangeListener onTabChangeListener = this.mOnTabChangeListener;
|
||||
if (onTabChangeListener != null) {
|
||||
onTabChangeListener.onTabChanged(str);
|
||||
}
|
||||
}
|
||||
|
||||
private FragmentTransaction doTabChanged(String str, FragmentTransaction fragmentTransaction) {
|
||||
TabInfo tabInfoForTag = getTabInfoForTag(str);
|
||||
if (this.mLastTab != tabInfoForTag) {
|
||||
if (fragmentTransaction == null) {
|
||||
fragmentTransaction = this.mFragmentManager.beginTransaction();
|
||||
}
|
||||
TabInfo tabInfo = this.mLastTab;
|
||||
if (tabInfo != null && tabInfo.fragment != null) {
|
||||
fragmentTransaction.detach(this.mLastTab.fragment);
|
||||
}
|
||||
if (tabInfoForTag != null) {
|
||||
if (tabInfoForTag.fragment == null) {
|
||||
tabInfoForTag.fragment = this.mFragmentManager.getFragmentFactory().instantiate(this.mContext.getClassLoader(), tabInfoForTag.clss.getName());
|
||||
tabInfoForTag.fragment.setArguments(tabInfoForTag.args);
|
||||
fragmentTransaction.add(this.mContainerId, tabInfoForTag.fragment, tabInfoForTag.tag);
|
||||
} else {
|
||||
fragmentTransaction.attach(tabInfoForTag.fragment);
|
||||
}
|
||||
}
|
||||
this.mLastTab = tabInfoForTag;
|
||||
}
|
||||
return fragmentTransaction;
|
||||
}
|
||||
|
||||
private TabInfo getTabInfoForTag(String str) {
|
||||
int size = this.mTabs.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
TabInfo tabInfo = this.mTabs.get(i);
|
||||
if (tabInfo.tag.equals(str)) {
|
||||
return tabInfo;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,356 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentTransaction {
|
||||
static final int OP_ADD = 1;
|
||||
static final int OP_ATTACH = 7;
|
||||
static final int OP_DETACH = 6;
|
||||
static final int OP_HIDE = 4;
|
||||
static final int OP_NULL = 0;
|
||||
static final int OP_REMOVE = 3;
|
||||
static final int OP_REPLACE = 2;
|
||||
static final int OP_SET_MAX_LIFECYCLE = 10;
|
||||
static final int OP_SET_PRIMARY_NAV = 8;
|
||||
static final int OP_SHOW = 5;
|
||||
static final int OP_UNSET_PRIMARY_NAV = 9;
|
||||
public static final int TRANSIT_ENTER_MASK = 4096;
|
||||
public static final int TRANSIT_EXIT_MASK = 8192;
|
||||
public static final int TRANSIT_FRAGMENT_CLOSE = 8194;
|
||||
public static final int TRANSIT_FRAGMENT_FADE = 4099;
|
||||
public static final int TRANSIT_FRAGMENT_OPEN = 4097;
|
||||
public static final int TRANSIT_NONE = 0;
|
||||
public static final int TRANSIT_UNSET = -1;
|
||||
boolean mAddToBackStack;
|
||||
boolean mAllowAddToBackStack;
|
||||
int mBreadCrumbShortTitleRes;
|
||||
CharSequence mBreadCrumbShortTitleText;
|
||||
int mBreadCrumbTitleRes;
|
||||
CharSequence mBreadCrumbTitleText;
|
||||
private final ClassLoader mClassLoader;
|
||||
ArrayList<Runnable> mCommitRunnables;
|
||||
int mEnterAnim;
|
||||
int mExitAnim;
|
||||
private final FragmentFactory mFragmentFactory;
|
||||
String mName;
|
||||
ArrayList<Op> mOps;
|
||||
int mPopEnterAnim;
|
||||
int mPopExitAnim;
|
||||
boolean mReorderingAllowed;
|
||||
ArrayList<String> mSharedElementSourceNames;
|
||||
ArrayList<String> mSharedElementTargetNames;
|
||||
int mTransition;
|
||||
|
||||
public abstract int commit();
|
||||
|
||||
public abstract int commitAllowingStateLoss();
|
||||
|
||||
public abstract void commitNow();
|
||||
|
||||
public abstract void commitNowAllowingStateLoss();
|
||||
|
||||
public boolean isAddToBackStackAllowed() {
|
||||
return this.mAllowAddToBackStack;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setBreadCrumbShortTitle(int i) {
|
||||
this.mBreadCrumbShortTitleRes = i;
|
||||
this.mBreadCrumbShortTitleText = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setBreadCrumbShortTitle(CharSequence charSequence) {
|
||||
this.mBreadCrumbShortTitleRes = 0;
|
||||
this.mBreadCrumbShortTitleText = charSequence;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setBreadCrumbTitle(int i) {
|
||||
this.mBreadCrumbTitleRes = i;
|
||||
this.mBreadCrumbTitleText = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setBreadCrumbTitle(CharSequence charSequence) {
|
||||
this.mBreadCrumbTitleRes = 0;
|
||||
this.mBreadCrumbTitleText = charSequence;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction setCustomAnimations(int i, int i2, int i3, int i4) {
|
||||
this.mEnterAnim = i;
|
||||
this.mExitAnim = i2;
|
||||
this.mPopEnterAnim = i3;
|
||||
this.mPopExitAnim = i4;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction setReorderingAllowed(boolean z) {
|
||||
this.mReorderingAllowed = z;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction setTransition(int i) {
|
||||
this.mTransition = i;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setTransitionStyle(int i) {
|
||||
return this;
|
||||
}
|
||||
|
||||
static final class Op {
|
||||
int mCmd;
|
||||
Lifecycle.State mCurrentMaxState;
|
||||
int mEnterAnim;
|
||||
int mExitAnim;
|
||||
Fragment mFragment;
|
||||
Lifecycle.State mOldMaxState;
|
||||
int mPopEnterAnim;
|
||||
int mPopExitAnim;
|
||||
|
||||
Op() {
|
||||
}
|
||||
|
||||
Op(int i, Fragment fragment) {
|
||||
this.mCmd = i;
|
||||
this.mFragment = fragment;
|
||||
this.mOldMaxState = Lifecycle.State.RESUMED;
|
||||
this.mCurrentMaxState = Lifecycle.State.RESUMED;
|
||||
}
|
||||
|
||||
Op(int i, Fragment fragment, Lifecycle.State state) {
|
||||
this.mCmd = i;
|
||||
this.mFragment = fragment;
|
||||
this.mOldMaxState = fragment.mMaxState;
|
||||
this.mCurrentMaxState = state;
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction() {
|
||||
this.mOps = new ArrayList<>();
|
||||
this.mAllowAddToBackStack = true;
|
||||
this.mReorderingAllowed = false;
|
||||
this.mFragmentFactory = null;
|
||||
this.mClassLoader = null;
|
||||
}
|
||||
|
||||
FragmentTransaction(FragmentFactory fragmentFactory, ClassLoader classLoader) {
|
||||
this.mOps = new ArrayList<>();
|
||||
this.mAllowAddToBackStack = true;
|
||||
this.mReorderingAllowed = false;
|
||||
this.mFragmentFactory = fragmentFactory;
|
||||
this.mClassLoader = classLoader;
|
||||
}
|
||||
|
||||
void addOp(Op op) {
|
||||
this.mOps.add(op);
|
||||
op.mEnterAnim = this.mEnterAnim;
|
||||
op.mExitAnim = this.mExitAnim;
|
||||
op.mPopEnterAnim = this.mPopEnterAnim;
|
||||
op.mPopExitAnim = this.mPopExitAnim;
|
||||
}
|
||||
|
||||
private Fragment createFragment(Class<? extends Fragment> cls, Bundle bundle) {
|
||||
FragmentFactory fragmentFactory = this.mFragmentFactory;
|
||||
if (fragmentFactory == null) {
|
||||
throw new IllegalStateException("Creating a Fragment requires that this FragmentTransaction was built with FragmentManager.beginTransaction()");
|
||||
}
|
||||
ClassLoader classLoader = this.mClassLoader;
|
||||
if (classLoader == null) {
|
||||
throw new IllegalStateException("The FragmentManager must be attached to itshost to create a Fragment");
|
||||
}
|
||||
Fragment instantiate = fragmentFactory.instantiate(classLoader, cls.getName());
|
||||
if (bundle != null) {
|
||||
instantiate.setArguments(bundle);
|
||||
}
|
||||
return instantiate;
|
||||
}
|
||||
|
||||
public final FragmentTransaction add(Class<? extends Fragment> cls, Bundle bundle, String str) {
|
||||
return add(createFragment(cls, bundle), str);
|
||||
}
|
||||
|
||||
public FragmentTransaction add(Fragment fragment, String str) {
|
||||
doAddOp(0, fragment, str, 1);
|
||||
return this;
|
||||
}
|
||||
|
||||
public final FragmentTransaction add(int i, Class<? extends Fragment> cls, Bundle bundle) {
|
||||
return add(i, createFragment(cls, bundle));
|
||||
}
|
||||
|
||||
public FragmentTransaction add(int i, Fragment fragment) {
|
||||
doAddOp(i, fragment, null, 1);
|
||||
return this;
|
||||
}
|
||||
|
||||
public final FragmentTransaction add(int i, Class<? extends Fragment> cls, Bundle bundle, String str) {
|
||||
return add(i, createFragment(cls, bundle), str);
|
||||
}
|
||||
|
||||
public FragmentTransaction add(int i, Fragment fragment, String str) {
|
||||
doAddOp(i, fragment, str, 1);
|
||||
return this;
|
||||
}
|
||||
|
||||
FragmentTransaction add(ViewGroup viewGroup, Fragment fragment, String str) {
|
||||
fragment.mContainer = viewGroup;
|
||||
return add(viewGroup.getId(), fragment, str);
|
||||
}
|
||||
|
||||
void doAddOp(int i, Fragment fragment, String str, int i2) {
|
||||
Class<?> cls = fragment.getClass();
|
||||
int modifiers = cls.getModifiers();
|
||||
if (cls.isAnonymousClass() || !Modifier.isPublic(modifiers) || (cls.isMemberClass() && !Modifier.isStatic(modifiers))) {
|
||||
throw new IllegalStateException("Fragment " + cls.getCanonicalName() + " must be a public static class to be properly recreated from instance state.");
|
||||
}
|
||||
if (str != null) {
|
||||
if (fragment.mTag != null && !str.equals(fragment.mTag)) {
|
||||
throw new IllegalStateException("Can't change tag of fragment " + fragment + ": was " + fragment.mTag + " now " + str);
|
||||
}
|
||||
fragment.mTag = str;
|
||||
}
|
||||
if (i != 0) {
|
||||
if (i == -1) {
|
||||
throw new IllegalArgumentException("Can't add fragment " + fragment + " with tag " + str + " to container view with no id");
|
||||
}
|
||||
if (fragment.mFragmentId != 0 && fragment.mFragmentId != i) {
|
||||
throw new IllegalStateException("Can't change container ID of fragment " + fragment + ": was " + fragment.mFragmentId + " now " + i);
|
||||
}
|
||||
fragment.mFragmentId = i;
|
||||
fragment.mContainerId = i;
|
||||
}
|
||||
addOp(new Op(i2, fragment));
|
||||
}
|
||||
|
||||
public final FragmentTransaction replace(int i, Class<? extends Fragment> cls, Bundle bundle) {
|
||||
return replace(i, cls, bundle, null);
|
||||
}
|
||||
|
||||
public FragmentTransaction replace(int i, Fragment fragment) {
|
||||
return replace(i, fragment, (String) null);
|
||||
}
|
||||
|
||||
public final FragmentTransaction replace(int i, Class<? extends Fragment> cls, Bundle bundle, String str) {
|
||||
return replace(i, createFragment(cls, bundle), str);
|
||||
}
|
||||
|
||||
public FragmentTransaction replace(int i, Fragment fragment, String str) {
|
||||
if (i == 0) {
|
||||
throw new IllegalArgumentException("Must use non-zero containerViewId");
|
||||
}
|
||||
doAddOp(i, fragment, str, 2);
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction remove(Fragment fragment) {
|
||||
addOp(new Op(3, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction hide(Fragment fragment) {
|
||||
addOp(new Op(4, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction show(Fragment fragment) {
|
||||
addOp(new Op(5, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction detach(Fragment fragment) {
|
||||
addOp(new Op(6, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction attach(Fragment fragment) {
|
||||
addOp(new Op(7, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction setPrimaryNavigationFragment(Fragment fragment) {
|
||||
addOp(new Op(8, fragment));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction setMaxLifecycle(Fragment fragment, Lifecycle.State state) {
|
||||
addOp(new Op(10, fragment, state));
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return this.mOps.isEmpty();
|
||||
}
|
||||
|
||||
public FragmentTransaction setCustomAnimations(int i, int i2) {
|
||||
return setCustomAnimations(i, i2, 0, 0);
|
||||
}
|
||||
|
||||
public FragmentTransaction addSharedElement(View view, String str) {
|
||||
if (FragmentTransition.supportsTransition()) {
|
||||
String transitionName = ViewCompat.getTransitionName(view);
|
||||
if (transitionName == null) {
|
||||
throw new IllegalArgumentException("Unique transitionNames are required for all sharedElements");
|
||||
}
|
||||
if (this.mSharedElementSourceNames == null) {
|
||||
this.mSharedElementSourceNames = new ArrayList<>();
|
||||
this.mSharedElementTargetNames = new ArrayList<>();
|
||||
} else {
|
||||
if (this.mSharedElementTargetNames.contains(str)) {
|
||||
throw new IllegalArgumentException("A shared element with the target name '" + str + "' has already been added to the transaction.");
|
||||
}
|
||||
if (this.mSharedElementSourceNames.contains(transitionName)) {
|
||||
throw new IllegalArgumentException("A shared element with the source name '" + transitionName + "' has already been added to the transaction.");
|
||||
}
|
||||
}
|
||||
this.mSharedElementSourceNames.add(transitionName);
|
||||
this.mSharedElementTargetNames.add(str);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction addToBackStack(String str) {
|
||||
if (!this.mAllowAddToBackStack) {
|
||||
throw new IllegalStateException("This FragmentTransaction is not allowed to be added to the back stack.");
|
||||
}
|
||||
this.mAddToBackStack = true;
|
||||
this.mName = str;
|
||||
return this;
|
||||
}
|
||||
|
||||
public FragmentTransaction disallowAddToBackStack() {
|
||||
if (this.mAddToBackStack) {
|
||||
throw new IllegalStateException("This transaction is already being added to the back stack");
|
||||
}
|
||||
this.mAllowAddToBackStack = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public FragmentTransaction setAllowOptimization(boolean z) {
|
||||
return setReorderingAllowed(z);
|
||||
}
|
||||
|
||||
public FragmentTransaction runOnCommit(Runnable runnable) {
|
||||
disallowAddToBackStack();
|
||||
if (this.mCommitRunnables == null) {
|
||||
this.mCommitRunnables = new ArrayList<>();
|
||||
}
|
||||
this.mCommitRunnables.add(runnable);
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,736 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.SparseArray;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.collection.ArrayMap;
|
||||
import androidx.core.app.SharedElementCallback;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import androidx.core.view.OneShotPreDrawListener;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentTransition {
|
||||
private static final int[] INVERSE_OPS = {0, 3, 0, 1, 5, 4, 7, 6, 9, 8, 10};
|
||||
static final FragmentTransitionImpl PLATFORM_IMPL = new FragmentTransitionCompat21();
|
||||
static final FragmentTransitionImpl SUPPORT_IMPL = resolveSupportImpl();
|
||||
|
||||
interface Callback {
|
||||
void onComplete(Fragment fragment, CancellationSignal cancellationSignal);
|
||||
|
||||
void onStart(Fragment fragment, CancellationSignal cancellationSignal);
|
||||
}
|
||||
|
||||
static boolean supportsTransition() {
|
||||
return (PLATFORM_IMPL == null && SUPPORT_IMPL == null) ? false : true;
|
||||
}
|
||||
|
||||
private static FragmentTransitionImpl resolveSupportImpl() {
|
||||
try {
|
||||
return (FragmentTransitionImpl) Class.forName("androidx.transition.FragmentTransitionSupport").getDeclaredConstructor(new Class[0]).newInstance(new Object[0]);
|
||||
} catch (Exception unused) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static void startTransitions(Context context, FragmentContainer fragmentContainer, ArrayList<BackStackRecord> arrayList, ArrayList<Boolean> arrayList2, int i, int i2, boolean z, Callback callback) {
|
||||
ViewGroup viewGroup;
|
||||
SparseArray sparseArray = new SparseArray();
|
||||
for (int i3 = i; i3 < i2; i3++) {
|
||||
BackStackRecord backStackRecord = arrayList.get(i3);
|
||||
if (arrayList2.get(i3).booleanValue()) {
|
||||
calculatePopFragments(backStackRecord, sparseArray, z);
|
||||
} else {
|
||||
calculateFragments(backStackRecord, sparseArray, z);
|
||||
}
|
||||
}
|
||||
if (sparseArray.size() != 0) {
|
||||
View view = new View(context);
|
||||
int size = sparseArray.size();
|
||||
for (int i4 = 0; i4 < size; i4++) {
|
||||
int keyAt = sparseArray.keyAt(i4);
|
||||
ArrayMap<String, String> calculateNameOverrides = calculateNameOverrides(keyAt, arrayList, arrayList2, i, i2);
|
||||
FragmentContainerTransition fragmentContainerTransition = (FragmentContainerTransition) sparseArray.valueAt(i4);
|
||||
if (fragmentContainer.onHasView() && (viewGroup = (ViewGroup) fragmentContainer.onFindViewById(keyAt)) != null) {
|
||||
if (z) {
|
||||
configureTransitionsReordered(viewGroup, fragmentContainerTransition, view, calculateNameOverrides, callback);
|
||||
} else {
|
||||
configureTransitionsOrdered(viewGroup, fragmentContainerTransition, view, calculateNameOverrides, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ArrayMap<String, String> calculateNameOverrides(int i, ArrayList<BackStackRecord> arrayList, ArrayList<Boolean> arrayList2, int i2, int i3) {
|
||||
ArrayList<String> arrayList3;
|
||||
ArrayList<String> arrayList4;
|
||||
ArrayMap<String, String> arrayMap = new ArrayMap<>();
|
||||
for (int i4 = i3 - 1; i4 >= i2; i4--) {
|
||||
BackStackRecord backStackRecord = arrayList.get(i4);
|
||||
if (backStackRecord.interactsWith(i)) {
|
||||
boolean booleanValue = arrayList2.get(i4).booleanValue();
|
||||
if (backStackRecord.mSharedElementSourceNames != null) {
|
||||
int size = backStackRecord.mSharedElementSourceNames.size();
|
||||
if (booleanValue) {
|
||||
arrayList3 = backStackRecord.mSharedElementSourceNames;
|
||||
arrayList4 = backStackRecord.mSharedElementTargetNames;
|
||||
} else {
|
||||
ArrayList<String> arrayList5 = backStackRecord.mSharedElementSourceNames;
|
||||
arrayList3 = backStackRecord.mSharedElementTargetNames;
|
||||
arrayList4 = arrayList5;
|
||||
}
|
||||
for (int i5 = 0; i5 < size; i5++) {
|
||||
String str = arrayList4.get(i5);
|
||||
String str2 = arrayList3.get(i5);
|
||||
String remove = arrayMap.remove(str2);
|
||||
if (remove != null) {
|
||||
arrayMap.put(str, remove);
|
||||
} else {
|
||||
arrayMap.put(str, str2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return arrayMap;
|
||||
}
|
||||
|
||||
private static void configureTransitionsReordered(ViewGroup viewGroup, FragmentContainerTransition fragmentContainerTransition, View view, ArrayMap<String, String> arrayMap, final Callback callback) {
|
||||
Object obj;
|
||||
Fragment fragment = fragmentContainerTransition.lastIn;
|
||||
final Fragment fragment2 = fragmentContainerTransition.firstOut;
|
||||
FragmentTransitionImpl chooseImpl = chooseImpl(fragment2, fragment);
|
||||
if (chooseImpl == null) {
|
||||
return;
|
||||
}
|
||||
boolean z = fragmentContainerTransition.lastInIsPop;
|
||||
boolean z2 = fragmentContainerTransition.firstOutIsPop;
|
||||
ArrayList<View> arrayList = new ArrayList<>();
|
||||
ArrayList<View> arrayList2 = new ArrayList<>();
|
||||
Object enterTransition = getEnterTransition(chooseImpl, fragment, z);
|
||||
Object exitTransition = getExitTransition(chooseImpl, fragment2, z2);
|
||||
Object configureSharedElementsReordered = configureSharedElementsReordered(chooseImpl, viewGroup, view, arrayMap, fragmentContainerTransition, arrayList2, arrayList, enterTransition, exitTransition);
|
||||
if (enterTransition == null && configureSharedElementsReordered == null) {
|
||||
obj = exitTransition;
|
||||
if (obj == null) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
obj = exitTransition;
|
||||
}
|
||||
ArrayList<View> configureEnteringExitingViews = configureEnteringExitingViews(chooseImpl, obj, fragment2, arrayList2, view);
|
||||
ArrayList<View> configureEnteringExitingViews2 = configureEnteringExitingViews(chooseImpl, enterTransition, fragment, arrayList, view);
|
||||
setViewVisibility(configureEnteringExitingViews2, 4);
|
||||
Object mergeTransitions = mergeTransitions(chooseImpl, enterTransition, obj, configureSharedElementsReordered, fragment, z);
|
||||
if (fragment2 != null && configureEnteringExitingViews != null && (configureEnteringExitingViews.size() > 0 || arrayList2.size() > 0)) {
|
||||
final CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
callback.onStart(fragment2, cancellationSignal);
|
||||
chooseImpl.setListenerForTransitionEnd(fragment2, mergeTransitions, cancellationSignal, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
Callback.this.onComplete(fragment2, cancellationSignal);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (mergeTransitions != null) {
|
||||
replaceHide(chooseImpl, obj, fragment2, configureEnteringExitingViews);
|
||||
ArrayList<String> prepareSetNameOverridesReordered = chooseImpl.prepareSetNameOverridesReordered(arrayList);
|
||||
chooseImpl.scheduleRemoveTargets(mergeTransitions, enterTransition, configureEnteringExitingViews2, obj, configureEnteringExitingViews, configureSharedElementsReordered, arrayList);
|
||||
chooseImpl.beginDelayedTransition(viewGroup, mergeTransitions);
|
||||
chooseImpl.setNameOverridesReordered(viewGroup, arrayList2, arrayList, prepareSetNameOverridesReordered, arrayMap);
|
||||
setViewVisibility(configureEnteringExitingViews2, 0);
|
||||
chooseImpl.swapSharedElementTargets(configureSharedElementsReordered, arrayList2, arrayList);
|
||||
}
|
||||
}
|
||||
|
||||
private static void replaceHide(FragmentTransitionImpl fragmentTransitionImpl, Object obj, Fragment fragment, final ArrayList<View> arrayList) {
|
||||
if (fragment != null && obj != null && fragment.mAdded && fragment.mHidden && fragment.mHiddenChanged) {
|
||||
fragment.setHideReplaced(true);
|
||||
fragmentTransitionImpl.scheduleHideFragmentView(obj, fragment.getView(), arrayList);
|
||||
OneShotPreDrawListener.add(fragment.mContainer, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.2
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
FragmentTransition.setViewVisibility(arrayList, 4);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private static void configureTransitionsOrdered(ViewGroup viewGroup, FragmentContainerTransition fragmentContainerTransition, View view, ArrayMap<String, String> arrayMap, final Callback callback) {
|
||||
Object obj;
|
||||
Fragment fragment = fragmentContainerTransition.lastIn;
|
||||
final Fragment fragment2 = fragmentContainerTransition.firstOut;
|
||||
FragmentTransitionImpl chooseImpl = chooseImpl(fragment2, fragment);
|
||||
if (chooseImpl == null) {
|
||||
return;
|
||||
}
|
||||
boolean z = fragmentContainerTransition.lastInIsPop;
|
||||
boolean z2 = fragmentContainerTransition.firstOutIsPop;
|
||||
Object enterTransition = getEnterTransition(chooseImpl, fragment, z);
|
||||
Object exitTransition = getExitTransition(chooseImpl, fragment2, z2);
|
||||
ArrayList arrayList = new ArrayList();
|
||||
ArrayList<View> arrayList2 = new ArrayList<>();
|
||||
Object configureSharedElementsOrdered = configureSharedElementsOrdered(chooseImpl, viewGroup, view, arrayMap, fragmentContainerTransition, arrayList, arrayList2, enterTransition, exitTransition);
|
||||
if (enterTransition == null && configureSharedElementsOrdered == null) {
|
||||
obj = exitTransition;
|
||||
if (obj == null) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
obj = exitTransition;
|
||||
}
|
||||
ArrayList<View> configureEnteringExitingViews = configureEnteringExitingViews(chooseImpl, obj, fragment2, arrayList, view);
|
||||
if (configureEnteringExitingViews == null || configureEnteringExitingViews.isEmpty()) {
|
||||
obj = null;
|
||||
}
|
||||
Object obj2 = obj;
|
||||
chooseImpl.addTarget(enterTransition, view);
|
||||
Object mergeTransitions = mergeTransitions(chooseImpl, enterTransition, obj2, configureSharedElementsOrdered, fragment, fragmentContainerTransition.lastInIsPop);
|
||||
if (fragment2 != null && configureEnteringExitingViews != null && (configureEnteringExitingViews.size() > 0 || arrayList.size() > 0)) {
|
||||
final CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
callback.onStart(fragment2, cancellationSignal);
|
||||
chooseImpl.setListenerForTransitionEnd(fragment2, mergeTransitions, cancellationSignal, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.3
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
Callback.this.onComplete(fragment2, cancellationSignal);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (mergeTransitions != null) {
|
||||
ArrayList<View> arrayList3 = new ArrayList<>();
|
||||
chooseImpl.scheduleRemoveTargets(mergeTransitions, enterTransition, arrayList3, obj2, configureEnteringExitingViews, configureSharedElementsOrdered, arrayList2);
|
||||
scheduleTargetChange(chooseImpl, viewGroup, fragment, view, arrayList2, enterTransition, arrayList3, obj2, configureEnteringExitingViews);
|
||||
chooseImpl.setNameOverridesOrdered(viewGroup, arrayList2, arrayMap);
|
||||
chooseImpl.beginDelayedTransition(viewGroup, mergeTransitions);
|
||||
chooseImpl.scheduleNameReset(viewGroup, arrayList2, arrayMap);
|
||||
}
|
||||
}
|
||||
|
||||
private static void scheduleTargetChange(final FragmentTransitionImpl fragmentTransitionImpl, ViewGroup viewGroup, final Fragment fragment, final View view, final ArrayList<View> arrayList, final Object obj, final ArrayList<View> arrayList2, final Object obj2, final ArrayList<View> arrayList3) {
|
||||
OneShotPreDrawListener.add(viewGroup, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.4
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
Object obj3 = obj;
|
||||
if (obj3 != null) {
|
||||
fragmentTransitionImpl.removeTarget(obj3, view);
|
||||
arrayList2.addAll(FragmentTransition.configureEnteringExitingViews(fragmentTransitionImpl, obj, fragment, arrayList, view));
|
||||
}
|
||||
if (arrayList3 != null) {
|
||||
if (obj2 != null) {
|
||||
ArrayList<View> arrayList4 = new ArrayList<>();
|
||||
arrayList4.add(view);
|
||||
fragmentTransitionImpl.replaceTargets(obj2, arrayList3, arrayList4);
|
||||
}
|
||||
arrayList3.clear();
|
||||
arrayList3.add(view);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static FragmentTransitionImpl chooseImpl(Fragment fragment, Fragment fragment2) {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
if (fragment != null) {
|
||||
Object exitTransition = fragment.getExitTransition();
|
||||
if (exitTransition != null) {
|
||||
arrayList.add(exitTransition);
|
||||
}
|
||||
Object returnTransition = fragment.getReturnTransition();
|
||||
if (returnTransition != null) {
|
||||
arrayList.add(returnTransition);
|
||||
}
|
||||
Object sharedElementReturnTransition = fragment.getSharedElementReturnTransition();
|
||||
if (sharedElementReturnTransition != null) {
|
||||
arrayList.add(sharedElementReturnTransition);
|
||||
}
|
||||
}
|
||||
if (fragment2 != null) {
|
||||
Object enterTransition = fragment2.getEnterTransition();
|
||||
if (enterTransition != null) {
|
||||
arrayList.add(enterTransition);
|
||||
}
|
||||
Object reenterTransition = fragment2.getReenterTransition();
|
||||
if (reenterTransition != null) {
|
||||
arrayList.add(reenterTransition);
|
||||
}
|
||||
Object sharedElementEnterTransition = fragment2.getSharedElementEnterTransition();
|
||||
if (sharedElementEnterTransition != null) {
|
||||
arrayList.add(sharedElementEnterTransition);
|
||||
}
|
||||
}
|
||||
if (arrayList.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
FragmentTransitionImpl fragmentTransitionImpl = PLATFORM_IMPL;
|
||||
if (fragmentTransitionImpl != null && canHandleAll(fragmentTransitionImpl, arrayList)) {
|
||||
return fragmentTransitionImpl;
|
||||
}
|
||||
FragmentTransitionImpl fragmentTransitionImpl2 = SUPPORT_IMPL;
|
||||
if (fragmentTransitionImpl2 != null && canHandleAll(fragmentTransitionImpl2, arrayList)) {
|
||||
return fragmentTransitionImpl2;
|
||||
}
|
||||
if (fragmentTransitionImpl == null && fragmentTransitionImpl2 == null) {
|
||||
return null;
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid Transition types");
|
||||
}
|
||||
|
||||
private static boolean canHandleAll(FragmentTransitionImpl fragmentTransitionImpl, List<Object> list) {
|
||||
int size = list.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (!fragmentTransitionImpl.canHandle(list.get(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Object getSharedElementTransition(FragmentTransitionImpl fragmentTransitionImpl, Fragment fragment, Fragment fragment2, boolean z) {
|
||||
Object sharedElementEnterTransition;
|
||||
if (fragment == null || fragment2 == null) {
|
||||
return null;
|
||||
}
|
||||
if (z) {
|
||||
sharedElementEnterTransition = fragment2.getSharedElementReturnTransition();
|
||||
} else {
|
||||
sharedElementEnterTransition = fragment.getSharedElementEnterTransition();
|
||||
}
|
||||
return fragmentTransitionImpl.wrapTransitionInSet(fragmentTransitionImpl.cloneTransition(sharedElementEnterTransition));
|
||||
}
|
||||
|
||||
private static Object getEnterTransition(FragmentTransitionImpl fragmentTransitionImpl, Fragment fragment, boolean z) {
|
||||
Object enterTransition;
|
||||
if (fragment == null) {
|
||||
return null;
|
||||
}
|
||||
if (z) {
|
||||
enterTransition = fragment.getReenterTransition();
|
||||
} else {
|
||||
enterTransition = fragment.getEnterTransition();
|
||||
}
|
||||
return fragmentTransitionImpl.cloneTransition(enterTransition);
|
||||
}
|
||||
|
||||
private static Object getExitTransition(FragmentTransitionImpl fragmentTransitionImpl, Fragment fragment, boolean z) {
|
||||
Object exitTransition;
|
||||
if (fragment == null) {
|
||||
return null;
|
||||
}
|
||||
if (z) {
|
||||
exitTransition = fragment.getReturnTransition();
|
||||
} else {
|
||||
exitTransition = fragment.getExitTransition();
|
||||
}
|
||||
return fragmentTransitionImpl.cloneTransition(exitTransition);
|
||||
}
|
||||
|
||||
private static Object configureSharedElementsReordered(final FragmentTransitionImpl fragmentTransitionImpl, ViewGroup viewGroup, View view, ArrayMap<String, String> arrayMap, FragmentContainerTransition fragmentContainerTransition, ArrayList<View> arrayList, ArrayList<View> arrayList2, Object obj, Object obj2) {
|
||||
Object obj3;
|
||||
final View view2;
|
||||
final Rect rect;
|
||||
final Fragment fragment = fragmentContainerTransition.lastIn;
|
||||
final Fragment fragment2 = fragmentContainerTransition.firstOut;
|
||||
if (fragment != null) {
|
||||
fragment.requireView().setVisibility(0);
|
||||
}
|
||||
if (fragment == null || fragment2 == null) {
|
||||
return null;
|
||||
}
|
||||
final boolean z = fragmentContainerTransition.lastInIsPop;
|
||||
Object sharedElementTransition = arrayMap.isEmpty() ? null : getSharedElementTransition(fragmentTransitionImpl, fragment, fragment2, z);
|
||||
ArrayMap<String, View> captureOutSharedElements = captureOutSharedElements(fragmentTransitionImpl, arrayMap, sharedElementTransition, fragmentContainerTransition);
|
||||
final ArrayMap<String, View> captureInSharedElements = captureInSharedElements(fragmentTransitionImpl, arrayMap, sharedElementTransition, fragmentContainerTransition);
|
||||
if (arrayMap.isEmpty()) {
|
||||
if (captureOutSharedElements != null) {
|
||||
captureOutSharedElements.clear();
|
||||
}
|
||||
if (captureInSharedElements != null) {
|
||||
captureInSharedElements.clear();
|
||||
}
|
||||
obj3 = null;
|
||||
} else {
|
||||
addSharedElementsWithMatchingNames(arrayList, captureOutSharedElements, arrayMap.keySet());
|
||||
addSharedElementsWithMatchingNames(arrayList2, captureInSharedElements, arrayMap.values());
|
||||
obj3 = sharedElementTransition;
|
||||
}
|
||||
if (obj == null && obj2 == null && obj3 == null) {
|
||||
return null;
|
||||
}
|
||||
callSharedElementStartEnd(fragment, fragment2, z, captureOutSharedElements, true);
|
||||
if (obj3 != null) {
|
||||
arrayList2.add(view);
|
||||
fragmentTransitionImpl.setSharedElementTargets(obj3, view, arrayList);
|
||||
setOutEpicenter(fragmentTransitionImpl, obj3, obj2, captureOutSharedElements, fragmentContainerTransition.firstOutIsPop, fragmentContainerTransition.firstOutTransaction);
|
||||
Rect rect2 = new Rect();
|
||||
View inEpicenterView = getInEpicenterView(captureInSharedElements, fragmentContainerTransition, obj, z);
|
||||
if (inEpicenterView != null) {
|
||||
fragmentTransitionImpl.setEpicenter(obj, rect2);
|
||||
}
|
||||
rect = rect2;
|
||||
view2 = inEpicenterView;
|
||||
} else {
|
||||
view2 = null;
|
||||
rect = null;
|
||||
}
|
||||
OneShotPreDrawListener.add(viewGroup, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.5
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
FragmentTransition.callSharedElementStartEnd(Fragment.this, fragment2, z, captureInSharedElements, false);
|
||||
View view3 = view2;
|
||||
if (view3 != null) {
|
||||
fragmentTransitionImpl.getBoundsOnScreen(view3, rect);
|
||||
}
|
||||
}
|
||||
});
|
||||
return obj3;
|
||||
}
|
||||
|
||||
private static void addSharedElementsWithMatchingNames(ArrayList<View> arrayList, ArrayMap<String, View> arrayMap, Collection<String> collection) {
|
||||
for (int size = arrayMap.size() - 1; size >= 0; size--) {
|
||||
View valueAt = arrayMap.valueAt(size);
|
||||
if (collection.contains(ViewCompat.getTransitionName(valueAt))) {
|
||||
arrayList.add(valueAt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Object configureSharedElementsOrdered(final FragmentTransitionImpl fragmentTransitionImpl, ViewGroup viewGroup, final View view, final ArrayMap<String, String> arrayMap, final FragmentContainerTransition fragmentContainerTransition, final ArrayList<View> arrayList, final ArrayList<View> arrayList2, final Object obj, Object obj2) {
|
||||
Object sharedElementTransition;
|
||||
ArrayMap<String, String> arrayMap2;
|
||||
Object obj3;
|
||||
Rect rect;
|
||||
final Fragment fragment = fragmentContainerTransition.lastIn;
|
||||
final Fragment fragment2 = fragmentContainerTransition.firstOut;
|
||||
if (fragment == null || fragment2 == null) {
|
||||
return null;
|
||||
}
|
||||
final boolean z = fragmentContainerTransition.lastInIsPop;
|
||||
if (arrayMap.isEmpty()) {
|
||||
arrayMap2 = arrayMap;
|
||||
sharedElementTransition = null;
|
||||
} else {
|
||||
sharedElementTransition = getSharedElementTransition(fragmentTransitionImpl, fragment, fragment2, z);
|
||||
arrayMap2 = arrayMap;
|
||||
}
|
||||
ArrayMap<String, View> captureOutSharedElements = captureOutSharedElements(fragmentTransitionImpl, arrayMap2, sharedElementTransition, fragmentContainerTransition);
|
||||
if (arrayMap.isEmpty()) {
|
||||
obj3 = null;
|
||||
} else {
|
||||
arrayList.addAll(captureOutSharedElements.values());
|
||||
obj3 = sharedElementTransition;
|
||||
}
|
||||
if (obj == null && obj2 == null && obj3 == null) {
|
||||
return null;
|
||||
}
|
||||
callSharedElementStartEnd(fragment, fragment2, z, captureOutSharedElements, true);
|
||||
if (obj3 != null) {
|
||||
rect = new Rect();
|
||||
fragmentTransitionImpl.setSharedElementTargets(obj3, view, arrayList);
|
||||
setOutEpicenter(fragmentTransitionImpl, obj3, obj2, captureOutSharedElements, fragmentContainerTransition.firstOutIsPop, fragmentContainerTransition.firstOutTransaction);
|
||||
if (obj != null) {
|
||||
fragmentTransitionImpl.setEpicenter(obj, rect);
|
||||
}
|
||||
} else {
|
||||
rect = null;
|
||||
}
|
||||
final Object obj4 = obj3;
|
||||
final Rect rect2 = rect;
|
||||
OneShotPreDrawListener.add(viewGroup, new Runnable() { // from class: androidx.fragment.app.FragmentTransition.6
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
ArrayMap<String, View> captureInSharedElements = FragmentTransition.captureInSharedElements(FragmentTransitionImpl.this, arrayMap, obj4, fragmentContainerTransition);
|
||||
if (captureInSharedElements != null) {
|
||||
arrayList2.addAll(captureInSharedElements.values());
|
||||
arrayList2.add(view);
|
||||
}
|
||||
FragmentTransition.callSharedElementStartEnd(fragment, fragment2, z, captureInSharedElements, false);
|
||||
Object obj5 = obj4;
|
||||
if (obj5 != null) {
|
||||
FragmentTransitionImpl.this.swapSharedElementTargets(obj5, arrayList, arrayList2);
|
||||
View inEpicenterView = FragmentTransition.getInEpicenterView(captureInSharedElements, fragmentContainerTransition, obj, z);
|
||||
if (inEpicenterView != null) {
|
||||
FragmentTransitionImpl.this.getBoundsOnScreen(inEpicenterView, rect2);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return obj3;
|
||||
}
|
||||
|
||||
private static ArrayMap<String, View> captureOutSharedElements(FragmentTransitionImpl fragmentTransitionImpl, ArrayMap<String, String> arrayMap, Object obj, FragmentContainerTransition fragmentContainerTransition) {
|
||||
SharedElementCallback exitTransitionCallback;
|
||||
ArrayList<String> arrayList;
|
||||
if (arrayMap.isEmpty() || obj == null) {
|
||||
arrayMap.clear();
|
||||
return null;
|
||||
}
|
||||
Fragment fragment = fragmentContainerTransition.firstOut;
|
||||
ArrayMap<String, View> arrayMap2 = new ArrayMap<>();
|
||||
fragmentTransitionImpl.findNamedViews(arrayMap2, fragment.requireView());
|
||||
BackStackRecord backStackRecord = fragmentContainerTransition.firstOutTransaction;
|
||||
if (fragmentContainerTransition.firstOutIsPop) {
|
||||
exitTransitionCallback = fragment.getEnterTransitionCallback();
|
||||
arrayList = backStackRecord.mSharedElementTargetNames;
|
||||
} else {
|
||||
exitTransitionCallback = fragment.getExitTransitionCallback();
|
||||
arrayList = backStackRecord.mSharedElementSourceNames;
|
||||
}
|
||||
if (arrayList != null) {
|
||||
arrayMap2.retainAll(arrayList);
|
||||
}
|
||||
if (exitTransitionCallback != null) {
|
||||
exitTransitionCallback.onMapSharedElements(arrayList, arrayMap2);
|
||||
for (int size = arrayList.size() - 1; size >= 0; size--) {
|
||||
String str = arrayList.get(size);
|
||||
View view = arrayMap2.get(str);
|
||||
if (view == null) {
|
||||
arrayMap.remove(str);
|
||||
} else if (!str.equals(ViewCompat.getTransitionName(view))) {
|
||||
arrayMap.put(ViewCompat.getTransitionName(view), arrayMap.remove(str));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
arrayMap.retainAll(arrayMap2.keySet());
|
||||
}
|
||||
return arrayMap2;
|
||||
}
|
||||
|
||||
static ArrayMap<String, View> captureInSharedElements(FragmentTransitionImpl fragmentTransitionImpl, ArrayMap<String, String> arrayMap, Object obj, FragmentContainerTransition fragmentContainerTransition) {
|
||||
SharedElementCallback enterTransitionCallback;
|
||||
ArrayList<String> arrayList;
|
||||
String findKeyForValue;
|
||||
Fragment fragment = fragmentContainerTransition.lastIn;
|
||||
View view = fragment.getView();
|
||||
if (arrayMap.isEmpty() || obj == null || view == null) {
|
||||
arrayMap.clear();
|
||||
return null;
|
||||
}
|
||||
ArrayMap<String, View> arrayMap2 = new ArrayMap<>();
|
||||
fragmentTransitionImpl.findNamedViews(arrayMap2, view);
|
||||
BackStackRecord backStackRecord = fragmentContainerTransition.lastInTransaction;
|
||||
if (fragmentContainerTransition.lastInIsPop) {
|
||||
enterTransitionCallback = fragment.getExitTransitionCallback();
|
||||
arrayList = backStackRecord.mSharedElementSourceNames;
|
||||
} else {
|
||||
enterTransitionCallback = fragment.getEnterTransitionCallback();
|
||||
arrayList = backStackRecord.mSharedElementTargetNames;
|
||||
}
|
||||
if (arrayList != null) {
|
||||
arrayMap2.retainAll(arrayList);
|
||||
arrayMap2.retainAll(arrayMap.values());
|
||||
}
|
||||
if (enterTransitionCallback != null) {
|
||||
enterTransitionCallback.onMapSharedElements(arrayList, arrayMap2);
|
||||
for (int size = arrayList.size() - 1; size >= 0; size--) {
|
||||
String str = arrayList.get(size);
|
||||
View view2 = arrayMap2.get(str);
|
||||
if (view2 == null) {
|
||||
String findKeyForValue2 = findKeyForValue(arrayMap, str);
|
||||
if (findKeyForValue2 != null) {
|
||||
arrayMap.remove(findKeyForValue2);
|
||||
}
|
||||
} else if (!str.equals(ViewCompat.getTransitionName(view2)) && (findKeyForValue = findKeyForValue(arrayMap, str)) != null) {
|
||||
arrayMap.put(findKeyForValue, ViewCompat.getTransitionName(view2));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
retainValues(arrayMap, arrayMap2);
|
||||
}
|
||||
return arrayMap2;
|
||||
}
|
||||
|
||||
static String findKeyForValue(ArrayMap<String, String> arrayMap, String str) {
|
||||
int size = arrayMap.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (str.equals(arrayMap.valueAt(i))) {
|
||||
return arrayMap.keyAt(i);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static View getInEpicenterView(ArrayMap<String, View> arrayMap, FragmentContainerTransition fragmentContainerTransition, Object obj, boolean z) {
|
||||
String str;
|
||||
BackStackRecord backStackRecord = fragmentContainerTransition.lastInTransaction;
|
||||
if (obj == null || arrayMap == null || backStackRecord.mSharedElementSourceNames == null || backStackRecord.mSharedElementSourceNames.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (z) {
|
||||
str = backStackRecord.mSharedElementSourceNames.get(0);
|
||||
} else {
|
||||
str = backStackRecord.mSharedElementTargetNames.get(0);
|
||||
}
|
||||
return arrayMap.get(str);
|
||||
}
|
||||
|
||||
private static void setOutEpicenter(FragmentTransitionImpl fragmentTransitionImpl, Object obj, Object obj2, ArrayMap<String, View> arrayMap, boolean z, BackStackRecord backStackRecord) {
|
||||
String str;
|
||||
if (backStackRecord.mSharedElementSourceNames == null || backStackRecord.mSharedElementSourceNames.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (z) {
|
||||
str = backStackRecord.mSharedElementTargetNames.get(0);
|
||||
} else {
|
||||
str = backStackRecord.mSharedElementSourceNames.get(0);
|
||||
}
|
||||
View view = arrayMap.get(str);
|
||||
fragmentTransitionImpl.setEpicenter(obj, view);
|
||||
if (obj2 != null) {
|
||||
fragmentTransitionImpl.setEpicenter(obj2, view);
|
||||
}
|
||||
}
|
||||
|
||||
static void retainValues(ArrayMap<String, String> arrayMap, ArrayMap<String, View> arrayMap2) {
|
||||
for (int size = arrayMap.size() - 1; size >= 0; size--) {
|
||||
if (!arrayMap2.containsKey(arrayMap.valueAt(size))) {
|
||||
arrayMap.removeAt(size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void callSharedElementStartEnd(Fragment fragment, Fragment fragment2, boolean z, ArrayMap<String, View> arrayMap, boolean z2) {
|
||||
SharedElementCallback enterTransitionCallback;
|
||||
if (z) {
|
||||
enterTransitionCallback = fragment2.getEnterTransitionCallback();
|
||||
} else {
|
||||
enterTransitionCallback = fragment.getEnterTransitionCallback();
|
||||
}
|
||||
if (enterTransitionCallback != null) {
|
||||
ArrayList arrayList = new ArrayList();
|
||||
ArrayList arrayList2 = new ArrayList();
|
||||
int size = arrayMap == null ? 0 : arrayMap.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
arrayList2.add(arrayMap.keyAt(i));
|
||||
arrayList.add(arrayMap.valueAt(i));
|
||||
}
|
||||
if (z2) {
|
||||
enterTransitionCallback.onSharedElementStart(arrayList2, arrayList, null);
|
||||
} else {
|
||||
enterTransitionCallback.onSharedElementEnd(arrayList2, arrayList, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static ArrayList<View> configureEnteringExitingViews(FragmentTransitionImpl fragmentTransitionImpl, Object obj, Fragment fragment, ArrayList<View> arrayList, View view) {
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
ArrayList<View> arrayList2 = new ArrayList<>();
|
||||
View view2 = fragment.getView();
|
||||
if (view2 != null) {
|
||||
fragmentTransitionImpl.captureTransitioningViews(arrayList2, view2);
|
||||
}
|
||||
if (arrayList != null) {
|
||||
arrayList2.removeAll(arrayList);
|
||||
}
|
||||
if (arrayList2.isEmpty()) {
|
||||
return arrayList2;
|
||||
}
|
||||
arrayList2.add(view);
|
||||
fragmentTransitionImpl.addTargets(obj, arrayList2);
|
||||
return arrayList2;
|
||||
}
|
||||
|
||||
static void setViewVisibility(ArrayList<View> arrayList, int i) {
|
||||
if (arrayList == null) {
|
||||
return;
|
||||
}
|
||||
for (int size = arrayList.size() - 1; size >= 0; size--) {
|
||||
arrayList.get(size).setVisibility(i);
|
||||
}
|
||||
}
|
||||
|
||||
private static Object mergeTransitions(FragmentTransitionImpl fragmentTransitionImpl, Object obj, Object obj2, Object obj3, Fragment fragment, boolean z) {
|
||||
boolean allowEnterTransitionOverlap;
|
||||
if (obj != null && obj2 != null && fragment != null) {
|
||||
if (z) {
|
||||
allowEnterTransitionOverlap = fragment.getAllowReturnTransitionOverlap();
|
||||
} else {
|
||||
allowEnterTransitionOverlap = fragment.getAllowEnterTransitionOverlap();
|
||||
}
|
||||
if (!allowEnterTransitionOverlap) {
|
||||
return fragmentTransitionImpl.mergeTransitionsInSequence(obj2, obj, obj3);
|
||||
}
|
||||
}
|
||||
return fragmentTransitionImpl.mergeTransitionsTogether(obj2, obj, obj3);
|
||||
}
|
||||
|
||||
public static void calculateFragments(BackStackRecord backStackRecord, SparseArray<FragmentContainerTransition> sparseArray, boolean z) {
|
||||
int size = backStackRecord.mOps.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
addToFirstInLastOut(backStackRecord, backStackRecord.mOps.get(i), sparseArray, false, z);
|
||||
}
|
||||
}
|
||||
|
||||
public static void calculatePopFragments(BackStackRecord backStackRecord, SparseArray<FragmentContainerTransition> sparseArray, boolean z) {
|
||||
if (backStackRecord.mManager.getContainer().onHasView()) {
|
||||
for (int size = backStackRecord.mOps.size() - 1; size >= 0; size--) {
|
||||
addToFirstInLastOut(backStackRecord, backStackRecord.mOps.get(size), sparseArray, true, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* JADX WARN: Code restructure failed: missing block: B:59:0x0039, code lost:
|
||||
|
||||
if (r0.mAdded != false) goto L70;
|
||||
*/
|
||||
/* JADX WARN: Code restructure failed: missing block: B:60:0x008e, code lost:
|
||||
|
||||
r9 = true;
|
||||
*/
|
||||
/* JADX WARN: Code restructure failed: missing block: B:71:0x0070, code lost:
|
||||
|
||||
r9 = true;
|
||||
*/
|
||||
/* JADX WARN: Code restructure failed: missing block: B:96:0x008c, code lost:
|
||||
|
||||
if (r0.mHidden == false) goto L70;
|
||||
*/
|
||||
/* JADX WARN: Removed duplicated region for block: B:26:0x009c */
|
||||
/* JADX WARN: Removed duplicated region for block: B:29:0x00a9 A[ADDED_TO_REGION] */
|
||||
/* JADX WARN: Removed duplicated region for block: B:36:0x00b7 */
|
||||
/* JADX WARN: Removed duplicated region for block: B:38:0x00c9 A[ADDED_TO_REGION] */
|
||||
/* JADX WARN: Removed duplicated region for block: B:43:0x00db A[ADDED_TO_REGION] */
|
||||
/* JADX WARN: Removed duplicated region for block: B:52:? A[ADDED_TO_REGION, RETURN, SYNTHETIC] */
|
||||
/*
|
||||
Code decompiled incorrectly, please refer to instructions dump.
|
||||
To view partially-correct add '--show-bad-code' argument
|
||||
*/
|
||||
private static void addToFirstInLastOut(androidx.fragment.app.BackStackRecord r8, androidx.fragment.app.FragmentTransaction.Op r9, android.util.SparseArray<androidx.fragment.app.FragmentTransition.FragmentContainerTransition> r10, boolean r11, boolean r12) {
|
||||
/*
|
||||
Method dump skipped, instructions count: 230
|
||||
To view this dump add '--comments-level debug' option
|
||||
*/
|
||||
throw new UnsupportedOperationException("Method not decompiled: androidx.fragment.app.FragmentTransition.addToFirstInLastOut(androidx.fragment.app.BackStackRecord, androidx.fragment.app.FragmentTransaction$Op, android.util.SparseArray, boolean, boolean):void");
|
||||
}
|
||||
|
||||
private static FragmentContainerTransition ensureContainer(FragmentContainerTransition fragmentContainerTransition, SparseArray<FragmentContainerTransition> sparseArray, int i) {
|
||||
if (fragmentContainerTransition != null) {
|
||||
return fragmentContainerTransition;
|
||||
}
|
||||
FragmentContainerTransition fragmentContainerTransition2 = new FragmentContainerTransition();
|
||||
sparseArray.put(i, fragmentContainerTransition2);
|
||||
return fragmentContainerTransition2;
|
||||
}
|
||||
|
||||
static class FragmentContainerTransition {
|
||||
public Fragment firstOut;
|
||||
public boolean firstOutIsPop;
|
||||
public BackStackRecord firstOutTransaction;
|
||||
public Fragment lastIn;
|
||||
public boolean lastInIsPop;
|
||||
public BackStackRecord lastInTransaction;
|
||||
|
||||
FragmentContainerTransition() {
|
||||
}
|
||||
}
|
||||
|
||||
private FragmentTransition() {
|
||||
}
|
||||
}
|
@ -0,0 +1,303 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.transition.Transition;
|
||||
import android.transition.TransitionManager;
|
||||
import android.transition.TransitionSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentTransitionCompat21 extends FragmentTransitionImpl {
|
||||
FragmentTransitionCompat21() {
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public boolean canHandle(Object obj) {
|
||||
return obj instanceof Transition;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public Object cloneTransition(Object obj) {
|
||||
if (obj != null) {
|
||||
return ((Transition) obj).clone();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public Object wrapTransitionInSet(Object obj) {
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
TransitionSet transitionSet = new TransitionSet();
|
||||
transitionSet.addTransition((Transition) obj);
|
||||
return transitionSet;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void setSharedElementTargets(Object obj, View view, ArrayList<View> arrayList) {
|
||||
TransitionSet transitionSet = (TransitionSet) obj;
|
||||
List<View> targets = transitionSet.getTargets();
|
||||
targets.clear();
|
||||
int size = arrayList.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
bfsAddViewChildren(targets, arrayList.get(i));
|
||||
}
|
||||
targets.add(view);
|
||||
arrayList.add(view);
|
||||
addTargets(transitionSet, arrayList);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void setEpicenter(Object obj, View view) {
|
||||
if (view != null) {
|
||||
final Rect rect = new Rect();
|
||||
getBoundsOnScreen(view, rect);
|
||||
((Transition) obj).setEpicenterCallback(new Transition.EpicenterCallback() { // from class: androidx.fragment.app.FragmentTransitionCompat21.1
|
||||
@Override // android.transition.Transition.EpicenterCallback
|
||||
public Rect onGetEpicenter(Transition transition) {
|
||||
return rect;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void addTargets(Object obj, ArrayList<View> arrayList) {
|
||||
Transition transition = (Transition) obj;
|
||||
if (transition == null) {
|
||||
return;
|
||||
}
|
||||
int i = 0;
|
||||
if (transition instanceof TransitionSet) {
|
||||
TransitionSet transitionSet = (TransitionSet) transition;
|
||||
int transitionCount = transitionSet.getTransitionCount();
|
||||
while (i < transitionCount) {
|
||||
addTargets(transitionSet.getTransitionAt(i), arrayList);
|
||||
i++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (hasSimpleTarget(transition) || !isNullOrEmpty(transition.getTargets())) {
|
||||
return;
|
||||
}
|
||||
int size = arrayList.size();
|
||||
while (i < size) {
|
||||
transition.addTarget(arrayList.get(i));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean hasSimpleTarget(Transition transition) {
|
||||
return (isNullOrEmpty(transition.getTargetIds()) && isNullOrEmpty(transition.getTargetNames()) && isNullOrEmpty(transition.getTargetTypes())) ? false : true;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public Object mergeTransitionsTogether(Object obj, Object obj2, Object obj3) {
|
||||
TransitionSet transitionSet = new TransitionSet();
|
||||
if (obj != null) {
|
||||
transitionSet.addTransition((Transition) obj);
|
||||
}
|
||||
if (obj2 != null) {
|
||||
transitionSet.addTransition((Transition) obj2);
|
||||
}
|
||||
if (obj3 != null) {
|
||||
transitionSet.addTransition((Transition) obj3);
|
||||
}
|
||||
return transitionSet;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void scheduleHideFragmentView(Object obj, final View view, final ArrayList<View> arrayList) {
|
||||
((Transition) obj).addListener(new Transition.TransitionListener() { // from class: androidx.fragment.app.FragmentTransitionCompat21.2
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionCancel(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionPause(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionResume(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionStart(Transition transition) {
|
||||
transition.removeListener(this);
|
||||
transition.addListener(this);
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
transition.removeListener(this);
|
||||
view.setVisibility(8);
|
||||
int size = arrayList.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
((View) arrayList.get(i)).setVisibility(0);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public Object mergeTransitionsInSequence(Object obj, Object obj2, Object obj3) {
|
||||
Transition transition = (Transition) obj;
|
||||
Transition transition2 = (Transition) obj2;
|
||||
Transition transition3 = (Transition) obj3;
|
||||
if (transition != null && transition2 != null) {
|
||||
transition = new TransitionSet().addTransition(transition).addTransition(transition2).setOrdering(1);
|
||||
} else if (transition == null) {
|
||||
transition = transition2 != null ? transition2 : null;
|
||||
}
|
||||
if (transition3 == null) {
|
||||
return transition;
|
||||
}
|
||||
TransitionSet transitionSet = new TransitionSet();
|
||||
if (transition != null) {
|
||||
transitionSet.addTransition(transition);
|
||||
}
|
||||
transitionSet.addTransition(transition3);
|
||||
return transitionSet;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void beginDelayedTransition(ViewGroup viewGroup, Object obj) {
|
||||
TransitionManager.beginDelayedTransition(viewGroup, (Transition) obj);
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void scheduleRemoveTargets(Object obj, final Object obj2, final ArrayList<View> arrayList, final Object obj3, final ArrayList<View> arrayList2, final Object obj4, final ArrayList<View> arrayList3) {
|
||||
((Transition) obj).addListener(new Transition.TransitionListener() { // from class: androidx.fragment.app.FragmentTransitionCompat21.3
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionCancel(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionPause(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionResume(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionStart(Transition transition) {
|
||||
Object obj5 = obj2;
|
||||
if (obj5 != null) {
|
||||
FragmentTransitionCompat21.this.replaceTargets(obj5, arrayList, null);
|
||||
}
|
||||
Object obj6 = obj3;
|
||||
if (obj6 != null) {
|
||||
FragmentTransitionCompat21.this.replaceTargets(obj6, arrayList2, null);
|
||||
}
|
||||
Object obj7 = obj4;
|
||||
if (obj7 != null) {
|
||||
FragmentTransitionCompat21.this.replaceTargets(obj7, arrayList3, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
transition.removeListener(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void setListenerForTransitionEnd(Fragment fragment, Object obj, CancellationSignal cancellationSignal, final Runnable runnable) {
|
||||
((Transition) obj).addListener(new Transition.TransitionListener() { // from class: androidx.fragment.app.FragmentTransitionCompat21.4
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionCancel(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionPause(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionResume(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionStart(Transition transition) {
|
||||
}
|
||||
|
||||
@Override // android.transition.Transition.TransitionListener
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
runnable.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void swapSharedElementTargets(Object obj, ArrayList<View> arrayList, ArrayList<View> arrayList2) {
|
||||
TransitionSet transitionSet = (TransitionSet) obj;
|
||||
if (transitionSet != null) {
|
||||
transitionSet.getTargets().clear();
|
||||
transitionSet.getTargets().addAll(arrayList2);
|
||||
replaceTargets(transitionSet, arrayList, arrayList2);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void replaceTargets(Object obj, ArrayList<View> arrayList, ArrayList<View> arrayList2) {
|
||||
List<View> targets;
|
||||
Transition transition = (Transition) obj;
|
||||
int i = 0;
|
||||
if (transition instanceof TransitionSet) {
|
||||
TransitionSet transitionSet = (TransitionSet) transition;
|
||||
int transitionCount = transitionSet.getTransitionCount();
|
||||
while (i < transitionCount) {
|
||||
replaceTargets(transitionSet.getTransitionAt(i), arrayList, arrayList2);
|
||||
i++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (hasSimpleTarget(transition) || (targets = transition.getTargets()) == null || targets.size() != arrayList.size() || !targets.containsAll(arrayList)) {
|
||||
return;
|
||||
}
|
||||
int size = arrayList2 == null ? 0 : arrayList2.size();
|
||||
while (i < size) {
|
||||
transition.addTarget(arrayList2.get(i));
|
||||
i++;
|
||||
}
|
||||
for (int size2 = arrayList.size() - 1; size2 >= 0; size2--) {
|
||||
transition.removeTarget(arrayList.get(size2));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void addTarget(Object obj, View view) {
|
||||
if (obj != null) {
|
||||
((Transition) obj).addTarget(view);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void removeTarget(Object obj, View view) {
|
||||
if (obj != null) {
|
||||
((Transition) obj).removeTarget(view);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.FragmentTransitionImpl
|
||||
public void setEpicenter(Object obj, final Rect rect) {
|
||||
if (obj != null) {
|
||||
((Transition) obj).setEpicenterCallback(new Transition.EpicenterCallback() { // from class: androidx.fragment.app.FragmentTransitionCompat21.5
|
||||
@Override // android.transition.Transition.EpicenterCallback
|
||||
public Rect onGetEpicenter(Transition transition) {
|
||||
Rect rect2 = rect;
|
||||
if (rect2 == null || rect2.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return rect;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,225 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import androidx.core.view.OneShotPreDrawListener;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.ViewGroupCompat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class FragmentTransitionImpl {
|
||||
public abstract void addTarget(Object obj, View view);
|
||||
|
||||
public abstract void addTargets(Object obj, ArrayList<View> arrayList);
|
||||
|
||||
public abstract void beginDelayedTransition(ViewGroup viewGroup, Object obj);
|
||||
|
||||
public abstract boolean canHandle(Object obj);
|
||||
|
||||
public abstract Object cloneTransition(Object obj);
|
||||
|
||||
public abstract Object mergeTransitionsInSequence(Object obj, Object obj2, Object obj3);
|
||||
|
||||
public abstract Object mergeTransitionsTogether(Object obj, Object obj2, Object obj3);
|
||||
|
||||
public abstract void removeTarget(Object obj, View view);
|
||||
|
||||
public abstract void replaceTargets(Object obj, ArrayList<View> arrayList, ArrayList<View> arrayList2);
|
||||
|
||||
public abstract void scheduleHideFragmentView(Object obj, View view, ArrayList<View> arrayList);
|
||||
|
||||
public abstract void scheduleRemoveTargets(Object obj, Object obj2, ArrayList<View> arrayList, Object obj3, ArrayList<View> arrayList2, Object obj4, ArrayList<View> arrayList3);
|
||||
|
||||
public abstract void setEpicenter(Object obj, Rect rect);
|
||||
|
||||
public abstract void setEpicenter(Object obj, View view);
|
||||
|
||||
public abstract void setSharedElementTargets(Object obj, View view, ArrayList<View> arrayList);
|
||||
|
||||
public abstract void swapSharedElementTargets(Object obj, ArrayList<View> arrayList, ArrayList<View> arrayList2);
|
||||
|
||||
public abstract Object wrapTransitionInSet(Object obj);
|
||||
|
||||
protected void getBoundsOnScreen(View view, Rect rect) {
|
||||
if (ViewCompat.isAttachedToWindow(view)) {
|
||||
RectF rectF = new RectF();
|
||||
rectF.set(0.0f, 0.0f, view.getWidth(), view.getHeight());
|
||||
view.getMatrix().mapRect(rectF);
|
||||
rectF.offset(view.getLeft(), view.getTop());
|
||||
Object parent = view.getParent();
|
||||
while (parent instanceof View) {
|
||||
View view2 = (View) parent;
|
||||
rectF.offset(-view2.getScrollX(), -view2.getScrollY());
|
||||
view2.getMatrix().mapRect(rectF);
|
||||
rectF.offset(view2.getLeft(), view2.getTop());
|
||||
parent = view2.getParent();
|
||||
}
|
||||
view.getRootView().getLocationOnScreen(new int[2]);
|
||||
rectF.offset(r1[0], r1[1]);
|
||||
rect.set(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
|
||||
}
|
||||
}
|
||||
|
||||
ArrayList<String> prepareSetNameOverridesReordered(ArrayList<View> arrayList) {
|
||||
ArrayList<String> arrayList2 = new ArrayList<>();
|
||||
int size = arrayList.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
View view = arrayList.get(i);
|
||||
arrayList2.add(ViewCompat.getTransitionName(view));
|
||||
ViewCompat.setTransitionName(view, null);
|
||||
}
|
||||
return arrayList2;
|
||||
}
|
||||
|
||||
void setNameOverridesReordered(View view, final ArrayList<View> arrayList, final ArrayList<View> arrayList2, final ArrayList<String> arrayList3, Map<String, String> map) {
|
||||
final int size = arrayList2.size();
|
||||
final ArrayList arrayList4 = new ArrayList();
|
||||
for (int i = 0; i < size; i++) {
|
||||
View view2 = arrayList.get(i);
|
||||
String transitionName = ViewCompat.getTransitionName(view2);
|
||||
arrayList4.add(transitionName);
|
||||
if (transitionName != null) {
|
||||
ViewCompat.setTransitionName(view2, null);
|
||||
String str = map.get(transitionName);
|
||||
int i2 = 0;
|
||||
while (true) {
|
||||
if (i2 >= size) {
|
||||
break;
|
||||
}
|
||||
if (str.equals(arrayList3.get(i2))) {
|
||||
ViewCompat.setTransitionName(arrayList2.get(i2), transitionName);
|
||||
break;
|
||||
}
|
||||
i2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
OneShotPreDrawListener.add(view, new Runnable() { // from class: androidx.fragment.app.FragmentTransitionImpl.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
for (int i3 = 0; i3 < size; i3++) {
|
||||
ViewCompat.setTransitionName((View) arrayList2.get(i3), (String) arrayList3.get(i3));
|
||||
ViewCompat.setTransitionName((View) arrayList.get(i3), (String) arrayList4.get(i3));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void captureTransitioningViews(ArrayList<View> arrayList, View view) {
|
||||
if (view.getVisibility() == 0) {
|
||||
if (view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view;
|
||||
if (ViewGroupCompat.isTransitionGroup(viewGroup)) {
|
||||
arrayList.add(viewGroup);
|
||||
return;
|
||||
}
|
||||
int childCount = viewGroup.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
captureTransitioningViews(arrayList, viewGroup.getChildAt(i));
|
||||
}
|
||||
return;
|
||||
}
|
||||
arrayList.add(view);
|
||||
}
|
||||
}
|
||||
|
||||
void findNamedViews(Map<String, View> map, View view) {
|
||||
if (view.getVisibility() == 0) {
|
||||
String transitionName = ViewCompat.getTransitionName(view);
|
||||
if (transitionName != null) {
|
||||
map.put(transitionName, view);
|
||||
}
|
||||
if (view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view;
|
||||
int childCount = viewGroup.getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
findNamedViews(map, viewGroup.getChildAt(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setNameOverridesOrdered(View view, final ArrayList<View> arrayList, final Map<String, String> map) {
|
||||
OneShotPreDrawListener.add(view, new Runnable() { // from class: androidx.fragment.app.FragmentTransitionImpl.2
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
int size = arrayList.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
View view2 = (View) arrayList.get(i);
|
||||
String transitionName = ViewCompat.getTransitionName(view2);
|
||||
if (transitionName != null) {
|
||||
ViewCompat.setTransitionName(view2, FragmentTransitionImpl.findKeyForValue(map, transitionName));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void setListenerForTransitionEnd(Fragment fragment, Object obj, CancellationSignal cancellationSignal, Runnable runnable) {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
void scheduleNameReset(ViewGroup viewGroup, final ArrayList<View> arrayList, final Map<String, String> map) {
|
||||
OneShotPreDrawListener.add(viewGroup, new Runnable() { // from class: androidx.fragment.app.FragmentTransitionImpl.3
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
int size = arrayList.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
View view = (View) arrayList.get(i);
|
||||
ViewCompat.setTransitionName(view, (String) map.get(ViewCompat.getTransitionName(view)));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected static void bfsAddViewChildren(List<View> list, View view) {
|
||||
int size = list.size();
|
||||
if (containedBeforeIndex(list, view, size)) {
|
||||
return;
|
||||
}
|
||||
if (ViewCompat.getTransitionName(view) != null) {
|
||||
list.add(view);
|
||||
}
|
||||
for (int i = size; i < list.size(); i++) {
|
||||
View view2 = list.get(i);
|
||||
if (view2 instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) view2;
|
||||
int childCount = viewGroup.getChildCount();
|
||||
for (int i2 = 0; i2 < childCount; i2++) {
|
||||
View childAt = viewGroup.getChildAt(i2);
|
||||
if (!containedBeforeIndex(list, childAt, size) && ViewCompat.getTransitionName(childAt) != null) {
|
||||
list.add(childAt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean containedBeforeIndex(List<View> list, View view, int i) {
|
||||
for (int i2 = 0; i2 < i; i2++) {
|
||||
if (list.get(i2) == view) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected static boolean isNullOrEmpty(List list) {
|
||||
return list == null || list.isEmpty();
|
||||
}
|
||||
|
||||
static String findKeyForValue(Map<String, String> map, String str) {
|
||||
for (Map.Entry<String, String> entry : map.entrySet()) {
|
||||
if (str.equals(entry.getValue())) {
|
||||
return entry.getKey();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.os.Bundle;
|
||||
import androidx.lifecycle.HasDefaultViewModelProviderFactory;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.lifecycle.LifecycleRegistry;
|
||||
import androidx.lifecycle.SavedStateViewModelFactory;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.lifecycle.ViewModelStore;
|
||||
import androidx.lifecycle.ViewModelStoreOwner;
|
||||
import androidx.lifecycle.viewmodel.CreationExtras;
|
||||
import androidx.savedstate.SavedStateRegistry;
|
||||
import androidx.savedstate.SavedStateRegistryController;
|
||||
import androidx.savedstate.SavedStateRegistryOwner;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
class FragmentViewLifecycleOwner implements HasDefaultViewModelProviderFactory, SavedStateRegistryOwner, ViewModelStoreOwner {
|
||||
private ViewModelProvider.Factory mDefaultFactory;
|
||||
private final Fragment mFragment;
|
||||
private LifecycleRegistry mLifecycleRegistry = null;
|
||||
private SavedStateRegistryController mSavedStateRegistryController = null;
|
||||
private final ViewModelStore mViewModelStore;
|
||||
|
||||
@Override // androidx.lifecycle.HasDefaultViewModelProviderFactory
|
||||
public /* synthetic */ CreationExtras getDefaultViewModelCreationExtras() {
|
||||
CreationExtras creationExtras;
|
||||
creationExtras = CreationExtras.Empty.INSTANCE;
|
||||
return creationExtras;
|
||||
}
|
||||
|
||||
boolean isInitialized() {
|
||||
return this.mLifecycleRegistry != null;
|
||||
}
|
||||
|
||||
FragmentViewLifecycleOwner(Fragment fragment, ViewModelStore viewModelStore) {
|
||||
this.mFragment = fragment;
|
||||
this.mViewModelStore = viewModelStore;
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.ViewModelStoreOwner
|
||||
public ViewModelStore getViewModelStore() {
|
||||
initialize();
|
||||
return this.mViewModelStore;
|
||||
}
|
||||
|
||||
void initialize() {
|
||||
if (this.mLifecycleRegistry == null) {
|
||||
this.mLifecycleRegistry = new LifecycleRegistry(this);
|
||||
this.mSavedStateRegistryController = SavedStateRegistryController.create(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.LifecycleOwner
|
||||
public Lifecycle getLifecycle() {
|
||||
initialize();
|
||||
return this.mLifecycleRegistry;
|
||||
}
|
||||
|
||||
void setCurrentState(Lifecycle.State state) {
|
||||
this.mLifecycleRegistry.setCurrentState(state);
|
||||
}
|
||||
|
||||
void handleLifecycleEvent(Lifecycle.Event event) {
|
||||
this.mLifecycleRegistry.handleLifecycleEvent(event);
|
||||
}
|
||||
|
||||
@Override // androidx.lifecycle.HasDefaultViewModelProviderFactory
|
||||
public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
|
||||
Application application;
|
||||
ViewModelProvider.Factory defaultViewModelProviderFactory = this.mFragment.getDefaultViewModelProviderFactory();
|
||||
if (!defaultViewModelProviderFactory.equals(this.mFragment.mDefaultFactory)) {
|
||||
this.mDefaultFactory = defaultViewModelProviderFactory;
|
||||
return defaultViewModelProviderFactory;
|
||||
}
|
||||
if (this.mDefaultFactory == null) {
|
||||
Context applicationContext = this.mFragment.requireContext().getApplicationContext();
|
||||
while (true) {
|
||||
if (!(applicationContext instanceof ContextWrapper)) {
|
||||
application = null;
|
||||
break;
|
||||
}
|
||||
if (applicationContext instanceof Application) {
|
||||
application = (Application) applicationContext;
|
||||
break;
|
||||
}
|
||||
applicationContext = ((ContextWrapper) applicationContext).getBaseContext();
|
||||
}
|
||||
this.mDefaultFactory = new SavedStateViewModelFactory(application, this, this.mFragment.getArguments());
|
||||
}
|
||||
return this.mDefaultFactory;
|
||||
}
|
||||
|
||||
@Override // androidx.savedstate.SavedStateRegistryOwner
|
||||
public SavedStateRegistry getSavedStateRegistry() {
|
||||
initialize();
|
||||
return this.mSavedStateRegistryController.getSavedStateRegistry();
|
||||
}
|
||||
|
||||
void performRestore(Bundle bundle) {
|
||||
this.mSavedStateRegistryController.performRestore(bundle);
|
||||
}
|
||||
|
||||
void performSave(Bundle bundle) {
|
||||
this.mSavedStateRegistryController.performSave(bundle);
|
||||
}
|
||||
}
|
243
02-Easy5/E5/sources/androidx/fragment/app/ListFragment.java
Normal file
243
02-Easy5/E5/sources/androidx/fragment/app/ListFragment.java
Normal file
@ -0,0 +1,243 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.R;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class ListFragment extends Fragment {
|
||||
static final int INTERNAL_EMPTY_ID = 16711681;
|
||||
static final int INTERNAL_LIST_CONTAINER_ID = 16711683;
|
||||
static final int INTERNAL_PROGRESS_CONTAINER_ID = 16711682;
|
||||
ListAdapter mAdapter;
|
||||
CharSequence mEmptyText;
|
||||
View mEmptyView;
|
||||
ListView mList;
|
||||
View mListContainer;
|
||||
boolean mListShown;
|
||||
View mProgressContainer;
|
||||
TextView mStandardEmptyView;
|
||||
private final Handler mHandler = new Handler();
|
||||
private final Runnable mRequestFocus = new Runnable() { // from class: androidx.fragment.app.ListFragment.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
ListFragment.this.mList.focusableViewAvailable(ListFragment.this.mList);
|
||||
}
|
||||
};
|
||||
private final AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { // from class: androidx.fragment.app.ListFragment.2
|
||||
@Override // android.widget.AdapterView.OnItemClickListener
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long j) {
|
||||
ListFragment.this.onListItemClick((ListView) adapterView, view, i, j);
|
||||
}
|
||||
};
|
||||
|
||||
public ListAdapter getListAdapter() {
|
||||
return this.mAdapter;
|
||||
}
|
||||
|
||||
public void onListItemClick(ListView listView, View view, int i, long j) {
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
|
||||
Context requireContext = requireContext();
|
||||
FrameLayout frameLayout = new FrameLayout(requireContext);
|
||||
LinearLayout linearLayout = new LinearLayout(requireContext);
|
||||
linearLayout.setId(INTERNAL_PROGRESS_CONTAINER_ID);
|
||||
linearLayout.setOrientation(1);
|
||||
linearLayout.setVisibility(8);
|
||||
linearLayout.setGravity(17);
|
||||
linearLayout.addView(new ProgressBar(requireContext, null, R.attr.progressBarStyleLarge), new FrameLayout.LayoutParams(-2, -2));
|
||||
frameLayout.addView(linearLayout, new FrameLayout.LayoutParams(-1, -1));
|
||||
FrameLayout frameLayout2 = new FrameLayout(requireContext);
|
||||
frameLayout2.setId(INTERNAL_LIST_CONTAINER_ID);
|
||||
TextView textView = new TextView(requireContext);
|
||||
textView.setId(INTERNAL_EMPTY_ID);
|
||||
textView.setGravity(17);
|
||||
frameLayout2.addView(textView, new FrameLayout.LayoutParams(-1, -1));
|
||||
ListView listView = new ListView(requireContext);
|
||||
listView.setId(R.id.list);
|
||||
listView.setDrawSelectorOnTop(false);
|
||||
frameLayout2.addView(listView, new FrameLayout.LayoutParams(-1, -1));
|
||||
frameLayout.addView(frameLayout2, new FrameLayout.LayoutParams(-1, -1));
|
||||
frameLayout.setLayoutParams(new FrameLayout.LayoutParams(-1, -1));
|
||||
return frameLayout;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onViewCreated(View view, Bundle bundle) {
|
||||
super.onViewCreated(view, bundle);
|
||||
ensureList();
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.Fragment
|
||||
public void onDestroyView() {
|
||||
this.mHandler.removeCallbacks(this.mRequestFocus);
|
||||
this.mList = null;
|
||||
this.mListShown = false;
|
||||
this.mListContainer = null;
|
||||
this.mProgressContainer = null;
|
||||
this.mEmptyView = null;
|
||||
this.mStandardEmptyView = null;
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
public void setListAdapter(ListAdapter listAdapter) {
|
||||
boolean z = this.mAdapter != null;
|
||||
this.mAdapter = listAdapter;
|
||||
ListView listView = this.mList;
|
||||
if (listView != null) {
|
||||
listView.setAdapter(listAdapter);
|
||||
if (this.mListShown || z) {
|
||||
return;
|
||||
}
|
||||
setListShown(true, requireView().getWindowToken() != null);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSelection(int i) {
|
||||
ensureList();
|
||||
this.mList.setSelection(i);
|
||||
}
|
||||
|
||||
public int getSelectedItemPosition() {
|
||||
ensureList();
|
||||
return this.mList.getSelectedItemPosition();
|
||||
}
|
||||
|
||||
public long getSelectedItemId() {
|
||||
ensureList();
|
||||
return this.mList.getSelectedItemId();
|
||||
}
|
||||
|
||||
public ListView getListView() {
|
||||
ensureList();
|
||||
return this.mList;
|
||||
}
|
||||
|
||||
public void setEmptyText(CharSequence charSequence) {
|
||||
ensureList();
|
||||
TextView textView = this.mStandardEmptyView;
|
||||
if (textView == null) {
|
||||
throw new IllegalStateException("Can't be used with a custom content view");
|
||||
}
|
||||
textView.setText(charSequence);
|
||||
if (this.mEmptyText == null) {
|
||||
this.mList.setEmptyView(this.mStandardEmptyView);
|
||||
}
|
||||
this.mEmptyText = charSequence;
|
||||
}
|
||||
|
||||
public void setListShown(boolean z) {
|
||||
setListShown(z, true);
|
||||
}
|
||||
|
||||
public void setListShownNoAnimation(boolean z) {
|
||||
setListShown(z, false);
|
||||
}
|
||||
|
||||
private void setListShown(boolean z, boolean z2) {
|
||||
ensureList();
|
||||
View view = this.mProgressContainer;
|
||||
if (view == null) {
|
||||
throw new IllegalStateException("Can't be used with a custom content view");
|
||||
}
|
||||
if (this.mListShown == z) {
|
||||
return;
|
||||
}
|
||||
this.mListShown = z;
|
||||
if (z) {
|
||||
if (z2) {
|
||||
view.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_out));
|
||||
this.mListContainer.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_in));
|
||||
} else {
|
||||
view.clearAnimation();
|
||||
this.mListContainer.clearAnimation();
|
||||
}
|
||||
this.mProgressContainer.setVisibility(8);
|
||||
this.mListContainer.setVisibility(0);
|
||||
return;
|
||||
}
|
||||
if (z2) {
|
||||
view.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_in));
|
||||
this.mListContainer.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_out));
|
||||
} else {
|
||||
view.clearAnimation();
|
||||
this.mListContainer.clearAnimation();
|
||||
}
|
||||
this.mProgressContainer.setVisibility(0);
|
||||
this.mListContainer.setVisibility(8);
|
||||
}
|
||||
|
||||
public final ListAdapter requireListAdapter() {
|
||||
ListAdapter listAdapter = getListAdapter();
|
||||
if (listAdapter != null) {
|
||||
return listAdapter;
|
||||
}
|
||||
throw new IllegalStateException("ListFragment " + this + " does not have a ListAdapter.");
|
||||
}
|
||||
|
||||
private void ensureList() {
|
||||
if (this.mList != null) {
|
||||
return;
|
||||
}
|
||||
View view = getView();
|
||||
if (view == null) {
|
||||
throw new IllegalStateException("Content view not yet created");
|
||||
}
|
||||
if (view instanceof ListView) {
|
||||
this.mList = (ListView) view;
|
||||
} else {
|
||||
TextView textView = (TextView) view.findViewById(INTERNAL_EMPTY_ID);
|
||||
this.mStandardEmptyView = textView;
|
||||
if (textView == null) {
|
||||
this.mEmptyView = view.findViewById(R.id.empty);
|
||||
} else {
|
||||
textView.setVisibility(8);
|
||||
}
|
||||
this.mProgressContainer = view.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
|
||||
this.mListContainer = view.findViewById(INTERNAL_LIST_CONTAINER_ID);
|
||||
View findViewById = view.findViewById(R.id.list);
|
||||
if (!(findViewById instanceof ListView)) {
|
||||
if (findViewById == null) {
|
||||
throw new RuntimeException("Your content must have a ListView whose id attribute is 'android.R.id.list'");
|
||||
}
|
||||
throw new RuntimeException("Content has view with id attribute 'android.R.id.list' that is not a ListView class");
|
||||
}
|
||||
ListView listView = (ListView) findViewById;
|
||||
this.mList = listView;
|
||||
View view2 = this.mEmptyView;
|
||||
if (view2 != null) {
|
||||
listView.setEmptyView(view2);
|
||||
} else {
|
||||
CharSequence charSequence = this.mEmptyText;
|
||||
if (charSequence != null) {
|
||||
this.mStandardEmptyView.setText(charSequence);
|
||||
this.mList.setEmptyView(this.mStandardEmptyView);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.mListShown = true;
|
||||
this.mList.setOnItemClickListener(this.mOnClickListener);
|
||||
ListAdapter listAdapter = this.mAdapter;
|
||||
if (listAdapter != null) {
|
||||
this.mAdapter = null;
|
||||
setListAdapter(listAdapter);
|
||||
} else if (this.mProgressContainer != null) {
|
||||
setListShown(false, false);
|
||||
}
|
||||
this.mHandler.post(this.mRequestFocus);
|
||||
}
|
||||
}
|
44
02-Easy5/E5/sources/androidx/fragment/app/LogWriter.java
Normal file
44
02-Easy5/E5/sources/androidx/fragment/app/LogWriter.java
Normal file
@ -0,0 +1,44 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.Log;
|
||||
import java.io.Writer;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class LogWriter extends Writer {
|
||||
private StringBuilder mBuilder = new StringBuilder(128);
|
||||
private final String mTag;
|
||||
|
||||
LogWriter(String str) {
|
||||
this.mTag = str;
|
||||
}
|
||||
|
||||
@Override // java.io.Writer, java.io.Closeable, java.lang.AutoCloseable
|
||||
public void close() {
|
||||
flushBuilder();
|
||||
}
|
||||
|
||||
@Override // java.io.Writer, java.io.Flushable
|
||||
public void flush() {
|
||||
flushBuilder();
|
||||
}
|
||||
|
||||
@Override // java.io.Writer
|
||||
public void write(char[] cArr, int i, int i2) {
|
||||
for (int i3 = 0; i3 < i2; i3++) {
|
||||
char c = cArr[i + i3];
|
||||
if (c == '\n') {
|
||||
flushBuilder();
|
||||
} else {
|
||||
this.mBuilder.append(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void flushBuilder() {
|
||||
if (this.mBuilder.length() > 0) {
|
||||
Log.d(this.mTag, this.mBuilder.toString());
|
||||
StringBuilder sb = this.mBuilder;
|
||||
sb.delete(0, sb.length());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,525 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.core.os.CancellationSignal;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.R;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
abstract class SpecialEffectsController {
|
||||
private final ViewGroup mContainer;
|
||||
final ArrayList<Operation> mPendingOperations = new ArrayList<>();
|
||||
final ArrayList<Operation> mRunningOperations = new ArrayList<>();
|
||||
boolean mOperationDirectionIsPop = false;
|
||||
boolean mIsContainerPostponed = false;
|
||||
|
||||
abstract void executeOperations(List<Operation> list, boolean z);
|
||||
|
||||
public ViewGroup getContainer() {
|
||||
return this.mContainer;
|
||||
}
|
||||
|
||||
void updateOperationDirection(boolean z) {
|
||||
this.mOperationDirectionIsPop = z;
|
||||
}
|
||||
|
||||
static SpecialEffectsController getOrCreateController(ViewGroup viewGroup, FragmentManager fragmentManager) {
|
||||
return getOrCreateController(viewGroup, fragmentManager.getSpecialEffectsControllerFactory());
|
||||
}
|
||||
|
||||
static SpecialEffectsController getOrCreateController(ViewGroup viewGroup, SpecialEffectsControllerFactory specialEffectsControllerFactory) {
|
||||
Object tag = viewGroup.getTag(R.id.special_effects_controller_view_tag);
|
||||
if (tag instanceof SpecialEffectsController) {
|
||||
return (SpecialEffectsController) tag;
|
||||
}
|
||||
SpecialEffectsController createController = specialEffectsControllerFactory.createController(viewGroup);
|
||||
viewGroup.setTag(R.id.special_effects_controller_view_tag, createController);
|
||||
return createController;
|
||||
}
|
||||
|
||||
SpecialEffectsController(ViewGroup viewGroup) {
|
||||
this.mContainer = viewGroup;
|
||||
}
|
||||
|
||||
Operation.LifecycleImpact getAwaitingCompletionLifecycleImpact(FragmentStateManager fragmentStateManager) {
|
||||
Operation findPendingOperation = findPendingOperation(fragmentStateManager.getFragment());
|
||||
Operation.LifecycleImpact lifecycleImpact = findPendingOperation != null ? findPendingOperation.getLifecycleImpact() : null;
|
||||
Operation findRunningOperation = findRunningOperation(fragmentStateManager.getFragment());
|
||||
return (findRunningOperation == null || !(lifecycleImpact == null || lifecycleImpact == Operation.LifecycleImpact.NONE)) ? lifecycleImpact : findRunningOperation.getLifecycleImpact();
|
||||
}
|
||||
|
||||
private Operation findPendingOperation(Fragment fragment) {
|
||||
Iterator<Operation> it = this.mPendingOperations.iterator();
|
||||
while (it.hasNext()) {
|
||||
Operation next = it.next();
|
||||
if (next.getFragment().equals(fragment) && !next.isCanceled()) {
|
||||
return next;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Operation findRunningOperation(Fragment fragment) {
|
||||
Iterator<Operation> it = this.mRunningOperations.iterator();
|
||||
while (it.hasNext()) {
|
||||
Operation next = it.next();
|
||||
if (next.getFragment().equals(fragment) && !next.isCanceled()) {
|
||||
return next;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void enqueueAdd(Operation.State state, FragmentStateManager fragmentStateManager) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing add operation for fragment " + fragmentStateManager.getFragment());
|
||||
}
|
||||
enqueue(state, Operation.LifecycleImpact.ADDING, fragmentStateManager);
|
||||
}
|
||||
|
||||
void enqueueShow(FragmentStateManager fragmentStateManager) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing show operation for fragment " + fragmentStateManager.getFragment());
|
||||
}
|
||||
enqueue(Operation.State.VISIBLE, Operation.LifecycleImpact.NONE, fragmentStateManager);
|
||||
}
|
||||
|
||||
void enqueueHide(FragmentStateManager fragmentStateManager) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing hide operation for fragment " + fragmentStateManager.getFragment());
|
||||
}
|
||||
enqueue(Operation.State.GONE, Operation.LifecycleImpact.NONE, fragmentStateManager);
|
||||
}
|
||||
|
||||
void enqueueRemove(FragmentStateManager fragmentStateManager) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Enqueuing remove operation for fragment " + fragmentStateManager.getFragment());
|
||||
}
|
||||
enqueue(Operation.State.REMOVED, Operation.LifecycleImpact.REMOVING, fragmentStateManager);
|
||||
}
|
||||
|
||||
private void enqueue(Operation.State state, Operation.LifecycleImpact lifecycleImpact, FragmentStateManager fragmentStateManager) {
|
||||
synchronized (this.mPendingOperations) {
|
||||
CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
Operation findPendingOperation = findPendingOperation(fragmentStateManager.getFragment());
|
||||
if (findPendingOperation != null) {
|
||||
findPendingOperation.mergeWith(state, lifecycleImpact);
|
||||
return;
|
||||
}
|
||||
final FragmentStateManagerOperation fragmentStateManagerOperation = new FragmentStateManagerOperation(state, lifecycleImpact, fragmentStateManager, cancellationSignal);
|
||||
this.mPendingOperations.add(fragmentStateManagerOperation);
|
||||
fragmentStateManagerOperation.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.SpecialEffectsController.1
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
if (SpecialEffectsController.this.mPendingOperations.contains(fragmentStateManagerOperation)) {
|
||||
fragmentStateManagerOperation.getFinalState().applyState(fragmentStateManagerOperation.getFragment().mView);
|
||||
}
|
||||
}
|
||||
});
|
||||
fragmentStateManagerOperation.addCompletionListener(new Runnable() { // from class: androidx.fragment.app.SpecialEffectsController.2
|
||||
@Override // java.lang.Runnable
|
||||
public void run() {
|
||||
SpecialEffectsController.this.mPendingOperations.remove(fragmentStateManagerOperation);
|
||||
SpecialEffectsController.this.mRunningOperations.remove(fragmentStateManagerOperation);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void markPostponedState() {
|
||||
synchronized (this.mPendingOperations) {
|
||||
updateFinalState();
|
||||
this.mIsContainerPostponed = false;
|
||||
int size = this.mPendingOperations.size() - 1;
|
||||
while (true) {
|
||||
if (size < 0) {
|
||||
break;
|
||||
}
|
||||
Operation operation = this.mPendingOperations.get(size);
|
||||
Operation.State from = Operation.State.from(operation.getFragment().mView);
|
||||
if (operation.getFinalState() == Operation.State.VISIBLE && from != Operation.State.VISIBLE) {
|
||||
this.mIsContainerPostponed = operation.getFragment().isPostponed();
|
||||
break;
|
||||
}
|
||||
size--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void forcePostponedExecutePendingOperations() {
|
||||
if (this.mIsContainerPostponed) {
|
||||
this.mIsContainerPostponed = false;
|
||||
executePendingOperations();
|
||||
}
|
||||
}
|
||||
|
||||
void executePendingOperations() {
|
||||
if (this.mIsContainerPostponed) {
|
||||
return;
|
||||
}
|
||||
if (!ViewCompat.isAttachedToWindow(this.mContainer)) {
|
||||
forceCompleteAllOperations();
|
||||
this.mOperationDirectionIsPop = false;
|
||||
return;
|
||||
}
|
||||
synchronized (this.mPendingOperations) {
|
||||
if (!this.mPendingOperations.isEmpty()) {
|
||||
ArrayList arrayList = new ArrayList(this.mRunningOperations);
|
||||
this.mRunningOperations.clear();
|
||||
Iterator it = arrayList.iterator();
|
||||
while (it.hasNext()) {
|
||||
Operation operation = (Operation) it.next();
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Cancelling operation " + operation);
|
||||
}
|
||||
operation.cancel();
|
||||
if (!operation.isComplete()) {
|
||||
this.mRunningOperations.add(operation);
|
||||
}
|
||||
}
|
||||
updateFinalState();
|
||||
ArrayList arrayList2 = new ArrayList(this.mPendingOperations);
|
||||
this.mPendingOperations.clear();
|
||||
this.mRunningOperations.addAll(arrayList2);
|
||||
Iterator it2 = arrayList2.iterator();
|
||||
while (it2.hasNext()) {
|
||||
((Operation) it2.next()).onStart();
|
||||
}
|
||||
executeOperations(arrayList2, this.mOperationDirectionIsPop);
|
||||
this.mOperationDirectionIsPop = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void forceCompleteAllOperations() {
|
||||
String str;
|
||||
String str2;
|
||||
boolean isAttachedToWindow = ViewCompat.isAttachedToWindow(this.mContainer);
|
||||
synchronized (this.mPendingOperations) {
|
||||
updateFinalState();
|
||||
Iterator<Operation> it = this.mPendingOperations.iterator();
|
||||
while (it.hasNext()) {
|
||||
it.next().onStart();
|
||||
}
|
||||
Iterator it2 = new ArrayList(this.mRunningOperations).iterator();
|
||||
while (it2.hasNext()) {
|
||||
Operation operation = (Operation) it2.next();
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("SpecialEffectsController: ");
|
||||
if (isAttachedToWindow) {
|
||||
str2 = "";
|
||||
} else {
|
||||
str2 = "Container " + this.mContainer + " is not attached to window. ";
|
||||
}
|
||||
sb.append(str2);
|
||||
sb.append("Cancelling running operation ");
|
||||
sb.append(operation);
|
||||
Log.v("FragmentManager", sb.toString());
|
||||
}
|
||||
operation.cancel();
|
||||
}
|
||||
Iterator it3 = new ArrayList(this.mPendingOperations).iterator();
|
||||
while (it3.hasNext()) {
|
||||
Operation operation2 = (Operation) it3.next();
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
StringBuilder sb2 = new StringBuilder();
|
||||
sb2.append("SpecialEffectsController: ");
|
||||
if (isAttachedToWindow) {
|
||||
str = "";
|
||||
} else {
|
||||
str = "Container " + this.mContainer + " is not attached to window. ";
|
||||
}
|
||||
sb2.append(str);
|
||||
sb2.append("Cancelling pending operation ");
|
||||
sb2.append(operation2);
|
||||
Log.v("FragmentManager", sb2.toString());
|
||||
}
|
||||
operation2.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateFinalState() {
|
||||
Iterator<Operation> it = this.mPendingOperations.iterator();
|
||||
while (it.hasNext()) {
|
||||
Operation next = it.next();
|
||||
if (next.getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
|
||||
next.mergeWith(Operation.State.from(next.getFragment().requireView().getVisibility()), Operation.LifecycleImpact.NONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class Operation {
|
||||
private State mFinalState;
|
||||
private final Fragment mFragment;
|
||||
private LifecycleImpact mLifecycleImpact;
|
||||
private final List<Runnable> mCompletionListeners = new ArrayList();
|
||||
private final HashSet<CancellationSignal> mSpecialEffectsSignals = new HashSet<>();
|
||||
private boolean mIsCanceled = false;
|
||||
private boolean mIsComplete = false;
|
||||
|
||||
enum LifecycleImpact {
|
||||
NONE,
|
||||
ADDING,
|
||||
REMOVING
|
||||
}
|
||||
|
||||
public State getFinalState() {
|
||||
return this.mFinalState;
|
||||
}
|
||||
|
||||
public final Fragment getFragment() {
|
||||
return this.mFragment;
|
||||
}
|
||||
|
||||
LifecycleImpact getLifecycleImpact() {
|
||||
return this.mLifecycleImpact;
|
||||
}
|
||||
|
||||
final boolean isCanceled() {
|
||||
return this.mIsCanceled;
|
||||
}
|
||||
|
||||
final boolean isComplete() {
|
||||
return this.mIsComplete;
|
||||
}
|
||||
|
||||
void onStart() {
|
||||
}
|
||||
|
||||
enum State {
|
||||
REMOVED,
|
||||
VISIBLE,
|
||||
GONE,
|
||||
INVISIBLE;
|
||||
|
||||
static State from(View view) {
|
||||
return (view.getAlpha() == 0.0f && view.getVisibility() == 0) ? INVISIBLE : from(view.getVisibility());
|
||||
}
|
||||
|
||||
static State from(int i) {
|
||||
if (i == 0) {
|
||||
return VISIBLE;
|
||||
}
|
||||
if (i == 4) {
|
||||
return INVISIBLE;
|
||||
}
|
||||
if (i == 8) {
|
||||
return GONE;
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown visibility " + i);
|
||||
}
|
||||
|
||||
void applyState(View view) {
|
||||
int i = AnonymousClass3.$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[ordinal()];
|
||||
if (i == 1) {
|
||||
ViewGroup viewGroup = (ViewGroup) view.getParent();
|
||||
if (viewGroup != null) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Removing view " + view + " from container " + viewGroup);
|
||||
}
|
||||
viewGroup.removeView(view);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (i == 2) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to VISIBLE");
|
||||
}
|
||||
view.setVisibility(0);
|
||||
return;
|
||||
}
|
||||
if (i == 3) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to GONE");
|
||||
}
|
||||
view.setVisibility(8);
|
||||
return;
|
||||
}
|
||||
if (i != 4) {
|
||||
return;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: Setting view " + view + " to INVISIBLE");
|
||||
}
|
||||
view.setVisibility(4);
|
||||
}
|
||||
}
|
||||
|
||||
Operation(State state, LifecycleImpact lifecycleImpact, Fragment fragment, CancellationSignal cancellationSignal) {
|
||||
this.mFinalState = state;
|
||||
this.mLifecycleImpact = lifecycleImpact;
|
||||
this.mFragment = fragment;
|
||||
cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() { // from class: androidx.fragment.app.SpecialEffectsController.Operation.1
|
||||
@Override // androidx.core.os.CancellationSignal.OnCancelListener
|
||||
public void onCancel() {
|
||||
Operation.this.cancel();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Operation {" + Integer.toHexString(System.identityHashCode(this)) + "} {mFinalState = " + this.mFinalState + "} {mLifecycleImpact = " + this.mLifecycleImpact + "} {mFragment = " + this.mFragment + "}";
|
||||
}
|
||||
|
||||
final void cancel() {
|
||||
if (isCanceled()) {
|
||||
return;
|
||||
}
|
||||
this.mIsCanceled = true;
|
||||
if (this.mSpecialEffectsSignals.isEmpty()) {
|
||||
complete();
|
||||
return;
|
||||
}
|
||||
Iterator it = new ArrayList(this.mSpecialEffectsSignals).iterator();
|
||||
while (it.hasNext()) {
|
||||
((CancellationSignal) it.next()).cancel();
|
||||
}
|
||||
}
|
||||
|
||||
final void mergeWith(State state, LifecycleImpact lifecycleImpact) {
|
||||
int i = AnonymousClass3.$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[lifecycleImpact.ordinal()];
|
||||
if (i == 1) {
|
||||
if (this.mFinalState == State.REMOVED) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = REMOVED -> VISIBLE. mLifecycleImpact = " + this.mLifecycleImpact + " to ADDING.");
|
||||
}
|
||||
this.mFinalState = State.VISIBLE;
|
||||
this.mLifecycleImpact = LifecycleImpact.ADDING;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (i == 2) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = " + this.mFinalState + " -> REMOVED. mLifecycleImpact = " + this.mLifecycleImpact + " to REMOVING.");
|
||||
}
|
||||
this.mFinalState = State.REMOVED;
|
||||
this.mLifecycleImpact = LifecycleImpact.REMOVING;
|
||||
return;
|
||||
}
|
||||
if (i == 3 && this.mFinalState != State.REMOVED) {
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: For fragment " + this.mFragment + " mFinalState = " + this.mFinalState + " -> " + state + ". ");
|
||||
}
|
||||
this.mFinalState = state;
|
||||
}
|
||||
}
|
||||
|
||||
final void addCompletionListener(Runnable runnable) {
|
||||
this.mCompletionListeners.add(runnable);
|
||||
}
|
||||
|
||||
public final void markStartedSpecialEffect(CancellationSignal cancellationSignal) {
|
||||
onStart();
|
||||
this.mSpecialEffectsSignals.add(cancellationSignal);
|
||||
}
|
||||
|
||||
public final void completeSpecialEffect(CancellationSignal cancellationSignal) {
|
||||
if (this.mSpecialEffectsSignals.remove(cancellationSignal) && this.mSpecialEffectsSignals.isEmpty()) {
|
||||
complete();
|
||||
}
|
||||
}
|
||||
|
||||
public void complete() {
|
||||
if (this.mIsComplete) {
|
||||
return;
|
||||
}
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "SpecialEffectsController: " + this + " has called complete.");
|
||||
}
|
||||
this.mIsComplete = true;
|
||||
Iterator<Runnable> it = this.mCompletionListeners.iterator();
|
||||
while (it.hasNext()) {
|
||||
it.next().run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* renamed from: androidx.fragment.app.SpecialEffectsController$3, reason: invalid class name */
|
||||
static /* synthetic */ class AnonymousClass3 {
|
||||
static final /* synthetic */ int[] $SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact;
|
||||
static final /* synthetic */ int[] $SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State;
|
||||
|
||||
static {
|
||||
int[] iArr = new int[Operation.LifecycleImpact.values().length];
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact = iArr;
|
||||
try {
|
||||
iArr[Operation.LifecycleImpact.ADDING.ordinal()] = 1;
|
||||
} catch (NoSuchFieldError unused) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[Operation.LifecycleImpact.REMOVING.ordinal()] = 2;
|
||||
} catch (NoSuchFieldError unused2) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$LifecycleImpact[Operation.LifecycleImpact.NONE.ordinal()] = 3;
|
||||
} catch (NoSuchFieldError unused3) {
|
||||
}
|
||||
int[] iArr2 = new int[Operation.State.values().length];
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State = iArr2;
|
||||
try {
|
||||
iArr2[Operation.State.REMOVED.ordinal()] = 1;
|
||||
} catch (NoSuchFieldError unused4) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.VISIBLE.ordinal()] = 2;
|
||||
} catch (NoSuchFieldError unused5) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.GONE.ordinal()] = 3;
|
||||
} catch (NoSuchFieldError unused6) {
|
||||
}
|
||||
try {
|
||||
$SwitchMap$androidx$fragment$app$SpecialEffectsController$Operation$State[Operation.State.INVISIBLE.ordinal()] = 4;
|
||||
} catch (NoSuchFieldError unused7) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class FragmentStateManagerOperation extends Operation {
|
||||
private final FragmentStateManager mFragmentStateManager;
|
||||
|
||||
FragmentStateManagerOperation(Operation.State state, Operation.LifecycleImpact lifecycleImpact, FragmentStateManager fragmentStateManager, CancellationSignal cancellationSignal) {
|
||||
super(state, lifecycleImpact, fragmentStateManager.getFragment(), cancellationSignal);
|
||||
this.mFragmentStateManager = fragmentStateManager;
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.SpecialEffectsController.Operation
|
||||
void onStart() {
|
||||
if (getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
|
||||
Fragment fragment = this.mFragmentStateManager.getFragment();
|
||||
View findFocus = fragment.mView.findFocus();
|
||||
if (findFocus != null) {
|
||||
fragment.setFocusedView(findFocus);
|
||||
if (FragmentManager.isLoggingEnabled(2)) {
|
||||
Log.v("FragmentManager", "requestFocus: Saved focused view " + findFocus + " for Fragment " + fragment);
|
||||
}
|
||||
}
|
||||
View requireView = getFragment().requireView();
|
||||
if (requireView.getParent() == null) {
|
||||
this.mFragmentStateManager.addViewToContainer();
|
||||
requireView.setAlpha(0.0f);
|
||||
}
|
||||
if (requireView.getAlpha() == 0.0f && requireView.getVisibility() == 0) {
|
||||
requireView.setVisibility(4);
|
||||
}
|
||||
requireView.setAlpha(fragment.getPostOnViewCreatedAlpha());
|
||||
}
|
||||
}
|
||||
|
||||
@Override // androidx.fragment.app.SpecialEffectsController.Operation
|
||||
public void complete() {
|
||||
super.complete();
|
||||
this.mFragmentStateManager.moveToExpectedState();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
interface SpecialEffectsControllerFactory {
|
||||
SpecialEffectsController createController(ViewGroup viewGroup);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import android.util.AndroidRuntimeException;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
final class SuperNotCalledException extends AndroidRuntimeException {
|
||||
public SuperNotCalledException(String str) {
|
||||
super(str);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user