summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/FragmentManager.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2011-10-26 10:22:16 -0700
committerAdam Powell <adamp@google.com>2011-10-27 15:54:51 -0700
commit635c60af623c73d2409f5729c0953638b5d6c497 (patch)
tree68764f2f1896dfe647f7a19a1bedf0bf55c7a564 /core/java/android/app/FragmentManager.java
parent6e03b22015bd834da1a5755e75d7468e5b3b13c5 (diff)
downloadframeworks_base-635c60af623c73d2409f5729c0953638b5d6c497.zip
frameworks_base-635c60af623c73d2409f5729c0953638b5d6c497.tar.gz
frameworks_base-635c60af623c73d2409f5729c0953638b5d6c497.tar.bz2
Add API for deferring fragment start.
Fragments now have the setDeferStart method to signal that a fragment has lower priority than others. Deferred start fragments will not always be started immediately; they will be started once any loaders have finished servicing any outstanding requests. This is useful if any attached fragments are not immediately visible and can wait to start until later. Disabling deferStart on a fragment that is waiting for a deferred start will start it immediately. Start. Change-Id: Ia1f004877ca5e88d4f10147d21c7e2e97f141c34
Diffstat (limited to 'core/java/android/app/FragmentManager.java')
-rw-r--r--core/java/android/app/FragmentManager.java29
1 files changed, 28 insertions, 1 deletions
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 3da4f29..58cd27c 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -709,6 +709,13 @@ final class FragmentManagerImpl extends FragmentManager {
return AnimatorInflater.loadAnimator(mActivity, anim);
}
+ public void performPendingDeferredStart(Fragment f) {
+ if (f.mDeferStart) {
+ f.mDeferStart = false;
+ moveToState(f, mCurState, 0, 0);
+ }
+ }
+
void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
// Fragments that are not currently added will sit in the onCreate() state.
if (!f.mAdded && newState > Fragment.CREATED) {
@@ -718,7 +725,10 @@ final class FragmentManagerImpl extends FragmentManager {
// While removing a fragment, we can't change it to a higher state.
newState = f.mState;
}
-
+ // Defer start if requested; don't allow it to move to STARTED or higher.
+ if (f.mDeferStart && newState > Fragment.STOPPED) {
+ newState = Fragment.STOPPED;
+ }
if (f.mState < newState) {
// For fragments that are created from a layout, when restoring from
// state we don't want to allow them to be created until they are
@@ -992,13 +1002,21 @@ final class FragmentManagerImpl extends FragmentManager {
mCurState = newState;
if (mActive != null) {
+ boolean loadersRunning = false;
for (int i=0; i<mActive.size(); i++) {
Fragment f = mActive.get(i);
if (f != null) {
moveToState(f, newState, transit, transitStyle);
+ if (f.mLoaderManager != null) {
+ loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+ }
}
}
+ if (!loadersRunning) {
+ startPendingDeferredFragments();
+ }
+
if (mNeedMenuInvalidate && mActivity != null && mCurState == Fragment.RESUMED) {
mActivity.invalidateOptionsMenu();
mNeedMenuInvalidate = false;
@@ -1006,6 +1024,15 @@ final class FragmentManagerImpl extends FragmentManager {
}
}
+ void startPendingDeferredFragments() {
+ for (int i=0; i<mActive.size(); i++) {
+ Fragment f = mActive.get(i);
+ if (f != null) {
+ performPendingDeferredStart(f);
+ }
+ }
+ }
+
void makeActive(Fragment f) {
if (f.mIndex >= 0) {
return;