19268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
39268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount *
49268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * Licensed under the Apache License, Version 2.0 (the "License");
59268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * you may not use this file except in compliance with the License.
69268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * You may obtain a copy of the License at
79268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount *
89268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount *      http://www.apache.org/licenses/LICENSE-2.0
99268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount *
109268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * Unless required by applicable law or agreed to in writing, software
119268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * distributed under the License is distributed on an "AS IS" BASIS,
129268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * See the License for the specific language governing permissions and
149268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount * limitations under the License.
159268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount */
169268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app;
189268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
199268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mountimport android.os.Bundle;
209268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
219268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mountpublic class ReentrantFragment extends StrictFragment {
229268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    private static final String FROM_STATE = "fromState";
239268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    private static final String TO_STATE = "toState";
249268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    int mFromState = 0;
259268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    int mToState = 0;
269268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    boolean mIsRestored;
279268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
289268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    public static ReentrantFragment create(int fromState, int toState) {
299268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        ReentrantFragment fragment = new ReentrantFragment();
309268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        fragment.mFromState = fromState;
319268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        fragment.mToState = toState;
329268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        fragment.mIsRestored = false;
339268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        return fragment;
349268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    }
359268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
369268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    @Override
379268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    public void onStateChanged(int fromState) {
389268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        super.onStateChanged(fromState);
399268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        // We execute the transaction when shutting down or after restoring
409268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        if (fromState == mFromState && mState == mToState
419268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount                && (mToState < mFromState || mIsRestored)) {
429268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount            executeTransaction();
439268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        }
449268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    }
459268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
469268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    private void executeTransaction() {
479268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        getFragmentManager().beginTransaction()
489268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount                .add(new StrictFragment(), "should throw")
499268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount                .commitNow();
509268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    }
519268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
529268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    @Override
539268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    public void onSaveInstanceState(Bundle outState) {
549268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        super.onSaveInstanceState(outState);
559268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        outState.putInt(FROM_STATE, mFromState);
569268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        outState.putInt(TO_STATE, mToState);
579268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    }
589268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
599268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    @Override
609268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    public void onCreate(Bundle savedInstanceState) {
619268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        if (savedInstanceState != null) {
629268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount            mFromState = savedInstanceState.getInt(FROM_STATE);
639268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount            mToState = savedInstanceState.getInt(TO_STATE);
649268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount            mIsRestored = true;
659268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        }
669268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount        super.onCreate(savedInstanceState);
679268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount    }
689268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount}
699268ce1264c6c2919b3feb1e26eef13ded3c9ab4George Mount
70