1e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas/* 2e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * Copyright (C) 2017 The Android Open Source Project 3e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * 4e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * Licensed under the Apache License, Version 2.0 (the "License"); 5e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * you may not use this file except in compliance with the License. 6e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * You may obtain a copy of the License at 7e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * 8e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * http://www.apache.org/licenses/LICENSE-2.0 9e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * 10e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * Unless required by applicable law or agreed to in writing, software 11e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * distributed under the License is distributed on an "AS IS" BASIS, 12e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * See the License for the specific language governing permissions and 14e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas * limitations under the License. 15e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas */ 16e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 17e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikaspackage android.support.v4.app; 18e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 19e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasimport android.content.Context; 20e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasimport android.os.Bundle; 21e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasimport android.os.Parcel; 22e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasimport android.os.Parcelable; 23e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasimport android.util.Log; 24e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 25e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikasfinal class FragmentState implements Parcelable { 26e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final String mClassName; 27e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final int mIndex; 28e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final boolean mFromLayout; 29e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final int mFragmentId; 30e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final int mContainerId; 31e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final String mTag; 32e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final boolean mRetainInstance; 33e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final boolean mDetached; 34e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final Bundle mArguments; 35e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final boolean mHidden; 36e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 37e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas Bundle mSavedFragmentState; 38e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 39e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas Fragment mInstance; 40e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 41e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas FragmentState(Fragment frag) { 42e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mClassName = frag.getClass().getName(); 43e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mIndex = frag.mIndex; 44e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mFromLayout = frag.mFromLayout; 45e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mFragmentId = frag.mFragmentId; 46e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mContainerId = frag.mContainerId; 47e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mTag = frag.mTag; 48e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mRetainInstance = frag.mRetainInstance; 49e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mDetached = frag.mDetached; 50e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mArguments = frag.mArguments; 51e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mHidden = frag.mHidden; 52e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 53e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 54e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas FragmentState(Parcel in) { 55e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mClassName = in.readString(); 56e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mIndex = in.readInt(); 57e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mFromLayout = in.readInt() != 0; 58e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mFragmentId = in.readInt(); 59e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mContainerId = in.readInt(); 60e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mTag = in.readString(); 61e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mRetainInstance = in.readInt() != 0; 62e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mDetached = in.readInt() != 0; 63e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mArguments = in.readBundle(); 64e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mHidden = in.readInt() != 0; 65e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mSavedFragmentState = in.readBundle(); 66e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 67e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 68e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public Fragment instantiate(FragmentHostCallback host, FragmentContainer container, 69e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas Fragment parent, FragmentManagerNonConfig childNonConfig) { 70e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas if (mInstance == null) { 71e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas final Context context = host.getContext(); 72e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas if (mArguments != null) { 73e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mArguments.setClassLoader(context.getClassLoader()); 74e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 75e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 76e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas if (container != null) { 77e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance = container.instantiate(context, mClassName, mArguments); 78e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } else { 79e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance = Fragment.instantiate(context, mClassName, mArguments); 80e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 81e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 82e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas if (mSavedFragmentState != null) { 83e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mSavedFragmentState.setClassLoader(context.getClassLoader()); 84e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mSavedFragmentState = mSavedFragmentState; 85e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 86e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.setIndex(mIndex, parent); 87e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mFromLayout = mFromLayout; 88e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mRestored = true; 89e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mFragmentId = mFragmentId; 90e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mContainerId = mContainerId; 91e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mTag = mTag; 92e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mRetainInstance = mRetainInstance; 93e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mDetached = mDetached; 94e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mHidden = mHidden; 95e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mFragmentManager = host.mFragmentManager; 96e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 97e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas if (FragmentManagerImpl.DEBUG) { 98e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas Log.v(FragmentManagerImpl.TAG, "Instantiated fragment " + mInstance); 99e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 100e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 101e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas mInstance.mChildNonConfig = childNonConfig; 102e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas return mInstance; 103e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 104e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 105e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas @Override 106e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public int describeContents() { 107e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas return 0; 108e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 109e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 110e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas @Override 111e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public void writeToParcel(Parcel dest, int flags) { 112e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeString(mClassName); 113e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mIndex); 114e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mFromLayout ? 1 : 0); 115e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mFragmentId); 116e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mContainerId); 117e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeString(mTag); 118e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mRetainInstance ? 1 : 0); 119e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mDetached ? 1 : 0); 120e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeBundle(mArguments); 121e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeInt(mHidden ? 1 : 0); 122e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas dest.writeBundle(mSavedFragmentState); 123e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 124e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 125e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public static final Parcelable.Creator<FragmentState> CREATOR = 126e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas new Parcelable.Creator<FragmentState>() { 127e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas @Override 128e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public FragmentState createFromParcel(Parcel in) { 129e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas return new FragmentState(in); 130e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 131e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas 132e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas @Override 133e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas public FragmentState[] newArray(int size) { 134e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas return new FragmentState[size]; 135e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas } 136e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas }; 137e3b17e1d43d77754df11544cf06e9658e52a4ac5Aurimas Liutikas} 138