Skip to content

Commit fae0d66

Browse files
Dianne HackbornAndroid (Google) Code Review
authored andcommitted
Merge "Nested fragments." into jb-mr1-dev
2 parents 6f7c139 + 62bea2f commit fae0d66

File tree

5 files changed

+425
-118
lines changed

5 files changed

+425
-118
lines changed

api/current.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3348,6 +3348,7 @@ package android.app {
33483348
method public final boolean equals(java.lang.Object);
33493349
method public final android.app.Activity getActivity();
33503350
method public final android.os.Bundle getArguments();
3351+
method public final android.app.FragmentManager getChildFragmentManager();
33513352
method public final android.app.FragmentManager getFragmentManager();
33523353
method public final int getId();
33533354
method public android.app.LoaderManager getLoaderManager();
@@ -3399,6 +3400,7 @@ package android.app {
33993400
method public void onStop();
34003401
method public void onTrimMemory(int);
34013402
method public void onViewCreated(android.view.View, android.os.Bundle);
3403+
method public void onViewStateRestored(android.os.Bundle);
34023404
method public void registerForContextMenu(android.view.View);
34033405
method public void setArguments(android.os.Bundle);
34043406
method public void setHasOptionsMenu(boolean);

core/java/android/app/Activity.java

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,9 @@ public class Activity extends ContextThemeWrapper
653653
/** Start of user-defined activity results. */
654654
public static final int RESULT_FIRST_USER = 1;
655655

656+
static final String FRAGMENTS_TAG = "android:fragments";
657+
656658
private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState";
657-
private static final String FRAGMENTS_TAG = "android:fragments";
658659
private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
659660
private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
660661
private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
@@ -697,7 +698,7 @@ static final class NonConfigurationInstances {
697698
Object activity;
698699
HashMap<String, Object> children;
699700
ArrayList<Fragment> fragments;
700-
SparseArray<LoaderManagerImpl> loaders;
701+
HashMap<String, LoaderManagerImpl> loaders;
701702
}
702703
/* package */ NonConfigurationInstances mLastNonConfigurationInstances;
703704

@@ -715,8 +716,14 @@ static final class NonConfigurationInstances {
715716
private int mTitleColor = 0;
716717

717718
final FragmentManagerImpl mFragments = new FragmentManagerImpl();
719+
final FragmentContainer mContainer = new FragmentContainer() {
720+
@Override
721+
public View findViewById(int id) {
722+
return Activity.this.findViewById(id);
723+
}
724+
};
718725

719-
SparseArray<LoaderManagerImpl> mAllLoaderManagers;
726+
HashMap<String, LoaderManagerImpl> mAllLoaderManagers;
720727
LoaderManagerImpl mLoaderManager;
721728

722729
private static final class ManagedCursor {
@@ -744,6 +751,7 @@ private static final class ManagedCursor {
744751

745752
protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
746753

754+
@SuppressWarnings("unused")
747755
private final Object mInstanceTracker = StrictMode.trackActivity(this);
748756

749757
private Thread mUiThread;
@@ -808,19 +816,19 @@ public LoaderManager getLoaderManager() {
808816
return mLoaderManager;
809817
}
810818
mCheckedForLoaderManager = true;
811-
mLoaderManager = getLoaderManager(-1, mLoadersStarted, true);
819+
mLoaderManager = getLoaderManager(null, mLoadersStarted, true);
812820
return mLoaderManager;
813821
}
814822

815-
LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) {
823+
LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) {
816824
if (mAllLoaderManagers == null) {
817-
mAllLoaderManagers = new SparseArray<LoaderManagerImpl>();
825+
mAllLoaderManagers = new HashMap<String, LoaderManagerImpl>();
818826
}
819-
LoaderManagerImpl lm = mAllLoaderManagers.get(index);
827+
LoaderManagerImpl lm = mAllLoaderManagers.get(who);
820828
if (lm == null) {
821829
if (create) {
822-
lm = new LoaderManagerImpl(this, started);
823-
mAllLoaderManagers.put(index, lm);
830+
lm = new LoaderManagerImpl(who, this, started);
831+
mAllLoaderManagers.put(who, lm);
824832
}
825833
} else {
826834
lm.updateActivity(this);
@@ -1025,7 +1033,7 @@ protected void onStart() {
10251033
if (mLoaderManager != null) {
10261034
mLoaderManager.doStart();
10271035
} else if (!mCheckedForLoaderManager) {
1028-
mLoaderManager = getLoaderManager(-1, mLoadersStarted, false);
1036+
mLoaderManager = getLoaderManager(null, mLoadersStarted, false);
10291037
}
10301038
mCheckedForLoaderManager = true;
10311039
}
@@ -1601,13 +1609,17 @@ NonConfigurationInstances retainNonConfigurationInstances() {
16011609
if (mAllLoaderManagers != null) {
16021610
// prune out any loader managers that were already stopped and so
16031611
// have nothing useful to retain.
1604-
for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
1605-
LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i);
1606-
if (lm.mRetaining) {
1607-
retainLoaders = true;
1608-
} else {
1609-
lm.doDestroy();
1610-
mAllLoaderManagers.removeAt(i);
1612+
LoaderManagerImpl loaders[] = new LoaderManagerImpl[mAllLoaderManagers.size()];
1613+
mAllLoaderManagers.values().toArray(loaders);
1614+
if (loaders != null) {
1615+
for (int i=0; i<loaders.length; i++) {
1616+
LoaderManagerImpl lm = loaders[i];
1617+
if (lm.mRetaining) {
1618+
retainLoaders = true;
1619+
} else {
1620+
lm.doDestroy();
1621+
mAllLoaderManagers.remove(lm.mWho);
1622+
}
16111623
}
16121624
}
16131625
}
@@ -1643,13 +1655,13 @@ public FragmentManager getFragmentManager() {
16431655
return mFragments;
16441656
}
16451657

1646-
void invalidateFragmentIndex(int index) {
1658+
void invalidateFragment(String who) {
16471659
//Log.v(TAG, "invalidateFragmentIndex: index=" + index);
16481660
if (mAllLoaderManagers != null) {
1649-
LoaderManagerImpl lm = mAllLoaderManagers.get(index);
1661+
LoaderManagerImpl lm = mAllLoaderManagers.get(who);
16501662
if (lm != null && !lm.mRetaining) {
16511663
lm.doDestroy();
1652-
mAllLoaderManagers.remove(index);
1664+
mAllLoaderManagers.remove(who);
16531665
}
16541666
}
16551667
}
@@ -4739,6 +4751,10 @@ public View onCreateView(View parent, String name, Context context, AttributeSet
47394751
* @param args additional arguments to the dump request.
47404752
*/
47414753
public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
4754+
dumpInner(prefix, fd, writer, args);
4755+
}
4756+
4757+
void dumpInner(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
47424758
writer.print(prefix); writer.print("Local Activity ");
47434759
writer.print(Integer.toHexString(System.identityHashCode(this)));
47444760
writer.println(" State:");
@@ -5019,7 +5035,7 @@ final void attach(Context context, ActivityThread aThread,
50195035
Configuration config) {
50205036
attachBaseContext(context);
50215037

5022-
mFragments.attachActivity(this);
5038+
mFragments.attachActivity(this, mContainer, null);
50235039

50245040
mWindow = PolicyManager.makeNewWindow(this);
50255041
mWindow.setCallback(this);
@@ -5080,10 +5096,14 @@ final void performStart() {
50805096
}
50815097
mFragments.dispatchStart();
50825098
if (mAllLoaderManagers != null) {
5083-
for (int i=mAllLoaderManagers.size()-1; i>=0; i--) {
5084-
LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i);
5085-
lm.finishRetain();
5086-
lm.doReportStart();
5099+
LoaderManagerImpl loaders[] = new LoaderManagerImpl[mAllLoaderManagers.size()];
5100+
mAllLoaderManagers.values().toArray(loaders);
5101+
if (loaders != null) {
5102+
for (int i=0; i<loaders.length; i++) {
5103+
LoaderManagerImpl lm = loaders[i];
5104+
lm.finishRetain();
5105+
lm.doReportStart();
5106+
}
50875107
}
50885108
}
50895109
}

0 commit comments

Comments
 (0)