FragmentManager.java revision 2dedce6e84679ead961a485c7fe4b0f77c713b6a
12dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/*
22dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
32dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
42dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
52dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * you may not use this file except in compliance with the License.
62dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * You may obtain a copy of the License at
72dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
82dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
92dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn *
102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * See the License for the specific language governing permissions and
142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * limitations under the License.
152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornpackage android.app;
182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.os.Bundle;
202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport android.view.ViewGroup;
212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornimport java.util.ArrayList;
232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn/**
252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn * Container for fragments associated with an activity.
262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn */
272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackbornclass FragmentManager {
282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    final ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    int mCurState = Fragment.INITIALIZING;
312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    Activity mActivity;
322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    void moveToState(Fragment f, int newState) {
342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (f.mState < newState) {
352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.INITIALIZING:
372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mActivity = mActivity;
382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onAttach(mActivity);
402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onAttach()");
432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mCalled = false;
452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.onCreate(null);
462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (!f.mCalled) {
472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        throw new SuperNotCalledException("Fragment " + f
482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                + " did not call through to super.onCreate()");
492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    ViewGroup container = null;
522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (f.mContainerId != 0) {
532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        container = (ViewGroup)mActivity.findViewById(f.mContainerId);
542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (container == null) {
552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new IllegalArgumentException("New view found for id 0x"
562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + Integer.toHexString(f.mContainerId)
572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " for fragment " + f);
582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mContainer = container;
612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    f.mView = f.onCreateView(mActivity.getLayoutInflater(), container);
622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (container != null && f.mView != null) {
632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        container.addView(f.mView);
642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.CREATED:
672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.CREATED) {
682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStart();
702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStart()");
732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState > Fragment.STARTED) {
772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onResume();
792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onResume()");
822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
842dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
852dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        } else if (f.mState > newState) {
862dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            switch (f.mState) {
872dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.RESUMED:
882dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.RESUMED) {
892dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
902dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onPause();
912dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
922dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
932dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onPause()");
942dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
952dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
962dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.STARTED:
972dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.STARTED) {
982dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
992dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onStop();
1002dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
1012dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
1022dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onStop()");
1032dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
1042dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
1052dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                case Fragment.CREATED:
1062dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    if (newState < Fragment.CREATED) {
1072dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (f.mContainer != null && f.mView != null) {
1082dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            f.mContainer.removeView(f.mView);
1092dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
1102dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mContainer = null;
1112dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mView = null;
1122dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1132dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
1142dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDestroy();
1152dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
1162dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
1172dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDestroy()");
1182dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
1192dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mCalled = false;
1202dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.onDetach();
1212dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        if (!f.mCalled) {
1222dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                            throw new SuperNotCalledException("Fragment " + f
1232dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                                    + " did not call through to super.onDetach()");
1242dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        }
1252dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                        f.mActivity = null;
1262dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn                    }
1272dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            }
1282dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
1292dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1302dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        f.mState = newState;
1312dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1322dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1332dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    void moveToState(int newState) {
1342dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity == null && newState != Fragment.INITIALIZING) {
1352dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            throw new IllegalStateException("No activity");
1362dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
1372dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1382dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mCurState = newState;
1392dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        for (int i=0; i<mFragments.size(); i++) {
1402dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            Fragment f = mFragments.get(i);
1412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn            moveToState(f, newState);
1422dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        }
1432dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1442dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1452dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void addFragment(Fragment fragment) {
1462dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.add(fragment);
1472dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1482dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1492dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void removeFragment(Fragment fragment) {
1502dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mFragments.remove(fragment);
1512dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(fragment, Fragment.INITIALIZING);
1522dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1532dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1542dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void attachActivity(Activity activity) {
1552dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        if (mActivity != null) throw new IllegalStateException();
1562dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = activity;
1572dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1582dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1592dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchCreate(Bundle state) {
1602dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.CREATED);
1612dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1622dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1632dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStart() {
1642dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.STARTED);
1652dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1662dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1672dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchResume() {
1682dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.RESUMED);
1692dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1702dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1712dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchPause() {
1722dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.STARTED);
1732dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1742dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1752dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchStop() {
1762dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.CREATED);
1772dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1782dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn
1792dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    public void dispatchDestroy() {
1802dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        moveToState(Fragment.INITIALIZING);
1812dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn        mActivity = null;
1822dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn    }
1832dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn}
184