320 lines
11 KiB
Java
320 lines
11 KiB
Java
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());
|
|
}
|
|
}
|
|
}
|
|
}
|