235 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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();
 | |
|     }
 | |
| }
 |