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}