diff options
Diffstat (limited to 'core/java/android/app/FragmentManager.java')
-rw-r--r-- | core/java/android/app/FragmentManager.java | 100 |
1 files changed, 46 insertions, 54 deletions
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 975b20d..62436e9 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -19,9 +19,7 @@ package android.app; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; -import android.annotation.Nullable; import android.content.Context; -import android.annotation.IdRes; import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Bundle; @@ -48,6 +46,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * Interface for interacting with {@link Fragment} objects inside of an @@ -393,15 +392,6 @@ final class FragmentManagerState implements Parcelable { } /** - * Callbacks from FragmentManagerImpl to its container. - */ -interface FragmentContainer { - @Nullable - public View findViewById(@IdRes int id); - public boolean hasView(); -} - -/** * Container for fragments associated with an activity. */ final class FragmentManagerImpl extends FragmentManager implements LayoutInflater.Factory2 { @@ -430,7 +420,8 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate ArrayList<OnBackStackChangedListener> mBackStackChangeListeners; int mCurState = Fragment.INITIALIZING; - Activity mActivity; + FragmentHostCallback<?> mHost; + FragmentController mController; FragmentContainer mContainer; Fragment mParent; @@ -455,10 +446,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate Log.e(TAG, ex.getMessage()); LogWriter logw = new LogWriter(Log.ERROR, TAG); PrintWriter pw = new FastPrintWriter(logw, false, 1024); - if (mActivity != null) { + if (mHost != null) { Log.e(TAG, "Activity state:"); try { - mActivity.dump(" ", null, pw, new String[] { }); + mHost.onDump(" ", null, pw, new String[] { }); } catch (Exception e) { pw.flush(); Log.e(TAG, "Failed dumping state", e); @@ -490,7 +481,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate public void popBackStack() { enqueueAction(new Runnable() { @Override public void run() { - popBackStackState(mActivity.mHandler, null, -1, 0); + popBackStackState(mHost.getHandler(), null, -1, 0); } }, false); } @@ -499,14 +490,14 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate public boolean popBackStackImmediate() { checkStateLoss(); executePendingTransactions(); - return popBackStackState(mActivity.mHandler, null, -1, 0); + return popBackStackState(mHost.getHandler(), null, -1, 0); } @Override public void popBackStack(final String name, final int flags) { enqueueAction(new Runnable() { @Override public void run() { - popBackStackState(mActivity.mHandler, name, -1, flags); + popBackStackState(mHost.getHandler(), name, -1, flags); } }, false); } @@ -515,7 +506,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate public boolean popBackStackImmediate(String name, int flags) { checkStateLoss(); executePendingTransactions(); - return popBackStackState(mActivity.mHandler, name, -1, flags); + return popBackStackState(mHost.getHandler(), name, -1, flags); } @Override @@ -525,7 +516,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } enqueueAction(new Runnable() { @Override public void run() { - popBackStackState(mActivity.mHandler, null, id, flags); + popBackStackState(mHost.getHandler(), null, id, flags); } }, false); } @@ -537,7 +528,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (id < 0) { throw new IllegalArgumentException("Bad id: " + id); } - return popBackStackState(mActivity.mHandler, null, id, flags); + return popBackStackState(mHost.getHandler(), null, id, flags); } @Override @@ -619,7 +610,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (mParent != null) { DebugUtils.buildShortClassTag(mParent, sb); } else { - DebugUtils.buildShortClassTag(mActivity, sb); + DebugUtils.buildShortClassTag(mHost, sb); } sb.append("}}"); return sb.toString(); @@ -716,7 +707,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } writer.print(prefix); writer.println("FragmentManager misc state:"); - writer.print(prefix); writer.print(" mActivity="); writer.println(mActivity); + writer.print(prefix); writer.print(" mHost="); writer.println(mHost); writer.print(prefix); writer.print(" mContainer="); writer.println(mContainer); if (mParent != null) { writer.print(prefix); writer.print(" mParent="); writer.println(mParent); @@ -747,7 +738,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } if (fragment.mNextAnim != 0) { - Animator anim = AnimatorInflater.loadAnimator(mActivity, fragment.mNextAnim); + Animator anim = AnimatorInflater.loadAnimator(mHost.getContext(), fragment.mNextAnim); if (anim != null) { return anim; } @@ -762,14 +753,14 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate return null; } - if (transitionStyle == 0 && mActivity.getWindow() != null) { - transitionStyle = mActivity.getWindow().getAttributes().windowAnimations; + if (transitionStyle == 0 && mHost.onHasWindowAnimations()) { + transitionStyle = mHost.onGetWindowAnimations(); } if (transitionStyle == 0) { return null; } - TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle, + TypedArray attrs = mHost.getContext().obtainStyledAttributes(transitionStyle, com.android.internal.R.styleable.FragmentAnimation); int anim = attrs.getResourceId(styleIndex, 0); attrs.recycle(); @@ -778,7 +769,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate return null; } - return AnimatorInflater.loadAnimator(mActivity, anim); + return AnimatorInflater.loadAnimator(mHost.getContext(), anim); } public void performPendingDeferredStart(Fragment f) { @@ -848,18 +839,18 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } } - f.mActivity = mActivity; + f.mHost = mHost; f.mParentFragment = mParent; f.mFragmentManager = mParent != null - ? mParent.mChildFragmentManager : mActivity.mFragments; + ? mParent.mChildFragmentManager : mHost.getFragmentManagerImpl(); f.mCalled = false; - f.onAttach(mActivity); + mHost.onFragmentAttach(f); if (!f.mCalled) { throw new SuperNotCalledException("Fragment " + f + " did not call through to super.onAttach()"); } if (f.mParentFragment == null) { - mActivity.onAttachFragment(f); + mHost.onFragmentAttach(f); } if (!f.mRetaining) { @@ -884,7 +875,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (!f.mFromLayout) { ViewGroup container = null; if (f.mContainerId != 0) { - container = (ViewGroup)mContainer.findViewById(f.mContainerId); + container = (ViewGroup)mContainer.onFindViewById(f.mContainerId); if (container == null && !f.mRestored) { throwException(new IllegalArgumentException( "No view found for id 0x" @@ -954,7 +945,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (f.mView != null) { // Need to save the current view state if not // done already. - if (!mActivity.isFinishing() && f.mSavedViewState == null) { + if (!mHost.onShouldSaveFragmentState(f) && f.mSavedViewState == null) { saveFragmentViewState(f); } } @@ -1030,7 +1021,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (!f.mRetaining) { makeInactive(f); } else { - f.mActivity = null; + f.mHost = null; f.mParentFragment = null; f.mFragmentManager = null; f.mChildFragmentManager = null; @@ -1053,7 +1044,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } void moveToState(int newState, int transit, int transitStyle, boolean always) { - if (mActivity == null && newState != Fragment.INITIALIZING) { + if (mHost == null && newState != Fragment.INITIALIZING) { throw new IllegalStateException("No activity"); } @@ -1078,8 +1069,8 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate startPendingDeferredFragments(); } - if (mNeedMenuInvalidate && mActivity != null && mCurState == Fragment.RESUMED) { - mActivity.invalidateOptionsMenu(); + if (mNeedMenuInvalidate && mHost != null && mCurState == Fragment.RESUMED) { + mHost.onInvalidateOptionsMenu(); mNeedMenuInvalidate = false; } } @@ -1126,7 +1117,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate mAvailIndices = new ArrayList<Integer>(); } mAvailIndices.add(f.mIndex); - mActivity.invalidateFragment(f.mWho); + mHost.inactivateFragment(f.mWho); f.initState(); } @@ -1349,7 +1340,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate checkStateLoss(); } synchronized (this) { - if (mDestroyed || mActivity == null) { + if (mDestroyed || mHost == null) { throw new IllegalStateException("Activity has been destroyed"); } if (mPendingActions == null) { @@ -1357,8 +1348,8 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } mPendingActions.add(action); if (mPendingActions.size() == 1) { - mActivity.mHandler.removeCallbacks(mExecCommit); - mActivity.mHandler.post(mExecCommit); + mHost.getHandler().removeCallbacks(mExecCommit); + mHost.getHandler().post(mExecCommit); } } } @@ -1427,7 +1418,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate throw new IllegalStateException("Recursive entry to executePendingTransactions"); } - if (Looper.myLooper() != mActivity.mHandler.getLooper()) { + if (Looper.myLooper() != mHost.getHandler().getLooper()) { throw new IllegalStateException("Must be called from main thread of process"); } @@ -1447,7 +1438,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } mPendingActions.toArray(mTmpActions); mPendingActions.clear(); - mActivity.mHandler.removeCallbacks(mExecCommit); + mHost.getHandler().removeCallbacks(mExecCommit); } mExecutingActions = true; @@ -1737,7 +1728,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate return fms; } - void restoreAllState(Parcelable state, ArrayList<Fragment> nonConfig) { + void restoreAllState(Parcelable state, List<Fragment> nonConfig) { // If there is no saved state at all, then there can not be // any nonConfig fragments either, so that is that. if (state == null) return; @@ -1758,7 +1749,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate f.mAdded = false; f.mTarget = null; if (fs.mSavedFragmentState != null) { - fs.mSavedFragmentState.setClassLoader(mActivity.getClassLoader()); + fs.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader()); f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray( FragmentManagerImpl.VIEW_STATE_TAG); f.mSavedFragmentState = fs.mSavedFragmentState; @@ -1775,7 +1766,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate for (int i=0; i<fms.mActive.length; i++) { FragmentState fs = fms.mActive[i]; if (fs != null) { - Fragment f = fs.instantiate(mActivity, mParent); + Fragment f = fs.instantiate(mHost, mParent); if (DEBUG) Log.v(TAG, "restoreAllState: active #" + i + ": " + f); mActive.add(f); // Now that the fragment is instantiated (or came from being @@ -1851,9 +1842,10 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } - public void attachActivity(Activity activity, FragmentContainer container, Fragment parent) { - if (mActivity != null) throw new IllegalStateException("Already attached"); - mActivity = activity; + public void attachController(FragmentHostCallback<?> host, FragmentContainer container, + Fragment parent) { + if (mHost != null) throw new IllegalStateException("Already attached"); + mHost = host; mContainer = container; mParent = parent; } @@ -1898,7 +1890,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate mDestroyed = true; execPendingActions(); moveToState(Fragment.INITIALIZING, false); - mActivity = null; + mHost = null; mContainer = null; mParent = null; } @@ -2024,8 +2016,8 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate @Override public void invalidateOptionsMenu() { - if (mActivity != null && mCurState == Fragment.RESUMED) { - mActivity.invalidateOptionsMenu(); + if (mHost != null && mCurState == Fragment.RESUMED) { + mHost.onInvalidateOptionsMenu(); } else { mNeedMenuInvalidate = true; } @@ -2115,7 +2107,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate fragment.mTag = tag; fragment.mInLayout = true; fragment.mFragmentManager = this; - fragment.onInflate(mActivity, attrs, fragment.mSavedFragmentState); + mHost.onFragmentInflate(fragment, attrs, fragment.mSavedFragmentState); addFragment(fragment, true); } else if (fragment.mInLayout) { // A fragment already exists and it is not one we restored from @@ -2132,7 +2124,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate // from last saved state), then give it the attributes to // initialize itself. if (!fragment.mRetaining) { - fragment.onInflate(mActivity, attrs, fragment.mSavedFragmentState); + mHost.onFragmentInflate(fragment, attrs, fragment.mSavedFragmentState); } } |