16acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas/* 26acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * Copyright (C) 2017 The Android Open Source Project 36acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * 46acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * Licensed under the Apache License, Version 2.0 (the "License"); 56acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * you may not use this file except in compliance with the License. 66acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * You may obtain a copy of the License at 76acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * 86acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * http://www.apache.org/licenses/LICENSE-2.0 96acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * 106acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * Unless required by applicable law or agreed to in writing, software 116acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * distributed under the License is distributed on an "AS IS" BASIS, 126acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * See the License for the specific language governing permissions and 146acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas * limitations under the License. 156acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas */ 166acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 176acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikaspackage android.app; 186acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 196acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasimport android.content.Context; 206acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasimport android.os.Bundle; 216acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasimport android.os.Parcel; 226acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasimport android.os.Parcelable; 236acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasimport android.util.Log; 246acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 256acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikasfinal class FragmentState implements Parcelable { 266acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final String mClassName; 276acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final int mIndex; 286acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final boolean mFromLayout; 296acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final int mFragmentId; 306acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final int mContainerId; 316acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final String mTag; 326acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final boolean mRetainInstance; 336acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final boolean mDetached; 346acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final Bundle mArguments; 356acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final boolean mHidden; 366acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 376acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas Bundle mSavedFragmentState; 386acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 396acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas Fragment mInstance; 406acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 416acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas FragmentState(Fragment frag) { 426acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mClassName = frag.getClass().getName(); 436acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mIndex = frag.mIndex; 446acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mFromLayout = frag.mFromLayout; 456acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mFragmentId = frag.mFragmentId; 466acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mContainerId = frag.mContainerId; 476acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mTag = frag.mTag; 486acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mRetainInstance = frag.mRetainInstance; 496acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mDetached = frag.mDetached; 506acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mArguments = frag.mArguments; 516acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mHidden = frag.mHidden; 526acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 536acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 546acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas FragmentState(Parcel in) { 556acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mClassName = in.readString(); 566acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mIndex = in.readInt(); 576acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mFromLayout = in.readInt() != 0; 586acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mFragmentId = in.readInt(); 596acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mContainerId = in.readInt(); 606acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mTag = in.readString(); 616acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mRetainInstance = in.readInt() != 0; 626acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mDetached = in.readInt() != 0; 636acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mArguments = in.readBundle(); 646acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mHidden = in.readInt() != 0; 656acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mSavedFragmentState = in.readBundle(); 666acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 676acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 686acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public Fragment instantiate(FragmentHostCallback host, FragmentContainer container, 696acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas Fragment parent, FragmentManagerNonConfig childNonConfig) { 706acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas if (mInstance == null) { 716acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas final Context context = host.getContext(); 726acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas if (mArguments != null) { 736acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mArguments.setClassLoader(context.getClassLoader()); 746acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 756acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 766acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas if (container != null) { 776acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance = container.instantiate(context, mClassName, mArguments); 786acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } else { 796acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance = Fragment.instantiate(context, mClassName, mArguments); 806acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 816acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 826acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas if (mSavedFragmentState != null) { 836acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mSavedFragmentState.setClassLoader(context.getClassLoader()); 846acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mSavedFragmentState = mSavedFragmentState; 856acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 866acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.setIndex(mIndex, parent); 876acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mFromLayout = mFromLayout; 886acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mRestored = true; 896acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mFragmentId = mFragmentId; 906acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mContainerId = mContainerId; 916acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mTag = mTag; 926acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mRetainInstance = mRetainInstance; 936acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mDetached = mDetached; 946acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mHidden = mHidden; 956acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mFragmentManager = host.mFragmentManager; 966acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 976acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas if (FragmentManagerImpl.DEBUG) { 986acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas Log.v(FragmentManagerImpl.TAG, "Instantiated fragment " + mInstance); 996acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1006acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1016acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas mInstance.mChildNonConfig = childNonConfig; 1026acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas return mInstance; 1036acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1046acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 1056acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas @Override 1066acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public int describeContents() { 1076acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas return 0; 1086acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1096acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 1106acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas @Override 1116acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public void writeToParcel(Parcel dest, int flags) { 1126acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeString(mClassName); 1136acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mIndex); 1146acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mFromLayout ? 1 : 0); 1156acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mFragmentId); 1166acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mContainerId); 1176acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeString(mTag); 1186acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mRetainInstance ? 1 : 0); 1196acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mDetached ? 1 : 0); 1206acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeBundle(mArguments); 1216acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeInt(mHidden ? 1 : 0); 1226acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas dest.writeBundle(mSavedFragmentState); 1236acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1246acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 1256acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public static final Parcelable.Creator<FragmentState> CREATOR = 1266acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas new Parcelable.Creator<FragmentState>() { 1276acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas @Override 1286acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public FragmentState createFromParcel(Parcel in) { 1296acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas return new FragmentState(in); 1306acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1316acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas 1326acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas @Override 1336acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas public FragmentState[] newArray(int size) { 1346acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas return new FragmentState[size]; 1356acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas } 1366acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas }; 1376acbe075f92a2a3d0269e877427ebeff2e5982a9Aurimas Liutikas}