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