From: notaz Date: Sat, 16 Jun 2012 15:54:49 +0000 (+0300) Subject: enable cyanogenmod stuff X-Git-Tag: r5~1 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86591c820f761cc27e31f78790c5a447b8411a33;p=android_pandora.git enable cyanogenmod stuff this also allows dropping oi-filemanager as it comes from cyanogenmod too --- diff --git a/apps/AndroidSupportV2/.classpath b/apps/AndroidSupportV2/.classpath deleted file mode 100644 index 10aa9b6..0000000 --- a/apps/AndroidSupportV2/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/AndroidSupportV2/.project b/apps/AndroidSupportV2/.project deleted file mode 100644 index ec456d9..0000000 --- a/apps/AndroidSupportV2/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - AndroidSupportV2 - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/apps/AndroidSupportV2/Android.mk b/apps/AndroidSupportV2/Android.mk deleted file mode 100644 index 349e282..0000000 --- a/apps/AndroidSupportV2/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_MODULE := AndroidSupportV2 -LOCAL_SDK_VERSION := current - - -include $(BUILD_STATIC_JAVA_LIBRARY) - -# Use the following include to make our test apk. -include $(call all-makefiles-under,$(LOCAL_PATH)) - - diff --git a/apps/AndroidSupportV2/AndroidManifest.xml b/apps/AndroidSupportV2/AndroidManifest.xml deleted file mode 100644 index 7b08835..0000000 --- a/apps/AndroidSupportV2/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/apps/AndroidSupportV2/default.properties b/apps/AndroidSupportV2/default.properties deleted file mode 100644 index 2ba8b4c..0000000 --- a/apps/AndroidSupportV2/default.properties +++ /dev/null @@ -1,12 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-11 -android.library=true diff --git a/apps/AndroidSupportV2/honeycomb/android/support/v2/app/ActivityCompatHoneycomb.java b/apps/AndroidSupportV2/honeycomb/android/support/v2/app/ActivityCompatHoneycomb.java deleted file mode 100644 index 0ade8cc..0000000 --- a/apps/AndroidSupportV2/honeycomb/android/support/v2/app/ActivityCompatHoneycomb.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.app.Activity; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * Implementation of activity compatibility that can call Honeycomb APIs. - */ -class ActivityCompatHoneycomb { - static void invalidateOptionsMenu(Activity activity) { - activity.invalidateOptionsMenu(); - } - - static void dump(Activity activity, String prefix, FileDescriptor fd, - PrintWriter writer, String[] args) { - activity.dump(prefix, fd, writer, args); - } -} diff --git a/apps/AndroidSupportV2/honeycomb/android/support/v2/view/MenuCompatHoneycomb.java b/apps/AndroidSupportV2/honeycomb/android/support/v2/view/MenuCompatHoneycomb.java deleted file mode 100644 index fe35f7d..0000000 --- a/apps/AndroidSupportV2/honeycomb/android/support/v2/view/MenuCompatHoneycomb.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.view; - -import android.view.MenuItem; - -/** - * Implementation of menu compatibility that can call Honeycomb APIs. - */ -class MenuCompatHoneycomb { - public static void setShowAsAction(MenuItem item, int actionEnum) { - item.setShowAsAction(actionEnum); - } -} diff --git a/apps/AndroidSupportV2/proguard.cfg b/apps/AndroidSupportV2/proguard.cfg deleted file mode 100644 index 12dd039..0000000 --- a/apps/AndroidSupportV2/proguard.cfg +++ /dev/null @@ -1,36 +0,0 @@ --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontpreverify --verbose --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService - --keepclasseswithmembernames class * { - native ; -} - --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet); -} - --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet, int); -} - --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} diff --git a/apps/AndroidSupportV2/readme.txt b/apps/AndroidSupportV2/readme.txt deleted file mode 100644 index 12e02b2..0000000 --- a/apps/AndroidSupportV2/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -Compatibility Libraries for Android. - - -This SDK component contains static libraries providing access to newer APIs - -on older platforms. To use those libraries, simply copy them as static libraries - -into your project. - - -"v2" provides support for using new APIs on Android API 2 (1.1) and above. - - -The code is based on "Android Compatibility package, revision 2". - -The following modifications have been introduced: -* android.support.v2.os.Build.VERSION has been added, to support integer SDK_INT - on all platform versions (native support starts on Android API 4 - 1.6) -* SDK_INT has been replaced by the v2 compatible version in: - - app.FragmentActivity - - app.FragmentManager - - view.MenuCompat - -All modifications are prepended by the original line, commented out as "//v4". diff --git a/apps/AndroidSupportV2/src/android/support/v2/app/BackStackRecord.java b/apps/AndroidSupportV2/src/android/support/v2/app/BackStackRecord.java deleted file mode 100644 index e3b1f4f..0000000 --- a/apps/AndroidSupportV2/src/android/support/v2/app/BackStackRecord.java +++ /dev/null @@ -1,664 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.Log; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; - -final class BackStackState implements Parcelable { - final int[] mOps; - final int mTransition; - final int mTransitionStyle; - final String mName; - final int mIndex; - final int mBreadCrumbTitleRes; - final CharSequence mBreadCrumbTitleText; - final int mBreadCrumbShortTitleRes; - final CharSequence mBreadCrumbShortTitleText; - - public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) { - int numRemoved = 0; - BackStackRecord.Op op = bse.mHead; - while (op != null) { - if (op.removed != null) numRemoved += op.removed.size(); - op = op.next; - } - mOps = new int[bse.mNumOp*5 + numRemoved]; - - if (!bse.mAddToBackStack) { - throw new IllegalStateException("Not on back stack"); - } - - op = bse.mHead; - int pos = 0; - while (op != null) { - mOps[pos++] = op.cmd; - mOps[pos++] = op.fragment.mIndex; - mOps[pos++] = op.enterAnim; - mOps[pos++] = op.exitAnim; - if (op.removed != null) { - final int N = op.removed.size(); - mOps[pos++] = N; - for (int i=0; i 0) { - op.removed = new ArrayList(N); - for (int i=0; i CREATOR - = new Parcelable.Creator() { - public BackStackState createFromParcel(Parcel in) { - return new BackStackState(in); - } - - public BackStackState[] newArray(int size) { - return new BackStackState[size]; - } - }; -} - -/** - * @hide Entry of an operation on the fragment back stack. - */ -final class BackStackRecord extends FragmentTransaction implements - FragmentManager.BackStackEntry, Runnable { - static final String TAG = "BackStackEntry"; - - final FragmentManagerImpl mManager; - - static final int OP_NULL = 0; - static final int OP_ADD = 1; - static final int OP_REPLACE = 2; - static final int OP_REMOVE = 3; - static final int OP_HIDE = 4; - static final int OP_SHOW = 5; - - static final class Op { - Op next; - Op prev; - int cmd; - Fragment fragment; - int enterAnim; - int exitAnim; - ArrayList removed; - } - - Op mHead; - Op mTail; - int mNumOp; - int mEnterAnim; - int mExitAnim; - int mTransition; - int mTransitionStyle; - boolean mAddToBackStack; - boolean mAllowAddToBackStack = true; - String mName; - boolean mCommitted; - int mIndex; - - int mBreadCrumbTitleRes; - CharSequence mBreadCrumbTitleText; - int mBreadCrumbShortTitleRes; - CharSequence mBreadCrumbShortTitleText; - - public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { - writer.print(prefix); writer.print("mName="); writer.print(mName); - writer.print(" mIndex="); writer.print(mIndex); - writer.print(" mCommitted="); writer.println(mCommitted); - if (mTransition != FragmentTransaction.TRANSIT_NONE) { - writer.print(prefix); writer.print("mTransition=#"); - writer.print(Integer.toHexString(mTransition)); - writer.print(" mTransitionStyle=#"); - writer.println(Integer.toHexString(mTransitionStyle)); - } - if (mEnterAnim != 0 || mExitAnim !=0) { - writer.print(prefix); writer.print("mEnterAnim=#"); - writer.print(Integer.toHexString(mEnterAnim)); - writer.print(" mExitAnim=#"); - writer.println(Integer.toHexString(mExitAnim)); - } - if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) { - writer.print(prefix); writer.print("mBreadCrumbTitleRes=#"); - writer.print(Integer.toHexString(mBreadCrumbTitleRes)); - writer.print(" mBreadCrumbTitleText="); - writer.println(mBreadCrumbTitleText); - } - if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) { - writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#"); - writer.print(Integer.toHexString(mBreadCrumbShortTitleRes)); - writer.print(" mBreadCrumbShortTitleText="); - writer.println(mBreadCrumbShortTitleText); - } - - if (mHead != null) { - writer.print(prefix); writer.println("Operations:"); - String innerPrefix = prefix + " "; - Op op = mHead; - int num = 0; - while (op != null) { - writer.print(prefix); writer.print(" Op #"); writer.print(num); - writer.println(":"); - writer.print(innerPrefix); writer.print("cmd="); writer.print(op.cmd); - writer.print(" fragment="); writer.println(op.fragment); - if (op.enterAnim != 0 || op.exitAnim != 0) { - writer.print(prefix); writer.print("enterAnim="); writer.print(op.enterAnim); - writer.print(" exitAnim="); writer.println(op.exitAnim); - } - if (op.removed != null && op.removed.size() > 0) { - for (int i=0; i=0; i--) { - Fragment r = op.removed.get(i); - r.mBackStackNesting += amt; - if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of " - + r + " to " + r.mBackStackNesting); - } - } - op = op.next; - } - } - - public int commit() { - return commitInternal(false); - } - - public int commitAllowingStateLoss() { - return commitInternal(true); - } - - int commitInternal(boolean allowStateLoss) { - if (mCommitted) throw new IllegalStateException("commit already called"); - if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Commit: " + this); - mCommitted = true; - if (mAddToBackStack) { - mIndex = mManager.allocBackStackIndex(this); - } else { - mIndex = -1; - } - mManager.enqueueAction(this, allowStateLoss); - return mIndex; - } - - public void run() { - if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this); - - if (mAddToBackStack) { - if (mIndex < 0) { - throw new IllegalStateException("addToBackStack() called after commit()"); - } - } - - bumpBackStackNesting(1); - - Op op = mHead; - while (op != null) { - switch (op.cmd) { - case OP_ADD: { - Fragment f = op.fragment; - f.mNextAnim = op.enterAnim; - mManager.addFragment(f, false); - } break; - case OP_REPLACE: { - Fragment f = op.fragment; - if (mManager.mAdded != null) { - for (int i=0; i= 0) { - mManager.freeBackStackIndex(mIndex); - mIndex = -1; - } - } - - public String getName() { - return mName; - } - - public int getTransition() { - return mTransition; - } - - public int getTransitionStyle() { - return mTransitionStyle; - } - - public boolean isEmpty() { - return mNumOp == 0; - } -} diff --git a/apps/AndroidSupportV2/src/android/support/v2/app/DialogFragment.java b/apps/AndroidSupportV2/src/android/support/v2/app/DialogFragment.java deleted file mode 100644 index 81a57fc..0000000 --- a/apps/AndroidSupportV2/src/android/support/v2/app/DialogFragment.java +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; - -/** - * Static library support version of the framework's {@link android.app.DialogFragment}. - * Used to write apps that run on platforms prior to Android 3.0. When running - * on Android 3.0 or above, this implementation is still used; it does not try - * to switch to the framework's implementation. See the framework SDK - * documentation for a class overview. - */ -public class DialogFragment extends Fragment - implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { - - /** - * Style for {@link #setStyle(int, int)}: a basic, - * normal dialog. - */ - public static final int STYLE_NORMAL = 0; - - /** - * Style for {@link #setStyle(int, int)}: don't include - * a title area. - */ - public static final int STYLE_NO_TITLE = 1; - - /** - * Style for {@link #setStyle(int, int)}: don't draw - * any frame at all; the view hierarchy returned by {@link #onCreateView} - * is entirely responsible for drawing the dialog. - */ - public static final int STYLE_NO_FRAME = 2; - - /** - * Style for {@link #setStyle(int, int)}: like - * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog. - * The user can not touch it, and its window will not receive input focus. - */ - public static final int STYLE_NO_INPUT = 3; - - private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState"; - private static final String SAVED_STYLE = "android:style"; - private static final String SAVED_THEME = "android:theme"; - private static final String SAVED_CANCELABLE = "android:cancelable"; - private static final String SAVED_SHOWS_DIALOG = "android:showsDialog"; - private static final String SAVED_BACK_STACK_ID = "android:backStackId"; - - int mStyle = STYLE_NORMAL; - int mTheme = 0; - boolean mCancelable = true; - boolean mShowsDialog = true; - int mBackStackId = -1; - - Dialog mDialog; - boolean mDestroyed; - boolean mRemoved; - - public DialogFragment() { - } - - /** - * Call to customize the basic appearance and behavior of the - * fragment's dialog. This can be used for some common dialog behaviors, - * taking care of selecting flags, theme, and other options for you. The - * same effect can be achieve by manually setting Dialog and Window - * attributes yourself. Calling this after the fragment's Dialog is - * created will have no effect. - * - * @param style Selects a standard style: may be {@link #STYLE_NORMAL}, - * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or - * {@link #STYLE_NO_INPUT}. - * @param theme Optional custom theme. If 0, an appropriate theme (based - * on the style) will be selected for you. - */ - public void setStyle(int style, int theme) { - mStyle = style; - if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) { - mTheme = android.R.style.Theme_Panel; - } - if (theme != 0) { - mTheme = theme; - } - } - - /** - * Display the dialog, adding the fragment to the given FragmentManager. This - * is a convenience for explicitly creating a transaction, adding the - * fragment to it with the given tag, and committing it. This does - * not add the transaction to the back stack. When the fragment - * is dismissed, a new transaction will be executed to remove it from - * the activity. - * @param manager The FragmentManager this fragment will be added to. - * @param tag The tag for this fragment, as per - * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. - */ - public void show(FragmentManager manager, String tag) { - FragmentTransaction ft = manager.beginTransaction(); - ft.add(this, tag); - ft.commit(); - } - - /** - * Display the dialog, adding the fragment using an existing transaction - * and then committing the transaction. - * @param transaction An existing transaction in which to add the fragment. - * @param tag The tag for this fragment, as per - * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}. - * @return Returns the identifier of the committed transaction, as per - * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. - */ - public int show(FragmentTransaction transaction, String tag) { - transaction.add(this, tag); - mRemoved = false; - mBackStackId = transaction.commit(); - return mBackStackId; - } - - /** - * Dismiss the fragment and its dialog. If the fragment was added to the - * back stack, all back stack state up to and including this entry will - * be popped. Otherwise, a new transaction will be committed to remove - * the fragment. - */ - public void dismiss() { - dismissInternal(false); - } - - void dismissInternal(boolean allowStateLoss) { - if (mDialog != null) { - mDialog.dismiss(); - mDialog = null; - } - mRemoved = true; - if (mBackStackId >= 0) { - getFragmentManager().popBackStack(mBackStackId, - FragmentManager.POP_BACK_STACK_INCLUSIVE); - mBackStackId = -1; - } else { - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.remove(this); - if (allowStateLoss) { - ft.commitAllowingStateLoss(); - } else { - ft.commit(); - } - } - } - - public Dialog getDialog() { - return mDialog; - } - - public int getTheme() { - return mTheme; - } - - /** - * Control whether the shown Dialog is cancelable. Use this instead of - * directly calling {@link Dialog#setCancelable(boolean) - * Dialog.setCancelable(boolean)}, because DialogFragment needs to change - * its behavior based on this. - * - * @param cancelable If true, the dialog is cancelable. The default - * is true. - */ - public void setCancelable(boolean cancelable) { - mCancelable = cancelable; - if (mDialog != null) mDialog.setCancelable(cancelable); - } - - /** - * Return the current value of {@link #setCancelable(boolean)}. - */ - public boolean isCancelable() { - return mCancelable; - } - - /** - * Controls whether this fragment should be shown in a dialog. If not - * set, no Dialog will be created in {@link #onActivityCreated(Bundle)}, - * and the fragment's view hierarchy will thus not be added to it. This - * allows you to instead use it as a normal fragment (embedded inside of - * its activity). - * - *

This is normally set for you based on whether the fragment is - * associated with a container view ID passed to - * {@link FragmentTransaction#add(int, Fragment) FragmentTransaction.add(int, Fragment)}. - * If the fragment was added with a container, setShowsDialog will be - * initialized to false; otherwise, it will be true. - * - * @param showsDialog If true, the fragment will be displayed in a Dialog. - * If false, no Dialog will be created and the fragment's view hierarchly - * left undisturbed. - */ - public void setShowsDialog(boolean showsDialog) { - mShowsDialog = showsDialog; - } - - /** - * Return the current value of {@link #setShowsDialog(boolean)}. - */ - public boolean getShowsDialog() { - return mShowsDialog; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mShowsDialog = mContainerId == 0; - - if (savedInstanceState != null) { - mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL); - mTheme = savedInstanceState.getInt(SAVED_THEME, 0); - mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true); - mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); - mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1); - } - - } - - /** @hide */ - @Override - public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { - if (!mShowsDialog) { - return super.getLayoutInflater(savedInstanceState); - } - - mDialog = onCreateDialog(savedInstanceState); - mDestroyed = false; - switch (mStyle) { - case STYLE_NO_INPUT: - mDialog.getWindow().addFlags( - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | - WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); - // fall through... - case STYLE_NO_FRAME: - case STYLE_NO_TITLE: - mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - } - return (LayoutInflater)mDialog.getContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - } - - /** - * Override to build your own custom Dialog container. This is typically - * used to show an AlertDialog instead of a generic Dialog; when doing so, - * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} does not need - * to be implemented since the AlertDialog takes care of its own content. - * - *

This method will be called after {@link #onCreate(Bundle)} and - * before {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. The - * default implementation simply instantiates and returns a {@link Dialog} - * class. - * - *

Note: DialogFragment own the {@link Dialog#setOnCancelListener - * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener - * Dialog.setOnDismissListener} callbacks. You must not set them yourself. - * To find out about these events, override {@link #onCancel(DialogInterface)} - * and {@link #onDismiss(DialogInterface)}.

- * - * @param savedInstanceState The last saved instance state of the Fragment, - * or null if this is a freshly created Fragment. - * - * @return Return a new Dialog instance to be displayed by the Fragment. - */ - public Dialog onCreateDialog(Bundle savedInstanceState) { - return new Dialog(getActivity(), getTheme()); - } - - public void onCancel(DialogInterface dialog) { - } - - public void onDismiss(DialogInterface dialog) { - if (!mRemoved) { - // Note: we need to use allowStateLoss, because the dialog - // dispatches this asynchronously so we can receive the call - // after the activity is paused. Worst case, when the user comes - // back to the activity they see the dialog again. - dismissInternal(true); - } - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - if (!mShowsDialog) { - return; - } - - View view = getView(); - if (view != null) { - if (view.getParent() != null) { - throw new IllegalStateException("DialogFragment can not be attached to a container view"); - } - mDialog.setContentView(view); - } - mDialog.setOwnerActivity(getActivity()); - mDialog.setCancelable(mCancelable); - mDialog.setOnCancelListener(this); - mDialog.setOnDismissListener(this); - if (savedInstanceState != null) { - Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG); - if (dialogState != null) { - mDialog.onRestoreInstanceState(dialogState); - } - } - } - - @Override - public void onStart() { - super.onStart(); - if (mDialog != null) { - mRemoved = false; - mDialog.show(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mDialog != null) { - Bundle dialogState = mDialog.onSaveInstanceState(); - if (dialogState != null) { - outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState); - } - } - if (mStyle != STYLE_NORMAL) { - outState.putInt(SAVED_STYLE, mStyle); - } - if (mTheme != 0) { - outState.putInt(SAVED_THEME, mTheme); - } - if (!mCancelable) { - outState.putBoolean(SAVED_CANCELABLE, mCancelable); - } - if (!mShowsDialog) { - outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog); - } - if (mBackStackId != -1) { - outState.putInt(SAVED_BACK_STACK_ID, mBackStackId); - } - } - - @Override - public void onStop() { - super.onStop(); - if (mDialog != null) { - mDialog.hide(); - } - } - - /** - * Remove dialog. - */ - @Override - public void onDestroyView() { - super.onDestroyView(); - mDestroyed = true; - if (mDialog != null) { - // Set removed here because this dismissal is just to hide - // the dialog -- we don't want this to cause the fragment to - // actually be removed. - mRemoved = true; - mDialog.dismiss(); - mDialog = null; - } - } -} diff --git a/apps/AndroidSupportV2/src/android/support/v2/app/Fragment.java b/apps/AndroidSupportV2/src/android/support/v2/app/Fragment.java deleted file mode 100644 index 185eb14..0000000 --- a/apps/AndroidSupportV2/src/android/support/v2/app/Fragment.java +++ /dev/null @@ -1,1180 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.app.Activity; -import android.content.ComponentCallbacks; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v2.util.DebugUtils; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.ContextMenu; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.View.OnCreateContextMenuListener; -import android.view.animation.Animation; -import android.widget.AdapterView; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.HashMap; - -final class FragmentState implements Parcelable { - final String mClassName; - final int mIndex; - final boolean mFromLayout; - final int mFragmentId; - final int mContainerId; - final String mTag; - final boolean mRetainInstance; - final Bundle mArguments; - - Bundle mSavedFragmentState; - - Fragment mInstance; - - public FragmentState(Fragment frag) { - mClassName = frag.getClass().getName(); - mIndex = frag.mIndex; - mFromLayout = frag.mFromLayout; - mFragmentId = frag.mFragmentId; - mContainerId = frag.mContainerId; - mTag = frag.mTag; - mRetainInstance = frag.mRetainInstance; - mArguments = frag.mArguments; - } - - public FragmentState(Parcel in) { - mClassName = in.readString(); - mIndex = in.readInt(); - mFromLayout = in.readInt() != 0; - mFragmentId = in.readInt(); - mContainerId = in.readInt(); - mTag = in.readString(); - mRetainInstance = in.readInt() != 0; - mArguments = in.readBundle(); - mSavedFragmentState = in.readBundle(); - } - - public Fragment instantiate(FragmentActivity activity) { - if (mInstance != null) { - return mInstance; - } - - if (mArguments != null) { - mArguments.setClassLoader(activity.getClassLoader()); - } - - mInstance = Fragment.instantiate(activity, mClassName, mArguments); - - if (mSavedFragmentState != null) { - mSavedFragmentState.setClassLoader(activity.getClassLoader()); - mInstance.mSavedFragmentState = mSavedFragmentState; - } - mInstance.setIndex(mIndex); - mInstance.mFromLayout = mFromLayout; - mInstance.mRestored = true; - mInstance.mFragmentId = mFragmentId; - mInstance.mContainerId = mContainerId; - mInstance.mTag = mTag; - mInstance.mRetainInstance = mRetainInstance; - mInstance.mFragmentManager = activity.mFragments; - - return mInstance; - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mClassName); - dest.writeInt(mIndex); - dest.writeInt(mFromLayout ? 1 : 0); - dest.writeInt(mFragmentId); - dest.writeInt(mContainerId); - dest.writeString(mTag); - dest.writeInt(mRetainInstance ? 1 : 0); - dest.writeBundle(mArguments); - dest.writeBundle(mSavedFragmentState); - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public FragmentState createFromParcel(Parcel in) { - return new FragmentState(in); - } - - public FragmentState[] newArray(int size) { - return new FragmentState[size]; - } - }; -} - -/** - * Static library support version of the framework's {@link android.app.Fragment}. - * Used to write apps that run on platforms prior to Android 3.0. When running - * on Android 3.0 or above, this implementation is still used; it does not try - * to switch to the framework's implementation. See the framework SDK - * documentation for a class overview. - */ -public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener { - private static final HashMap> sClassMap = - new HashMap>(); - - static final int INITIALIZING = 0; // Not yet created. - static final int CREATED = 1; // Created. - static final int ACTIVITY_CREATED = 2; // The activity has finished its creation. - static final int STARTED = 3; // Created and started, not resumed. - static final int RESUMED = 4; // Created started and resumed. - - int mState = INITIALIZING; - - // Non-null if the fragment's view hierarchy is currently animating away, - // meaning we need to wait a bit on completely destroying it. This is the - // view that is animating. - View mAnimatingAway; - - // If mAnimatingAway != null, this is the state we should move to once the - // animation is done. - int mStateAfterAnimating; - - // When instantiated from saved state, this is the saved state. - Bundle mSavedFragmentState; - SparseArray mSavedViewState; - - // Index into active fragment array. - int mIndex = -1; - - // Internal unique name for this fragment; - String mWho; - - // Construction arguments; - Bundle mArguments; - - // Target fragment. - Fragment mTarget; - - // Target request code. - int mTargetRequestCode; - - // True if the fragment is in the list of added fragments. - boolean mAdded; - - // If set this fragment is being removed from its activity. - boolean mRemoving; - - // True if the fragment is in the resumed state. - boolean mResumed; - - // Set to true if this fragment was instantiated from a layout file. - boolean mFromLayout; - - // Set to true when the view has actually been inflated in its layout. - boolean mInLayout; - - // True if this fragment has been restored from previously saved state. - boolean mRestored; - - // Number of active back stack entries this fragment is in. - int mBackStackNesting; - - // The fragment manager we are associated with. Set as soon as the - // fragment is used in a transaction; cleared after it has been removed - // from all transactions. - FragmentManager mFragmentManager; - - // Set as soon as a fragment is added to a transaction (or removed), - // to be able to do validation. - FragmentActivity mImmediateActivity; - - // Activity this fragment is attached to. - FragmentActivity mActivity; - - // The optional identifier for this fragment -- either the container ID if it - // was dynamically added to the view hierarchy, or the ID supplied in - // layout. - int mFragmentId; - - // When a fragment is being dynamically added to the view hierarchy, this - // is the identifier of the parent container it is being added to. - int mContainerId; - - // The optional named tag for this fragment -- usually used to find - // fragments that are not part of the layout. - String mTag; - - // Set to true when the app has requested that this fragment be hidden - // from the user. - boolean mHidden; - - // If set this fragment would like its instance retained across - // configuration changes. - boolean mRetainInstance; - - // If set this fragment is being retained across the current config change. - boolean mRetaining; - - // If set this fragment has menu items to contribute. - boolean mHasMenu; - - // Used to verify that subclasses call through to super class. - boolean mCalled; - - // If app has requested a specific animation, this is the one to use. - int mNextAnim; - - // The parent container of the fragment after dynamically added to UI. - ViewGroup mContainer; - - // The View generated for this fragment. - View mView; - - // The real inner view that will save/restore state. - View mInnerView; - - LoaderManagerImpl mLoaderManager; - boolean mLoadersStarted; - boolean mCheckedForLoaderManager; - - /** - * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when - * there is an instantiation failure. - */ - static public class InstantiationException extends RuntimeException { - public InstantiationException(String msg, Exception cause) { - super(msg, cause); - } - } - - /** - * Default constructor. Every fragment must have an - * empty constructor, so it can be instantiated when restoring its - * activity's state. It is strongly recommended that subclasses do not - * have other constructors with parameters, since these constructors - * will not be called when the fragment is re-instantiated; instead, - * arguments can be supplied by the caller with {@link #setArguments} - * and later retrieved by the Fragment with {@link #getArguments}. - * - *

Applications should generally not implement a constructor. The - * first place application code an run where the fragment is ready to - * be used is in {@link #onAttach(Activity)}, the point where the fragment - * is actually associated with its activity. Some applications may also - * want to implement {@link #onInflate} to retrieve attributes from a - * layout resource, though should take care here because this happens for - * the fragment is attached to its activity. - */ - public Fragment() { - } - - /** - * Like {@link #instantiate(Context, String, Bundle)} but with a null - * argument Bundle. - */ - public static Fragment instantiate(Context context, String fname) { - return instantiate(context, fname, null); - } - - /** - * Create a new instance of a Fragment with the given class name. This is - * the same as calling its empty constructor. - * - * @param context The calling context being used to instantiate the fragment. - * This is currently just used to get its ClassLoader. - * @param fname The class name of the fragment to instantiate. - * @param args Bundle of arguments to supply to the fragment, which it - * can retrieve with {@link #getArguments()}. May be null. - * @return Returns a new fragment instance. - * @throws InstantiationException If there is a failure in instantiating - * the given fragment class. This is a runtime exception; it is not - * normally expected to happen. - */ - public static Fragment instantiate(Context context, String fname, Bundle args) { - try { - Class clazz = sClassMap.get(fname); - if (clazz == null) { - // Class not found in the cache, see if it's real, and try to add it - clazz = context.getClassLoader().loadClass(fname); - sClassMap.put(fname, clazz); - } - Fragment f = (Fragment)clazz.newInstance(); - if (args != null) { - args.setClassLoader(f.getClass().getClassLoader()); - f.mArguments = args; - } - return f; - } catch (ClassNotFoundException e) { - throw new InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } catch (java.lang.InstantiationException e) { - throw new InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } catch (IllegalAccessException e) { - throw new InstantiationException("Unable to instantiate fragment " + fname - + ": make sure class name exists, is public, and has an" - + " empty constructor that is public", e); - } - } - - void restoreViewState() { - if (mSavedViewState != null) { - mInnerView.restoreHierarchyState(mSavedViewState); - mSavedViewState = null; - } - } - - void setIndex(int index) { - mIndex = index; - mWho = "android:fragment:" + mIndex; - } - - void clearIndex() { - mIndex = -1; - mWho = null; - } - - /** - * Subclasses can not override equals(). - */ - @Override final public boolean equals(Object o) { - return super.equals(o); - } - - /** - * Subclasses can not override hashCode(). - */ - @Override final public int hashCode() { - return super.hashCode(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(128); - DebugUtils.buildShortClassTag(this, sb); - if (mIndex >= 0) { - sb.append(" #"); - sb.append(mIndex); - } - if (mFragmentId != 0) { - sb.append(" id=0x"); - sb.append(Integer.toHexString(mFragmentId)); - } - if (mTag != null) { - sb.append(" "); - sb.append(mTag); - } - sb.append('}'); - return sb.toString(); - } - - /** - * Return the identifier this fragment is known by. This is either - * the android:id value supplied in a layout or the container view ID - * supplied when adding the fragment. - */ - final public int getId() { - return mFragmentId; - } - - /** - * Get the tag name of the fragment, if specified. - */ - final public String getTag() { - return mTag; - } - - /** - * Supply the construction arguments for this fragment. This can only - * be called before the fragment has been attached to its activity; that - * is, you should call it immediately after constructing the fragment. The - * arguments supplied here will be retained across fragment destroy and - * creation. - */ - public void setArguments(Bundle args) { - if (mIndex >= 0) { - throw new IllegalStateException("Fragment already active"); - } - mArguments = args; - } - - /** - * Return the arguments supplied when the fragment was instantiated, - * if any. - */ - final public Bundle getArguments() { - return mArguments; - } - - /** - * Optional target for this fragment. This may be used, for example, - * if this fragment is being started by another, and when done wants to - * give a result back to the first. The target set here is retained - * across instances via {@link FragmentManager#putFragment - * FragmentManager.putFragment()}. - * - * @param fragment The fragment that is the target of this one. - * @param requestCode Optional request code, for convenience if you - * are going to call back with {@link #onActivityResult(int, int, Intent)}. - */ - public void setTargetFragment(Fragment fragment, int requestCode) { - mTarget = fragment; - mTargetRequestCode = requestCode; - } - - /** - * Return the target fragment set by {@link #setTargetFragment}. - */ - final public Fragment getTargetFragment() { - return mTarget; - } - - /** - * Return the target request code set by {@link #setTargetFragment}. - */ - final public int getTargetRequestCode() { - return mTargetRequestCode; - } - - /** - * Return the Activity this fragment is currently associated with. - */ - final public FragmentActivity getActivity() { - return mActivity; - } - - /** - * Return getActivity().getResources(). - */ - final public Resources getResources() { - if (mActivity == null) { - throw new IllegalStateException("Fragment " + this + " not attached to Activity"); - } - return mActivity.getResources(); - } - - /** - * Return a localized, styled CharSequence from the application's package's - * default string table. - * - * @param resId Resource id for the CharSequence text - */ - public final CharSequence getText(int resId) { - return getResources().getText(resId); - } - - /** - * Return a localized string from the application's package's - * default string table. - * - * @param resId Resource id for the string - */ - public final String getString(int resId) { - return getResources().getString(resId); - } - - /** - * Return a localized formatted string from the application's package's - * default string table, substituting the format arguments as defined in - * {@link java.util.Formatter} and {@link java.lang.String#format}. - * - * @param resId Resource id for the format string - * @param formatArgs The format arguments that will be used for substitution. - */ - - public final String getString(int resId, Object... formatArgs) { - return getResources().getString(resId, formatArgs); - } - - /** - * Return the FragmentManager for interacting with fragments associated - * with this fragment's activity. Note that this will be non-null slightly - * before {@link #getActivity()}, during the time from when the fragment is - * placed in a {@link FragmentTransaction} until it is committed and - * attached to its activity. - */ - final public FragmentManager getFragmentManager() { - return mFragmentManager; - } - - /** - * Return true if the fragment is currently added to its activity. - */ - final public boolean isAdded() { - return mActivity != null && mAdded; - } - - /** - * Return true if this fragment is currently being removed from its - * activity. This is not whether its activity is finishing, but - * rather whether it is in the process of being removed from its activity. - */ - final public boolean isRemoving() { - return mRemoving; - } - - /** - * Return true if the layout is included as part of an activity view - * hierarchy via the <fragment> tag. This will always be true when - * fragments are created through the <fragment> tag, except - * in the case where an old fragment is restored from a previous state and - * it does not appear in the layout of the current state. - */ - final public boolean isInLayout() { - return mInLayout; - } - - /** - * Return true if the fragment is in the resumed state. This is true - * for the duration of {@link #onResume()} and {@link #onPause()} as well. - */ - final public boolean isResumed() { - return mResumed; - } - - /** - * Return true if the fragment is currently visible to the user. This means - * it: (1) has been added, (2) has its view attached to the window, and - * (3) is not hidden. - */ - final public boolean isVisible() { - return isAdded() && !isHidden() && mView != null - && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE; - } - - /** - * Return true if the fragment has been hidden. By default fragments - * are shown. You can find out about changes to this state with - * {@link #onHiddenChanged}. Note that the hidden state is orthogonal - * to other states -- that is, to be visible to the user, a fragment - * must be both started and not hidden. - */ - final public boolean isHidden() { - return mHidden; - } - - /** - * Called when the hidden state (as returned by {@link #isHidden()} of - * the fragment has changed. Fragments start out not hidden; this will - * be called whenever the fragment changes state from that. - * @param hidden True if the fragment is now hidden, false if it is not - * visible. - */ - public void onHiddenChanged(boolean hidden) { - } - - /** - * Control whether a fragment instance is retained across Activity - * re-creation (such as from a configuration change). This can only - * be used with fragments not in the back stack. If set, the fragment - * lifecycle will be slightly different when an activity is recreated: - *

    - *
  • {@link #onDestroy()} will not be called (but {@link #onDetach()} still - * will be, because the fragment is being detached from its current activity). - *
  • {@link #onCreate(Bundle)} will not be called since the fragment - * is not being re-created. - *
  • {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} will - * still be called. - *
- */ - public void setRetainInstance(boolean retain) { - mRetainInstance = retain; - } - - final public boolean getRetainInstance() { - return mRetainInstance; - } - - /** - * Report that this fragment would like to participate in populating - * the options menu by receiving a call to {@link #onCreateOptionsMenu} - * and related methods. - * - * @param hasMenu If true, the fragment has menu items to contribute. - */ - public void setHasOptionsMenu(boolean hasMenu) { - if (mHasMenu != hasMenu) { - mHasMenu = hasMenu; - if (isAdded() && !isHidden()) { - mActivity.supportInvalidateOptionsMenu(); - } - } - } - - /** - * Return the LoaderManager for this fragment, creating it if needed. - */ - public LoaderManager getLoaderManager() { - if (mLoaderManager != null) { - return mLoaderManager; - } - if (mActivity == null) { - throw new IllegalStateException("Fragment " + this + " not attached to Activity"); - } - mCheckedForLoaderManager = true; - mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true); - return mLoaderManager; - } - - /** - * Call {@link Activity#startActivity(Intent)} on the fragment's - * containing Activity. - */ - public void startActivity(Intent intent) { - if (mActivity == null) { - throw new IllegalStateException("Fragment " + this + " not attached to Activity"); - } - mActivity.startActivityFromFragment(this, intent, -1); - } - - /** - * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's - * containing Activity. - */ - public void startActivityForResult(Intent intent, int requestCode) { - if (mActivity == null) { - throw new IllegalStateException("Fragment " + this + " not attached to Activity"); - } - mActivity.startActivityFromFragment(this, intent, requestCode); - } - - /** - * Receive the result from a previous call to - * {@link #startActivityForResult(Intent, int)}. This follows the - * related Activity API as described there in - * {@link Activity#onActivityResult(int, int, Intent)}. - * - * @param requestCode The integer request code originally supplied to - * startActivityForResult(), allowing you to identify who this - * result came from. - * @param resultCode The integer result code returned by the child activity - * through its setResult(). - * @param data An Intent, which can return result data to the caller - * (various data can be attached to Intent "extras"). - */ - public void onActivityResult(int requestCode, int resultCode, Intent data) { - } - - /** - * @hide Hack so that DialogFragment can make its Dialog before creating - * its views, and the view construction can use the dialog's context for - * inflation. Maybe this should become a public API. Note sure. - */ - public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { - return mActivity.getLayoutInflater(); - } - - /** - * Called when a fragment is being created as part of a view layout - * inflation, typically from setting the content view of an activity. This - * may be called immediately after the fragment is created from a - * tag in a layout file. Note this is before the fragment's - * {@link #onAttach(Activity)} has been called; all you should do here is - * parse the attributes and save them away. - * - *

This is called every time the fragment is inflated, even if it is - * being inflated into a new instance with saved state. It typically makes - * sense to re-parse the parameters each time, to allow them to change with - * different configurations.

- * - *

Here is a typical implementation of a fragment that can take parameters - * both through attributes supplied here as well from {@link #getArguments()}:

- * - * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java - * fragment} - * - *

Note that parsing the XML attributes uses a "styleable" resource. The - * declaration for the styleable used here is:

- * - * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments} - * - *

The fragment can then be declared within its activity's content layout - * through a tag like this:

- * - * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes} - * - *

This fragment can also be created dynamically from arguments given - * at runtime in the arguments Bundle; here is an example of doing so at - * creation of the containing activity:

- * - * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java - * create} - * - * @param activity The Activity that is inflating this fragment. - * @param attrs The attributes at the tag where the fragment is - * being created. - * @param savedInstanceState If the fragment is being re-created from - * a previous saved state, this is the state. - */ - public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { - mCalled = true; - } - - /** - * Called when a fragment is first attached to its activity. - * {@link #onCreate(Bundle)} will be called after this. - */ - public void onAttach(Activity activity) { - mCalled = true; - } - - /** - * Called when a fragment loads an animation. - */ - public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { - return null; - } - - /** - * Called to do initial creation of a fragment. This is called after - * {@link #onAttach(Activity)} and before - * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. - * - *

Note that this can be called while the fragment's activity is - * still in the process of being created. As such, you can not rely - * on things like the activity's content view hierarchy being initialized - * at this point. If you want to do work once the activity itself is - * created, see {@link #onActivityCreated(Bundle)}. - * - * @param savedInstanceState If the fragment is being re-created from - * a previous saved state, this is the state. - */ - public void onCreate(Bundle savedInstanceState) { - mCalled = true; - } - - /** - * Called to have the fragment instantiate its user interface view. - * This is optional, and non-graphical fragments can return null (which - * is the default implementation). This will be called between - * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}. - * - *

If you return a View from here, you will later be called in - * {@link #onDestroyView} when the view is being released. - * - * @param inflater The LayoutInflater object that can be used to inflate - * any views in the fragment, - * @param container If non-null, this is the parent view that the fragment's - * UI should be attached to. The fragment should not add the view itself, - * but this can be used to generate the LayoutParams of the view. - * @param savedInstanceState If non-null, this fragment is being re-constructed - * from a previous saved state as given here. - * - * @return Return the View for the fragment's UI, or null. - */ - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return null; - } - - /** - * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}), - * if provided. - * - * @return The fragment's root view, or null if it has no layout. - */ - public View getView() { - return mView; - } - - /** - * Called when the fragment's activity has been created and this - * fragment's view hierarchy instantiated. It can be used to do final - * initialization once these pieces are in place, such as retrieving - * views or restoring state. It is also useful for fragments that use - * {@link #setRetainInstance(boolean)} to retain their instance, - * as this callback tells the fragment when it is fully associated with - * the new activity instance. This is called after {@link #onCreateView} - * and before {@link #onStart()}. - * - * @param savedInstanceState If the fragment is being re-created from - * a previous saved state, this is the state. - */ - public void onActivityCreated(Bundle savedInstanceState) { - mCalled = true; - } - - /** - * Called when the Fragment is visible to the user. This is generally - * tied to {@link Activity#onStart() Activity.onStart} of the containing - * Activity's lifecycle. - */ - public void onStart() { - mCalled = true; - - if (!mLoadersStarted) { - mLoadersStarted = true; - if (!mCheckedForLoaderManager) { - mCheckedForLoaderManager = true; - mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, false); - } - if (mLoaderManager != null) { - mLoaderManager.doStart(); - } - } - } - - /** - * Called when the fragment is visible to the user and actively running. - * This is generally - * tied to {@link Activity#onResume() Activity.onResume} of the containing - * Activity's lifecycle. - */ - public void onResume() { - mCalled = true; - } - - /** - * Called to ask the fragment to save its current dynamic state, so it - * can later be reconstructed in a new instance of its process is - * restarted. If a new instance of the fragment later needs to be - * created, the data you place in the Bundle here will be available - * in the Bundle given to {@link #onCreate(Bundle)}, - * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and - * {@link #onActivityCreated(Bundle)}. - * - *

This corresponds to {@link Activity#onSaveInstanceState(Bundle) - * Activity.onSaveInstanceState(Bundle)} and most of the discussion there - * applies here as well. Note however: this method may be called - * at any time before {@link #onDestroy()}. There are many situations - * where a fragment may be mostly torn down (such as when placed on the - * back stack with no UI showing), but its state will not be saved until - * its owning activity actually needs to save its state. - * - * @param outState Bundle in which to place your saved state. - */ - public void onSaveInstanceState(Bundle outState) { - } - - public void onConfigurationChanged(Configuration newConfig) { - mCalled = true; - } - - /** - * Called when the Fragment is no longer resumed. This is generally - * tied to {@link Activity#onPause() Activity.onPause} of the containing - * Activity's lifecycle. - */ - public void onPause() { - mCalled = true; - } - - /** - * Called when the Fragment is no longer started. This is generally - * tied to {@link Activity#onStop() Activity.onStop} of the containing - * Activity's lifecycle. - */ - public void onStop() { - mCalled = true; - } - - public void onLowMemory() { - mCalled = true; - } - - /** - * Called when the view previously created by {@link #onCreateView} has - * been detached from the fragment. The next time the fragment needs - * to be displayed, a new view will be created. This is called - * after {@link #onStop()} and before {@link #onDestroy()}. It is called - * regardless of whether {@link #onCreateView} returned a - * non-null view. Internally it is called after the view's state has - * been saved but before it has been removed from its parent. - */ - public void onDestroyView() { - mCalled = true; - } - - /** - * Called when the fragment is no longer in use. This is called - * after {@link #onStop()} and before {@link #onDetach()}. - */ - public void onDestroy() { - mCalled = true; - //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager - // + " mLoaderManager=" + mLoaderManager); - if (!mCheckedForLoaderManager) { - mCheckedForLoaderManager = true; - mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, false); - } - if (mLoaderManager != null) { - mLoaderManager.doDestroy(); - } - } - - /** - * Called when the fragment is no longer attached to its activity. This - * is called after {@link #onDestroy()}. - */ - public void onDetach() { - mCalled = true; - } - - /** - * Initialize the contents of the Activity's standard options menu. You - * should place your menu items in to menu. For this method - * to be called, you must have first called {@link #setHasOptionsMenu}. See - * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu} - * for more information. - * - * @param menu The options menu in which you place your items. - * - * @see #setHasOptionsMenu - * @see #onPrepareOptionsMenu - * @see #onOptionsItemSelected - */ - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - } - - /** - * Prepare the Screen's standard options menu to be displayed. This is - * called right before the menu is shown, every time it is shown. You can - * use this method to efficiently enable/disable items or otherwise - * dynamically modify the contents. See - * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu} - * for more information. - * - * @param menu The options menu as last shown or first initialized by - * onCreateOptionsMenu(). - * - * @see #setHasOptionsMenu - * @see #onCreateOptionsMenu - */ - public void onPrepareOptionsMenu(Menu menu) { - } - - /** - * Called when this fragment's option menu items are no longer being - * included in the overall options menu. Receiving this call means that - * the menu needed to be rebuilt, but this fragment's items were not - * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)} - * was not called). - */ - public void onDestroyOptionsMenu() { - } - - /** - * This hook is called whenever an item in your options menu is selected. - * The default implementation simply returns false to have the normal - * processing happen (calling the item's Runnable or sending a message to - * its Handler as appropriate). You can use this method for any items - * for which you would like to do processing without those other - * facilities. - * - *

Derived classes should call through to the base class for it to - * perform the default menu handling. - * - * @param item The menu item that was selected. - * - * @return boolean Return false to allow normal menu processing to - * proceed, true to consume it here. - * - * @see #onCreateOptionsMenu - */ - public boolean onOptionsItemSelected(MenuItem item) { - return false; - } - - /** - * This hook is called whenever the options menu is being closed (either by the user canceling - * the menu with the back/menu button, or when an item is selected). - * - * @param menu The options menu as last shown or first initialized by - * onCreateOptionsMenu(). - */ - public void onOptionsMenuClosed(Menu menu) { - } - - /** - * Called when a context menu for the {@code view} is about to be shown. - * Unlike {@link #onCreateOptionsMenu}, this will be called every - * time the context menu is about to be shown and should be populated for - * the view (or item inside the view for {@link AdapterView} subclasses, - * this can be found in the {@code menuInfo})). - *

- * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an - * item has been selected. - *

- * The default implementation calls up to - * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though - * you can not call this implementation if you don't want that behavior. - *

- * It is not safe to hold onto the context menu after this method returns. - * {@inheritDoc} - */ - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - getActivity().onCreateContextMenu(menu, v, menuInfo); - } - - /** - * Registers a context menu to be shown for the given view (multiple views - * can show the context menu). This method will set the - * {@link OnCreateContextMenuListener} on the view to this fragment, so - * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be - * called when it is time to show the context menu. - * - * @see #unregisterForContextMenu(View) - * @param view The view that should show a context menu. - */ - public void registerForContextMenu(View view) { - view.setOnCreateContextMenuListener(this); - } - - /** - * Prevents a context menu to be shown for the given view. This method will - * remove the {@link OnCreateContextMenuListener} on the view. - * - * @see #registerForContextMenu(View) - * @param view The view that should stop showing a context menu. - */ - public void unregisterForContextMenu(View view) { - view.setOnCreateContextMenuListener(null); - } - - /** - * This hook is called whenever an item in a context menu is selected. The - * default implementation simply returns false to have the normal processing - * happen (calling the item's Runnable or sending a message to its Handler - * as appropriate). You can use this method for any items for which you - * would like to do processing without those other facilities. - *

- * Use {@link MenuItem#getMenuInfo()} to get extra information set by the - * View that added this menu item. - *

- * Derived classes should call through to the base class for it to perform - * the default menu handling. - * - * @param item The context menu item that was selected. - * @return boolean Return false to allow normal context menu processing to - * proceed, true to consume it here. - */ - public boolean onContextItemSelected(MenuItem item) { - return false; - } - - /** - * Print the Fragments's state into the given stream. - * - * @param prefix Text to print at the front of each line. - * @param fd The raw file descriptor that the dump is being sent to. - * @param writer The PrintWriter to which you should dump your state. This will be - * closed for you after you return. - * @param args additional arguments to the dump request. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { - writer.print(prefix); writer.print("mFragmentId=#"); - writer.print(Integer.toHexString(mFragmentId)); - writer.print(" mContainerId#="); - writer.print(Integer.toHexString(mContainerId)); - writer.print(" mTag="); writer.println(mTag); - writer.print(prefix); writer.print("mState="); writer.print(mState); - writer.print(" mIndex="); writer.print(mIndex); - writer.print(" mWho="); writer.print(mWho); - writer.print(" mBackStackNesting="); writer.println(mBackStackNesting); - writer.print(prefix); writer.print("mAdded="); writer.print(mAdded); - writer.print(" mRemoving="); writer.print(mRemoving); - writer.print(" mResumed="); writer.print(mResumed); - writer.print(" mFromLayout="); writer.print(mFromLayout); - writer.print(" mInLayout="); writer.println(mInLayout); - writer.print(prefix); writer.print("mHidden="); writer.print(mHidden); - writer.print(" mRetainInstance="); writer.print(mRetainInstance); - writer.print(" mRetaining="); writer.print(mRetaining); - writer.print(" mHasMenu="); writer.println(mHasMenu); - if (mFragmentManager != null) { - writer.print(prefix); writer.print("mFragmentManager="); - writer.println(mFragmentManager); - } - if (mImmediateActivity != null) { - writer.print(prefix); writer.print("mImmediateActivity="); - writer.println(mImmediateActivity); - } - if (mActivity != null) { - writer.print(prefix); writer.print("mActivity="); - writer.println(mActivity); - } - if (mArguments != null) { - writer.print(prefix); writer.print("mArguments="); writer.println(mArguments); - } - if (mSavedFragmentState != null) { - writer.print(prefix); writer.print("mSavedFragmentState="); - writer.println(mSavedFragmentState); - } - if (mSavedViewState != null) { - writer.print(prefix); writer.print("mSavedViewState="); - writer.println(mSavedViewState); - } - if (mTarget != null) { - writer.print(prefix); writer.print("mTarget="); writer.print(mTarget); - writer.print(" mTargetRequestCode="); - writer.println(mTargetRequestCode); - } - if (mNextAnim != 0) { - writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim); - } - if (mContainer != null) { - writer.print(prefix); writer.print("mContainer="); writer.println(mContainer); - } - if (mView != null) { - writer.print(prefix); writer.print("mView="); writer.println(mView); - } - if (mInnerView != null) { - writer.print(prefix); writer.print("mInnerView="); writer.println(mView); - } - if (mAnimatingAway != null) { - writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway); - writer.print(prefix); writer.print("mStateAfterAnimating="); - writer.println(mStateAfterAnimating); - } - if (mLoaderManager != null) { - writer.print(prefix); writer.println("Loader Manager:"); - mLoaderManager.dump(prefix + " ", fd, writer, args); - } - } - - void performStop() { - onStop(); - } - - void performReallyStop(boolean retaining) { - if (mLoadersStarted) { - mLoadersStarted = false; - if (!mCheckedForLoaderManager) { - mCheckedForLoaderManager = true; - mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, false); - } - if (mLoaderManager != null) { - if (!retaining) { - mLoaderManager.doStop(); - } else { - mLoaderManager.doRetain(); - } - } - } - } -} diff --git a/apps/AndroidSupportV2/src/android/support/v2/app/FragmentActivity.java b/apps/AndroidSupportV2/src/android/support/v2/app/FragmentActivity.java deleted file mode 100644 index 330edaa..0000000 --- a/apps/AndroidSupportV2/src/android/support/v2/app/FragmentActivity.java +++ /dev/null @@ -1,693 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.TypedArray; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.Parcelable; -import android.util.AttributeSet; -import android.util.Log; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.Window; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; - -/** - * Base class for activities that want to use the support-based Fragment and - * Loader APIs. - * - *

Known limitations:

- *
    - *
  • When using the <fragment> tag, this implementation can not - * use the parent view's ID as the new fragment's ID. You must explicitly - * specify an ID (or tag) in the <fragment>.

    - *
  • Prior to Honeycomb (3.0), an activity's state was saved before pausing. - * Fragments are a significant amount of new state, and dynamic enough that one - * often wants them to change between pausing and stopping. These classes - * throw an exception if you try to change the fragment state after it has been - * saved, to avoid accidental loss of UI state. However this is too restrictive - * prior to Honeycomb, where the state is saved before pausing. To address this, - * when running on platforms prior to Honeycomb an exception will not be thrown - * if you change fragments between the state save and the activity being stopped. - * This means that is some cases if the activity is restored from its last saved - * state, this may be a snapshot slightly before what the user last saw.

    - *
- */ -public class FragmentActivity extends Activity { - private static final String TAG = "FragmentActivity"; - - private static final String FRAGMENTS_TAG = "android:support:fragments"; - - // This is the SDK API version of Honeycomb (3.0). - private static final int HONEYCOMB = 11; - - static final int MSG_REALLY_STOPPED = 1; - - final Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_REALLY_STOPPED: - if (mStopped) { - doReallyStop(false); - } - break; - default: - super.handleMessage(msg); - } - } - - }; - final FragmentManagerImpl mFragments = new FragmentManagerImpl(); - - boolean mResumed; - boolean mStopped; - boolean mReallyStopped; - - boolean mOptionsMenuInvalidated; - - boolean mCheckedForLoaderManager; - boolean mLoadersStarted; - HCSparseArray mAllLoaderManagers; - LoaderManagerImpl mLoaderManager; - - static final class NonConfigurationInstances { - Object activity; - HashMap children; - ArrayList fragments; - HCSparseArray loaders; - } - - static class FragmentTag { - public static final int[] Fragment = { - 0x01010003, 0x010100d0, 0x010100d1 - }; - public static final int Fragment_id = 1; - public static final int Fragment_name = 0; - public static final int Fragment_tag = 2; - } - - // ------------------------------------------------------------------------ - // HOOKS INTO ACTIVITY - // ------------------------------------------------------------------------ - - /** - * Dispatch incoming result to the correct fragment. - */ - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - int index = requestCode>>16; - if (index != 0) { - index--; - if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) { - Log.w(TAG, "Activity result fragment index out of range: 0x" - + Integer.toHexString(requestCode)); - return; - } - Fragment frag = mFragments.mActive.get(index); - if (frag == null) { - Log.w(TAG, "Activity result no fragment exists for index: 0x" - + Integer.toHexString(requestCode)); - } - frag.onActivityResult(requestCode&0xffff, resultCode, data); - return; - } - - super.onActivityResult(requestCode, resultCode, data); - } - - /** - * Take care of popping the fragment back stack or finishing the activity - * as appropriate. - */ - public void onBackPressed() { - if (!mFragments.popBackStackImmediate()) { - finish(); - } - } - - /** - * Dispatch configuration change to all fragments. - */ - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - mFragments.dispatchConfigurationChanged(newConfig); - } - - /** - * Perform initialization of all fragments and loaders. - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - mFragments.attachActivity(this); - // Old versions of the platform didn't do this! - if (getLayoutInflater().getFactory() == null) { - getLayoutInflater().setFactory(this); - } - - super.onCreate(savedInstanceState); - - NonConfigurationInstances nc = (NonConfigurationInstances) - getLastNonConfigurationInstance(); - if (nc != null) { - mAllLoaderManagers = nc.loaders; - } - if (savedInstanceState != null) { - Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); - mFragments.restoreAllState(p, nc != null ? nc.fragments : null); - } - mFragments.dispatchCreate(); - } - - /** - * Dispatch to Fragment.onCreateOptionsMenu(). - */ - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean show = super.onCreatePanelMenu(featureId, menu); - show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater()); - //v4 if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - if (android.support.v2.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - return show; - } - // Prior to Honeycomb, the framework can't invalidate the options - // menu, so we must always say we have one in case the app later - // invalidates it and needs to have it shown. - return true; - } - return super.onCreatePanelMenu(featureId, menu); - } - - /** - * Add support for inflating the <fragment> tag. - */ - @Override - public View onCreateView(String name, Context context, AttributeSet attrs) { - if (!"fragment".equals(name)) { - return super.onCreateView(name, context, attrs); - } - - String fname = attrs.getAttributeValue(null, "class"); - TypedArray a = context.obtainStyledAttributes(attrs, FragmentTag.Fragment); - if (fname == null) { - fname = a.getString(FragmentTag.Fragment_name); - } - int id = a.getResourceId(FragmentTag.Fragment_id, View.NO_ID); - String tag = a.getString(FragmentTag.Fragment_tag); - a.recycle(); - - View parent = null; // NOTE: no way to get parent pre-Honeycomb. - int containerId = parent != null ? parent.getId() : 0; - if (containerId == View.NO_ID && id == View.NO_ID && tag == null) { - throw new IllegalArgumentException(attrs.getPositionDescription() - + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname); - } - - // If we restored from a previous state, we may already have - // instantiated this fragment from the state and should use - // that instance instead of making a new one. - Fragment fragment = id != View.NO_ID ? mFragments.findFragmentById(id) : null; - if (fragment == null && tag != null) { - fragment = mFragments.findFragmentByTag(tag); - } - if (fragment == null && containerId != View.NO_ID) { - fragment = mFragments.findFragmentById(containerId); - } - - if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x" - + Integer.toHexString(id) + " fname=" + fname - + " existing=" + fragment); - if (fragment == null) { - fragment = Fragment.instantiate(this, fname); - fragment.mFromLayout = true; - fragment.mFragmentId = id != 0 ? id : containerId; - fragment.mContainerId = containerId; - fragment.mTag = tag; - fragment.mInLayout = true; - fragment.mImmediateActivity = this; - fragment.mFragmentManager = mFragments; - fragment.onInflate(this, attrs, fragment.mSavedFragmentState); - mFragments.addFragment(fragment, true); - - } else if (fragment.mInLayout) { - // A fragment already exists and it is not one we restored from - // previous state. - throw new IllegalArgumentException(attrs.getPositionDescription() - + ": Duplicate id 0x" + Integer.toHexString(id) - + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId) - + " with another fragment for " + fname); - } else { - // This fragment was retained from a previous instance; get it - // going now. - fragment.mInLayout = true; - fragment.mImmediateActivity = this; - // If this fragment is newly instantiated (either right now, or - // from last saved state), then give it the attributes to - // initialize itself. - if (!fragment.mRetaining) { - fragment.onInflate(this, attrs, fragment.mSavedFragmentState); - } - mFragments.moveToState(fragment); - } - - if (fragment.mView == null) { - throw new IllegalStateException("Fragment " + fname - + " did not create a view."); - } - if (id != 0) { - fragment.mView.setId(id); - } - if (fragment.mView.getTag() == null) { - fragment.mView.setTag(tag); - } - return fragment.mView; - } - - /** - * Destroy all fragments and loaders. - */ - @Override - protected void onDestroy() { - super.onDestroy(); - - doReallyStop(false); - - mFragments.dispatchDestroy(); - if (mLoaderManager != null) { - mLoaderManager.doDestroy(); - } - } - - /** - * Take care of calling onBackPressed() for pre-Eclair platforms. - */ - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - //v4 if (android.os.Build.VERSION.SDK_INT < 5 /* ECLAIR */ - if (android.support.v2.os.Build.VERSION.SDK_INT < 5 /* ECLAIR */ - && keyCode == KeyEvent.KEYCODE_BACK - && event.getRepeatCount() == 0) { - // Take care of calling this method on earlier versions of - // the platform where it doesn't exist. - onBackPressed(); - return true; - } - - return super.onKeyDown(keyCode, event); - } - - /** - * Dispatch onLowMemory() to all fragments. - */ - @Override - public void onLowMemory() { - super.onLowMemory(); - mFragments.dispatchLowMemory(); - } - - /** - * Dispatch context and options menu to fragments. - */ - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (super.onMenuItemSelected(featureId, item)) { - return true; - } - - switch (featureId) { - case Window.FEATURE_OPTIONS_PANEL: - return mFragments.dispatchOptionsItemSelected(item); - - case Window.FEATURE_CONTEXT_MENU: - return mFragments.dispatchContextItemSelected(item); - - default: - return false; - } - } - - /** - * Call onOptionsMenuClosed() on fragments. - */ - @Override - public void onPanelClosed(int featureId, Menu menu) { - switch (featureId) { - case Window.FEATURE_OPTIONS_PANEL: - mFragments.dispatchOptionsMenuClosed(menu); - break; - } - super.onPanelClosed(featureId, menu); - } - - /** - * Dispatch onPause() to fragments. - */ - @Override - protected void onPause() { - super.onPause(); - mResumed = false; - mFragments.dispatchPause(); - } - - /** - * Dispatch onActivityCreated() on fragments. - */ - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mFragments.dispatchActivityCreated(); - } - - /** - * Dispatch onResume() to fragments. - */ - @Override - protected void onPostResume() { - super.onPostResume(); - mFragments.dispatchResume(); - mFragments.execPendingActions(); - } - - /** - * Dispatch onPrepareOptionsMenu() to fragments. - */ - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) { - if (mOptionsMenuInvalidated) { - mOptionsMenuInvalidated = false; - menu.clear(); - onCreatePanelMenu(featureId, menu); - } - boolean goforit = super.onPreparePanel(featureId, view, menu); - goforit |= mFragments.dispatchPrepareOptionsMenu(menu); - return goforit && menu.hasVisibleItems(); - } - return super.onPreparePanel(featureId, view, menu); - } - - /** - * Ensure any outstanding fragment transactions have been committed. - */ - @Override - protected void onResume() { - super.onResume(); - mResumed = true; - mFragments.execPendingActions(); - } - - /** - * Retain all appropriate fragment and loader state. You can NOT - * override this yourself! - */ - @Override - public final Object onRetainNonConfigurationInstance() { - if (mStopped) { - doReallyStop(true); - } - - ArrayList fragments = mFragments.retainNonConfig(); - boolean retainLoaders = false; - if (mAllLoaderManagers != null) { - // prune out any loader managers that were already stopped and so - // have nothing useful to retain. - for (int i=mAllLoaderManagers.size()-1; i>=0; i--) { - LoaderManagerImpl lm = mAllLoaderManagers.valueAt(i); - if (lm.mRetaining) { - retainLoaders = true; - } else { - lm.doDestroy(); - mAllLoaderManagers.removeAt(i); - } - } - } - if (fragments == null && !retainLoaders) { - return null; - } - - NonConfigurationInstances nci = new NonConfigurationInstances(); - nci.activity = null; - nci.children = null; - nci.fragments = fragments; - nci.loaders = mAllLoaderManagers; - return nci; - } - - /** - * Save all appropriate fragment state. - */ - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - Parcelable p = mFragments.saveAllState(); - if (p != null) { - outState.putParcelable(FRAGMENTS_TAG, p); - } - } - - /** - * Dispatch onStart() to all fragments. Ensure any created loaders are - * now started. - */ - @Override - protected void onStart() { - super.onStart(); - - mStopped = false; - mHandler.removeMessages(MSG_REALLY_STOPPED); - - mFragments.noteStateNotSaved(); - mFragments.execPendingActions(); - - - if (!mLoadersStarted) { - mLoadersStarted = true; - if (mLoaderManager != null) { - mLoaderManager.doStart(); - } else if (!mCheckedForLoaderManager) { - mLoaderManager = getLoaderManager(-1, mLoadersStarted, false); - } - mCheckedForLoaderManager = true; - } - // NOTE: HC onStart goes here. - - mFragments.dispatchStart(); - if (mAllLoaderManagers != null) { - for (int i=mAllLoaderManagers.size()-1; i>=0; i--) { - mAllLoaderManagers.valueAt(i).finishRetain(); - } - } - } - - /** - * Dispatch onStop() to all fragments. Ensure all loaders are stopped. - */ - @Override - protected void onStop() { - super.onStop(); - - mStopped = true; - mHandler.sendEmptyMessage(MSG_REALLY_STOPPED); - - mFragments.dispatchStop(); - } - - // ------------------------------------------------------------------------ - // NEW METHODS - // ------------------------------------------------------------------------ - - void supportInvalidateOptionsMenu() { - //v4 if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - if (android.support.v2.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - // If we are running on HC or greater, we can use the framework - // API to invalidate the options menu. - //ActivityCompatHoneycomb.invalidateOptionsMenu(this); - return; - } - - // Whoops, older platform... we'll use a hack, to manually rebuild - // the options menu the next time it is prepared. - mOptionsMenuInvalidated = true; - } - - /** - * Print the Activity's state into the given stream. This gets invoked if - * you run "adb shell dumpsys activity ". - * - * @param prefix Desired prefix to prepend at each line of output. - * @param fd The raw file descriptor that the dump is being sent to. - * @param writer The PrintWriter to which you should dump your state. This will be - * closed for you after you return. - * @param args additional arguments to the dump request. - */ - public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { - //v4 if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - if (android.support.v2.os.Build.VERSION.SDK_INT >= HONEYCOMB) { - // XXX This can only work if we can call the super-class impl. :/ - //ActivityCompatHoneycomb.dump(this, prefix, fd, writer, args); - } - writer.print(prefix); writer.print("Local FragmentActivity "); - writer.print(Integer.toHexString(System.identityHashCode(this))); - writer.println(" State:"); - String innerPrefix = prefix + " "; - writer.print(innerPrefix); writer.print("mResumed="); - writer.print(mResumed); writer.print(" mStopped="); - writer.print(mStopped); writer.print(" mReallyStopped="); - writer.println(mReallyStopped); - writer.print(innerPrefix); writer.print("mLoadersStarted="); - writer.println(mLoadersStarted); - if (mLoaderManager != null) { - writer.print(prefix); writer.print("Loader Manager "); - writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager))); - writer.println(":"); - mLoaderManager.dump(prefix + " ", fd, writer, args); - } - mFragments.dump(prefix, fd, writer, args); - } - - void doReallyStop(boolean retaining) { - if (!mReallyStopped) { - mReallyStopped = true; - mHandler.removeMessages(MSG_REALLY_STOPPED); - onReallyStop(retaining); - } - } - - /** - * Pre-HC, we didn't have a way to determine whether an activity was - * being stopped for a config change or not until we saw - * onRetainNonConfigurationInstance() called after onStop(). However - * we need to know this, to know whether to retain fragments. This will - * tell us what we need to know. - */ - void onReallyStop(boolean retaining) { - if (mLoadersStarted) { - mLoadersStarted = false; - if (mLoaderManager != null) { - if (!retaining) { - mLoaderManager.doStop(); - } else { - mLoaderManager.doRetain(); - } - } - } - - mFragments.dispatchReallyStop(retaining); - } - - // ------------------------------------------------------------------------ - // FRAGMENT SUPPORT - // ------------------------------------------------------------------------ - - /** - * Called when a fragment is attached to the activity. - */ - public void onAttachFragment(Fragment fragment) { - } - - /** - * Return the FragmentManager for interacting with fragments associated - * with this activity. - */ - public FragmentManager getSupportFragmentManager() { - return mFragments; - } - - /** - * Modifies the standard behavior to allow results to be delivered to fragments. - * This imposes a restriction that requestCode be <= 0xffff. - */ - @Override - public void startActivityForResult(Intent intent, int requestCode) { - if (requestCode != -1 && (requestCode&0xffff0000) != 0) { - throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); - } - super.startActivityForResult(intent, requestCode); - } - - /** - * Called by Fragment.startActivityForResult() to implement its behavior. - */ - public void startActivityFromFragment(Fragment fragment, Intent intent, - int requestCode) { - if (requestCode == -1) { - super.startActivityForResult(intent, -1); - return; - } - if ((requestCode&0xffff0000) != 0) { - throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); - } - super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff)); - } - - void invalidateSupportFragmentIndex(int index) { - //Log.v(TAG, "invalidateFragmentIndex: index=" + index); - if (mAllLoaderManagers != null) { - LoaderManagerImpl lm = mAllLoaderManagers.get(index); - if (lm != null) { - lm.doDestroy(); - } - mAllLoaderManagers.remove(index); - } - } - - // ------------------------------------------------------------------------ - // LOADER SUPPORT - // ------------------------------------------------------------------------ - - /** - * Return the LoaderManager for this fragment, creating it if needed. - */ - public LoaderManager getSupportLoaderManager() { - if (mLoaderManager != null) { - return mLoaderManager; - } - mCheckedForLoaderManager = true; - mLoaderManager = getLoaderManager(-1, mLoadersStarted, true); - return mLoaderManager; - } - - LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) { - if (mAllLoaderManagers == null) { - mAllLoaderManagers = new HCSparseArray(); - } - LoaderManagerImpl lm = mAllLoaderManagers.get(index); - if (lm == null) { - if (create) { - lm = new LoaderManagerImpl(this, started); - mAllLoaderManagers.put(index, lm); - } - } else { - lm.updateActivity(this); - } - return lm; - } -} diff --git a/apps/AndroidSupportV2/src/android/support/v2/app/FragmentManager.java b/apps/AndroidSupportV2/src/android/support/v2/app/FragmentManager.java deleted file mode 100644 index 35558f1..0000000 --- a/apps/AndroidSupportV2/src/android/support/v2/app/FragmentManager.java +++ /dev/null @@ -1,1829 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.support.v2.app; - -import android.R; -import android.content.Context; -import android.content.res.Configuration; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v2.util.DebugUtils; -import android.support.v2.util.LogWriter; -import android.util.Log; -import android.util.SparseArray; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.AlphaAnimation; -import android.view.animation.Animation; -import android.view.animation.AnimationSet; -import android.view.animation.AnimationUtils; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; -import android.view.animation.ScaleAnimation; -import android.view.animation.Animation.AnimationListener; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * Static library support version of the framework's {@link android.app.FragmentManager}. - * Used to write apps that run on platforms prior to Android 3.0. When running - * on Android 3.0 or above, this implementation is still used; it does not try - * to switch to the framework's implementation. See the framework SDK - * documentation for a class overview. - * - *

Your activity must derive from {@link FragmentActivity} to use this. - */ -public abstract class FragmentManager { - /** - * Representation of an entry on the fragment back stack, as created - * with {@link FragmentTransaction#addToBackStack(String) - * FragmentTransaction.addToBackStack()}. Entries can later be - * retrieved with {@link FragmentManager#getBackStackEntryAt(int) - * FragmentManager.getBackStackEntry()}. - * - *

Note that you should never hold on to a BackStackEntry object; - * the identifier as returned by {@link #getId} is the only thing that - * will be persisted across activity instances. - */ - public interface BackStackEntry { - /** - * Return the unique identifier for the entry. This is the only - * representation of the entry that will persist across activity - * instances. - */ - public int getId(); - - /** - * Return the full bread crumb title resource identifier for the entry, - * or 0 if it does not have one. - */ - public int getBreadCrumbTitleRes(); - - /** - * Return the short bread crumb title resource identifier for the entry, - * or 0 if it does not have one. - */ - public int getBreadCrumbShortTitleRes(); - - /** - * Return the full bread crumb title for the entry, or null if it - * does not have one. - */ - public CharSequence getBreadCrumbTitle(); - - /** - * Return the short bread crumb title for the entry, or null if it - * does not have one. - */ - public CharSequence getBreadCrumbShortTitle(); - } - - /** - * Interface to watch for changes to the back stack. - */ - public interface OnBackStackChangedListener { - /** - * Called whenever the contents of the back stack change. - */ - public void onBackStackChanged(); - } - - /** - * Start a series of edit operations on the Fragments associated with - * this FragmentManager. - * - *

Note: A fragment transaction can only be created/committed prior - * to an activity saving its state. If you try to commit a transaction - * after {@link FragmentActivity#onSaveInstanceState FragmentActivity.onSaveInstanceState()} - * (and prior to a following {@link FragmentActivity#onStart FragmentActivity.onStart} - * or {@link FragmentActivity#onResume FragmentActivity.onResume()}, you will get an error. - * This is because the framework takes care of saving your current fragments - * in the state, and if changes are made after the state is saved then they - * will be lost.

- */ - public abstract FragmentTransaction beginTransaction(); - - /** @hide -- remove once prebuilts are in. */ - @Deprecated - public FragmentTransaction openTransaction() { - return beginTransaction(); - } - - /** - * After a {@link FragmentTransaction} is committed with - * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it - * is scheduled to be executed asynchronously on the process's main thread. - * If you want to immediately executing any such pending operations, you - * can call this function (only from the main thread) to do so. Note that - * all callbacks and other related behavior will be done from within this - * call, so be careful about where this is called from. - * - * @return Returns true if there were any pending transactions to be - * executed. - */ - public abstract boolean executePendingTransactions(); - - /** - * Finds a fragment that was identified by the given id either when inflated - * from XML or as the container ID when added in a transaction. This first - * searches through fragments that are currently added to the manager's - * activity; if no such fragment is found, then all fragments currently - * on the back stack associated with this ID are searched. - * @return The fragment if found or null otherwise. - */ - public abstract Fragment findFragmentById(int id); - - /** - * Finds a fragment that was identified by the given tag either when inflated - * from XML or as supplied when added in a transaction. This first - * searches through fragments that are currently added to the manager's - * activity; if no such fragment is found, then all fragments currently - * on the back stack are searched. - * @return The fragment if found or null otherwise. - */ - public abstract Fragment findFragmentByTag(String tag); - - /** - * Flag for {@link #popBackStack(String, int)} - * and {@link #popBackStack(int, int)}: If set, and the name or ID of - * a back stack entry has been supplied, then all matching entries will - * be consumed until one that doesn't match is found or the bottom of - * the stack is reached. Otherwise, all entries up to but not including that entry - * will be removed. - */ - public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; - - /** - * Pop the top state off the back stack. Returns true if there was one - * to pop, else false. This function is asynchronous -- it enqueues the - * request to pop, but the action will not be performed until the application - * returns to its event loop. - */ - public abstract void popBackStack(); - - /** - * Like {@link #popBackStack()}, but performs the operation immediately - * inside of the call. This is like calling {@link #executePendingTransactions()} - * afterwards. - * @return Returns true if there was something popped, else false. - */ - public abstract boolean popBackStackImmediate(); - - /** - * Pop the last fragment transition from the manager's fragment - * back stack. If there is nothing to pop, false is returned. - * This function is asynchronous -- it enqueues the - * request to pop, but the action will not be performed until the application - * returns to its event loop. - * - * @param name If non-null, this is the name of a previous back state - * to look for; if found, all states up to that state will be popped. The - * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether - * the named state itself is popped. If null, only the top state is popped. - * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. - */ - public abstract void popBackStack(String name, int flags); - - /** - * Like {@link #popBackStack(String, int)}, but performs the operation immediately - * inside of the call. This is like calling {@link #executePendingTransactions()} - * afterwards. - * @return Returns true if there was something popped, else false. - */ - public abstract boolean popBackStackImmediate(String name, int flags); - - /** - * Pop all back stack states up to the one with the given identifier. - * This function is asynchronous -- it enqueues the - * request to pop, but the action will not be performed until the application - * returns to its event loop. - * - * @param id Identifier of the stated to be popped. If no identifier exists, - * false is returned. - * The identifier is the number returned by - * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The - * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether - * the named state itself is popped. - * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. - */ - public abstract void popBackStack(int id, int flags); - - /** - * Like {@link #popBackStack(int, int)}, but performs the operation immediately - * inside of the call. This is like calling {@link #executePendingTransactions()} - * afterwards. - * @return Returns true if there was something popped, else false. - */ - public abstract boolean popBackStackImmediate(int id, int flags); - - /** - * Return the number of entries currently in the back stack. - */ - public abstract int getBackStackEntryCount(); - - /** - * Return the BackStackEntry at index index in the back stack; - * entries start index 0 being the bottom of the stack. - */ - public abstract BackStackEntry getBackStackEntryAt(int index); - - /** - * Add a new listener for changes to the fragment back stack. - */ - public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener); - - /** - * Remove a listener that was previously added with - * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}. - */ - public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener); - - /** - * Put a reference to a fragment in a Bundle. This Bundle can be - * persisted as saved state, and when later restoring - * {@link #getFragment(Bundle, String)} will return the current - * instance of the same fragment. - * - * @param bundle The bundle in which to put the fragment reference. - * @param key The name of the entry in the bundle. - * @param fragment The Fragment whose reference is to be stored. - */ - public abstract void putFragment(Bundle bundle, String key, Fragment fragment); - - /** - * Retrieve the current Fragment instance for a reference previously - * placed with {@link #putFragment(Bundle, String, Fragment)}. - * - * @param bundle The bundle from which to retrieve the fragment reference. - * @param key The name of the entry in the bundle. - * @return Returns the current Fragment instance that is associated with - * the given reference. - */ - public abstract Fragment getFragment(Bundle bundle, String key); - - /** - * Print the FragmentManager's state into the given stream. - * - * @param prefix Text to print at the front of each line. - * @param fd The raw file descriptor that the dump is being sent to. - * @param writer A PrintWriter to which the dump is to be set. - * @param args Additional arguments to the dump request. - */ - public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args); - - /** - * Control whether the framework's internal fragment manager debugging - * logs are turned on. If enabled, you will see output in logcat as - * the framework performs fragment operations. - */ - public static void enableDebugLogging(boolean enabled) { - FragmentManagerImpl.DEBUG = enabled; - } -} - -final class FragmentManagerState implements Parcelable { - FragmentState[] mActive; - int[] mAdded; - BackStackState[] mBackStack; - - public FragmentManagerState() { - } - - public FragmentManagerState(Parcel in) { - mActive = in.createTypedArray(FragmentState.CREATOR); - mAdded = in.createIntArray(); - mBackStack = in.createTypedArray(BackStackState.CREATOR); - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel dest, int flags) { - dest.writeTypedArray(mActive, flags); - dest.writeIntArray(mAdded); - dest.writeTypedArray(mBackStack, flags); - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public FragmentManagerState createFromParcel(Parcel in) { - return new FragmentManagerState(in); - } - - public FragmentManagerState[] newArray(int size) { - return new FragmentManagerState[size]; - } - }; -} - -/** - * Container for fragments associated with an activity. - */ -final class FragmentManagerImpl extends FragmentManager { - static boolean DEBUG = false; - static final String TAG = "FragmentManager"; - - //v4 static final boolean HONEYCOMB = android.os.Build.VERSION.SDK_INT >= 11; - static final boolean HONEYCOMB = android.support.v2.os.Build.VERSION.SDK_INT >= 11; - - static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state"; - static final String TARGET_STATE_TAG = "android:target_state"; - static final String VIEW_STATE_TAG = "android:view_state"; - - ArrayList mPendingActions; - Runnable[] mTmpActions; - boolean mExecutingActions; - - ArrayList mActive; - ArrayList mAdded; - ArrayList mAvailIndices; - ArrayList mBackStack; - ArrayList mCreatedMenus; - - // Must be accessed while locked. - ArrayList mBackStackIndices; - ArrayList mAvailBackStackIndices; - - ArrayList mBackStackChangeListeners; - - int mCurState = Fragment.INITIALIZING; - FragmentActivity mActivity; - - boolean mNeedMenuInvalidate; - boolean mStateSaved; - boolean mDestroyed; - String mNoTransactionsBecause; - - // Temporary vars for state save and restore. - Bundle mStateBundle = null; - SparseArray mStateArray = null; - - Runnable mExecCommit = new Runnable() { - @Override - public void run() { - execPendingActions(); - } - }; - - @Override - public FragmentTransaction beginTransaction() { - return new BackStackRecord(this); - } - - @Override - public boolean executePendingTransactions() { - return execPendingActions(); - } - - @Override - public void popBackStack() { - enqueueAction(new Runnable() { - @Override public void run() { - popBackStackState(mActivity.mHandler, null, -1, 0); - } - }, false); - } - - @Override - public boolean popBackStackImmediate() { - checkStateLoss(); - executePendingTransactions(); - return popBackStackState(mActivity.mHandler, 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); - } - }, false); - } - - @Override - public boolean popBackStackImmediate(String name, int flags) { - checkStateLoss(); - executePendingTransactions(); - return popBackStackState(mActivity.mHandler, name, -1, flags); - } - - @Override - public void popBackStack(final int id, final int flags) { - if (id < 0) { - throw new IllegalArgumentException("Bad id: " + id); - } - enqueueAction(new Runnable() { - @Override public void run() { - popBackStackState(mActivity.mHandler, null, id, flags); - } - }, false); - } - - @Override - public boolean popBackStackImmediate(int id, int flags) { - checkStateLoss(); - executePendingTransactions(); - if (id < 0) { - throw new IllegalArgumentException("Bad id: " + id); - } - return popBackStackState(mActivity.mHandler, null, id, flags); - } - - @Override - public int getBackStackEntryCount() { - return mBackStack != null ? mBackStack.size() : 0; - } - - @Override - public BackStackEntry getBackStackEntryAt(int index) { - return mBackStack.get(index); - } - - @Override - public void addOnBackStackChangedListener(OnBackStackChangedListener listener) { - if (mBackStackChangeListeners == null) { - mBackStackChangeListeners = new ArrayList(); - } - mBackStackChangeListeners.add(listener); - } - - @Override - public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) { - if (mBackStackChangeListeners != null) { - mBackStackChangeListeners.remove(listener); - } - } - - @Override - public void putFragment(Bundle bundle, String key, Fragment fragment) { - if (fragment.mIndex < 0) { - throw new IllegalStateException("Fragment " + fragment - + " is not currently in the FragmentManager"); - } - bundle.putInt(key, fragment.mIndex); - } - - @Override - public Fragment getFragment(Bundle bundle, String key) { - int index = bundle.getInt(key, -1); - if (index == -1) { - return null; - } - if (index >= mActive.size()) { - throw new IllegalStateException("Fragement no longer exists for key " - + key + ": index " + index); - } - Fragment f = mActive.get(index); - if (f == null) { - throw new IllegalStateException("Fragement no longer exists for key " - + key + ": index " + index); - } - return f; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(128); - sb.append("FragmentManager{"); - sb.append(Integer.toHexString(System.identityHashCode(this))); - sb.append(" in "); - DebugUtils.buildShortClassTag(mActivity, sb); - sb.append("}}"); - return sb.toString(); - } - - @Override - public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { - String innerPrefix = prefix + " "; - - int N; - if (mActive != null) { - N = mActive.size(); - if (N > 0) { - writer.print(prefix); writer.print("Active Fragments in "); - writer.print(Integer.toHexString(System.identityHashCode(this))); - writer.println(":"); - for (int i=0; i 0) { - writer.print(prefix); writer.println("Added Fragments:"); - for (int i=0; i 0) { - writer.print(prefix); writer.println("Fragments Created Menus:"); - for (int i=0; i 0) { - writer.print(prefix); writer.println("Back Stack:"); - for (int i=0; i 0) { - writer.print(prefix); writer.println("Back Stack Indices:"); - for (int i=0; i 0) { - writer.print(prefix); writer.print("mAvailBackStackIndices: "); - writer.println(Arrays.toString(mAvailBackStackIndices.toArray())); - } - } - - if (mPendingActions != null) { - N = mPendingActions.size(); - if (N > 0) { - writer.print(prefix); writer.println("Pending Actions:"); - for (int i=0; i Fragment.CREATED) { - newState = Fragment.CREATED; - } - - 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 - // being reloaded from the layout. - if (f.mFromLayout && !f.mInLayout) { - return; - } - if (f.mAnimatingAway != null) { - // The fragment is currently being animated... but! Now we - // want to move our state back up. Give up on waiting for the - // animation, move to whatever the final state should be once - // the animation is done, and then we can proceed from there. - f.mAnimatingAway = null; - moveToState(f, f.mStateAfterAnimating, 0, 0); - } - switch (f.mState) { - case Fragment.INITIALIZING: - if (DEBUG) Log.v(TAG, "moveto CREATED: " + f); - if (f.mSavedFragmentState != null) { - f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray( - FragmentManagerImpl.VIEW_STATE_TAG); - f.mTarget = getFragment(f.mSavedFragmentState, - FragmentManagerImpl.TARGET_STATE_TAG); - if (f.mTarget != null) { - f.mTargetRequestCode = f.mSavedFragmentState.getInt( - FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0); - } - } - f.mActivity = mActivity; - f.mFragmentManager = mActivity.mFragments; - f.mCalled = false; - f.onAttach(mActivity); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onAttach()"); - } - mActivity.onAttachFragment(f); - - if (!f.mRetaining) { - f.mCalled = false; - f.onCreate(f.mSavedFragmentState); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onCreate()"); - } - } - f.mRetaining = false; - if (f.mFromLayout) { - // For fragments that are part of the content view - // layout, we need to instantiate the view immediately - // and the inflater will take care of adding it. - f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), - null, f.mSavedFragmentState); - if (f.mView != null) { - f.mInnerView = f.mView; - f.mView = NoSaveStateFrameLayout.wrap(f.mView); - f.restoreViewState(); - if (f.mHidden) f.mView.setVisibility(View.GONE); - } else { - f.mInnerView = null; - } - } - case Fragment.CREATED: - if (newState > Fragment.CREATED) { - if (DEBUG) Log.v(TAG, "moveto CONTENT: " + f); - if (!f.mFromLayout) { - ViewGroup container = null; - if (f.mContainerId != 0) { - container = (ViewGroup)mActivity.findViewById(f.mContainerId); - if (container == null && !f.mRestored) { - throw new IllegalArgumentException("No view found for id 0x" - + Integer.toHexString(f.mContainerId) - + " for fragment " + f); - } - } - f.mContainer = container; - f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState), - container, f.mSavedFragmentState); - if (f.mView != null) { - f.mInnerView = f.mView; - f.mView = NoSaveStateFrameLayout.wrap(f.mView); - if (container != null) { - Animation anim = loadAnimation(f, transit, true, - transitionStyle); - if (anim != null) { - f.mView.startAnimation(anim); - } - container.addView(f.mView); - f.restoreViewState(); - } - if (f.mHidden) f.mView.setVisibility(View.GONE); - } else { - f.mInnerView = null; - } - } - - f.mCalled = false; - f.onActivityCreated(f.mSavedFragmentState); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onActivityCreated()"); - } - f.mSavedFragmentState = null; - } - case Fragment.ACTIVITY_CREATED: - if (newState > Fragment.ACTIVITY_CREATED) { - if (DEBUG) Log.v(TAG, "moveto STARTED: " + f); - f.mCalled = false; - f.onStart(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onStart()"); - } - } - case Fragment.STARTED: - if (newState > Fragment.STARTED) { - if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f); - f.mCalled = false; - f.mResumed = true; - f.onResume(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onResume()"); - } - } - } - } else if (f.mState > newState) { - switch (f.mState) { - case Fragment.RESUMED: - if (newState < Fragment.RESUMED) { - if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f); - f.mCalled = false; - f.onPause(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onPause()"); - } - f.mResumed = false; - } - case Fragment.STARTED: - if (newState < Fragment.STARTED) { - if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f); - f.mCalled = false; - f.performStop(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onStop()"); - } - } - case Fragment.ACTIVITY_CREATED: - if (newState < Fragment.ACTIVITY_CREATED) { - if (DEBUG) Log.v(TAG, "movefrom CONTENT: " + f); - if (f.mView != null) { - // Need to save the current view state if not - // done already. - if (!mActivity.isFinishing() && f.mSavedViewState == null) { - saveFragmentViewState(f); - } - } - f.mCalled = false; - f.onDestroyView(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onDestroyView()"); - } - if (f.mView != null && f.mContainer != null) { - Animation anim = null; - if (mCurState > Fragment.INITIALIZING && !mDestroyed) { - anim = loadAnimation(f, transit, false, - transitionStyle); - } - if (anim != null) { - final Fragment fragment = f; - f.mAnimatingAway = f.mView; - f.mStateAfterAnimating = newState; - anim.setAnimationListener(new AnimationListener() { - @Override - public void onAnimationEnd(Animation animation) { - if (fragment.mAnimatingAway != null) { - fragment.mAnimatingAway = null; - moveToState(fragment, fragment.mStateAfterAnimating, - 0, 0); - } - } - @Override - public void onAnimationRepeat(Animation animation) { - } - @Override - public void onAnimationStart(Animation animation) { - } - }); - f.mView.startAnimation(anim); - } - f.mContainer.removeView(f.mView); - } - f.mContainer = null; - f.mView = null; - f.mInnerView = null; - } - case Fragment.CREATED: - if (newState < Fragment.CREATED) { - if (mDestroyed) { - if (f.mAnimatingAway != null) { - // The fragment's containing activity is - // being destroyed, but this fragment is - // currently animating away. Stop the - // animation right now -- it is not needed, - // and we can't wait any more on destroying - // the fragment. - View v = f.mAnimatingAway; - f.mAnimatingAway = null; - v.clearAnimation(); - } - } - if (f.mAnimatingAway != null) { - // We are waiting for the fragment's view to finish - // animating away. Just make a note of the state - // the fragment now should move to once the animation - // is done. - f.mStateAfterAnimating = newState; - } else { - if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f); - if (!f.mRetaining) { - f.mCalled = false; - f.onDestroy(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onDestroy()"); - } - } - - f.mCalled = false; - f.onDetach(); - if (!f.mCalled) { - throw new SuperNotCalledException("Fragment " + f - + " did not call through to super.onDetach()"); - } - f.mImmediateActivity = null; - f.mActivity = null; - f.mFragmentManager = null; - } - } - } - } - - f.mState = newState; - } - - void moveToState(Fragment f) { - moveToState(f, mCurState, 0, 0); - } - - void moveToState(int newState, boolean always) { - moveToState(newState, 0, 0, always); - } - - void moveToState(int newState, int transit, int transitStyle, boolean always) { - if (mActivity == null && newState != Fragment.INITIALIZING) { - throw new IllegalStateException("No activity"); - } - - if (!always && mCurState == newState) { - return; - } - - mCurState = newState; - if (mActive != null) { - for (int i=0; i= 0) { - return; - } - - if (mAvailIndices == null || mAvailIndices.size() <= 0) { - if (mActive == null) { - mActive = new ArrayList(); - } - f.setIndex(mActive.size()); - mActive.add(f); - - } else { - f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); - mActive.set(f.mIndex, f); - } - } - - void makeInactive(Fragment f) { - if (f.mIndex < 0) { - return; - } - - if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); - mActive.set(f.mIndex, null); - if (mAvailIndices == null) { - mAvailIndices = new ArrayList(); - } - mAvailIndices.add(f.mIndex); - mActivity.invalidateSupportFragmentIndex(f.mIndex); - f.clearIndex(); - } - - public void addFragment(Fragment fragment, boolean moveToStateNow) { - if (mAdded == null) { - mAdded = new ArrayList(); - } - mAdded.add(fragment); - makeActive(fragment); - if (DEBUG) Log.v(TAG, "add: " + fragment); - fragment.mAdded = true; - fragment.mRemoving = false; - if (fragment.mHasMenu) { - mNeedMenuInvalidate = true; - } - if (moveToStateNow) { - moveToState(fragment); - } - } - - public void removeFragment(Fragment fragment, int transition, int transitionStyle) { - if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); - mAdded.remove(fragment); - final boolean inactive = fragment.mBackStackNesting <= 0; - if (fragment.mHasMenu) { - mNeedMenuInvalidate = true; - } - fragment.mAdded = false; - fragment.mRemoving = true; - moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, - transition, transitionStyle); - if (inactive) { - makeInactive(fragment); - } - } - - public void hideFragment(Fragment fragment, int transition, int transitionStyle) { - if (DEBUG) Log.v(TAG, "hide: " + fragment); - if (!fragment.mHidden) { - fragment.mHidden = true; - if (fragment.mView != null) { - Animation anim = loadAnimation(fragment, transition, true, - transitionStyle); - if (anim != null) { - fragment.mView.startAnimation(anim); - } - fragment.mView.setVisibility(View.GONE); - } - if (fragment.mAdded && fragment.mHasMenu) { - mNeedMenuInvalidate = true; - } - fragment.onHiddenChanged(true); - } - } - - public void showFragment(Fragment fragment, int transition, int transitionStyle) { - if (DEBUG) Log.v(TAG, "show: " + fragment); - if (fragment.mHidden) { - fragment.mHidden = false; - if (fragment.mView != null) { - Animation anim = loadAnimation(fragment, transition, true, - transitionStyle); - if (anim != null) { - fragment.mView.startAnimation(anim); - } - fragment.mView.setVisibility(View.VISIBLE); - } - if (fragment.mAdded && fragment.mHasMenu) { - mNeedMenuInvalidate = true; - } - fragment.onHiddenChanged(false); - } - } - - public Fragment findFragmentById(int id) { - if (mActive != null) { - // First look through added fragments. - for (int i=mAdded.size()-1; i>=0; i--) { - Fragment f = mAdded.get(i); - if (f != null && f.mFragmentId == id) { - return f; - } - } - // Now for any known fragment. - for (int i=mActive.size()-1; i>=0; i--) { - Fragment f = mActive.get(i); - if (f != null && f.mFragmentId == id) { - return f; - } - } - } - return null; - } - - public Fragment findFragmentByTag(String tag) { - if (mActive != null && tag != null) { - // First look through added fragments. - for (int i=mAdded.size()-1; i>=0; i--) { - Fragment f = mAdded.get(i); - if (f != null && tag.equals(f.mTag)) { - return f; - } - } - // Now for any known fragment. - for (int i=mActive.size()-1; i>=0; i--) { - Fragment f = mActive.get(i); - if (f != null && tag.equals(f.mTag)) { - return f; - } - } - } - return null; - } - - public Fragment findFragmentByWho(String who) { - if (mActive != null && who != null) { - for (int i=mActive.size()-1; i>=0; i--) { - Fragment f = mActive.get(i); - if (f != null && who.equals(f.mWho)) { - return f; - } - } - } - return null; - } - - private void checkStateLoss() { - if (mStateSaved) { - throw new IllegalStateException( - "Can not perform this action after onSaveInstanceState"); - } - if (mNoTransactionsBecause != null) { - throw new IllegalStateException( - "Can not perform this action inside of " + mNoTransactionsBecause); - } - } - - public void enqueueAction(Runnable action, boolean allowStateLoss) { - if (!allowStateLoss) { - checkStateLoss(); - } - synchronized (this) { - if (mActivity == null) { - throw new IllegalStateException("Activity has been destroyed"); - } - if (mPendingActions == null) { - mPendingActions = new ArrayList(); - } - mPendingActions.add(action); - if (mPendingActions.size() == 1) { - mActivity.mHandler.removeCallbacks(mExecCommit); - mActivity.mHandler.post(mExecCommit); - } - } - } - - public int allocBackStackIndex(BackStackRecord bse) { - synchronized (this) { - if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) { - if (mBackStackIndices == null) { - mBackStackIndices = new ArrayList(); - } - int index = mBackStackIndices.size(); - if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); - mBackStackIndices.add(bse); - return index; - - } else { - int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1); - if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); - mBackStackIndices.set(index, bse); - return index; - } - } - } - - public void setBackStackIndex(int index, BackStackRecord bse) { - synchronized (this) { - if (mBackStackIndices == null) { - mBackStackIndices = new ArrayList(); - } - int N = mBackStackIndices.size(); - if (index < N) { - if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse); - mBackStackIndices.set(index, bse); - } else { - while (N < index) { - mBackStackIndices.add(null); - if (mAvailBackStackIndices == null) { - mAvailBackStackIndices = new ArrayList(); - } - if (DEBUG) Log.v(TAG, "Adding available back stack index " + N); - mAvailBackStackIndices.add(N); - N++; - } - if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse); - mBackStackIndices.add(bse); - } - } - } - - public void freeBackStackIndex(int index) { - synchronized (this) { - mBackStackIndices.set(index, null); - if (mAvailBackStackIndices == null) { - mAvailBackStackIndices = new ArrayList(); - } - if (DEBUG) Log.v(TAG, "Freeing back stack index " + index); - mAvailBackStackIndices.add(index); - } - } - - /** - * Only call from main thread! - */ - public boolean execPendingActions() { - if (mExecutingActions) { - throw new IllegalStateException("Recursive entry to executePendingTransactions"); - } - - if (Looper.myLooper() != mActivity.mHandler.getLooper()) { - throw new IllegalStateException("Must be called from main thread of process"); - } - - boolean didSomething = false; - - while (true) { - int numActions; - - synchronized (this) { - if (mPendingActions == null || mPendingActions.size() == 0) { - return didSomething; - } - - numActions = mPendingActions.size(); - if (mTmpActions == null || mTmpActions.length < numActions) { - mTmpActions = new Runnable[numActions]; - } - mPendingActions.toArray(mTmpActions); - mPendingActions.clear(); - mActivity.mHandler.removeCallbacks(mExecCommit); - } - - mExecutingActions = true; - for (int i=0; i(); - } - mBackStack.add(state); - reportBackStackChanged(); - } - - boolean popBackStackState(Handler handler, String name, int id, int flags) { - if (mBackStack == null) { - return false; - } - if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) { - int last = mBackStack.size()-1; - if (last < 0) { - return false; - } - final BackStackRecord bss = mBackStack.remove(last); - bss.popFromBackStack(true); - reportBackStackChanged(); - } else { - int index = -1; - if (name != null || id >= 0) { - // If a name or ID is specified, look for that place in - // the stack. - index = mBackStack.size()-1; - while (index >= 0) { - BackStackRecord bss = mBackStack.get(index); - if (name != null && name.equals(bss.getName())) { - break; - } - if (id >= 0 && id == bss.mIndex) { - break; - } - index--; - } - if (index < 0) { - return false; - } - if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) { - index--; - // Consume all following entries that match. - while (index >= 0) { - BackStackRecord bss = mBackStack.get(index); - if ((name != null && name.equals(bss.getName())) - || (id >= 0 && id == bss.mIndex)) { - index--; - continue; - } - break; - } - } - } - if (index == mBackStack.size()-1) { - return false; - } - final ArrayList states - = new ArrayList(); - for (int i=mBackStack.size()-1; i>index; i--) { - states.add(mBackStack.remove(i)); - } - final int LAST = states.size()-1; - for (int i=0; i<=LAST; i++) { - if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); - states.get(i).popFromBackStack(i == LAST); - } - reportBackStackChanged(); - } - return true; - } - - ArrayList retainNonConfig() { - ArrayList fragments = null; - if (mActive != null) { - for (int i=0; i(); - } - fragments.add(f); - f.mRetaining = true; - } - } - } - return fragments; - } - - void saveFragmentViewState(Fragment f) { - if (f.mInnerView == null) { - return; - } - if (mStateArray == null) { - mStateArray = new SparseArray(); - } - f.mInnerView.saveHierarchyState(mStateArray); - if (mStateArray.size() > 0) { - f.mSavedViewState = mStateArray; - mStateArray = null; - } - } - - Parcelable saveAllState() { - // Make sure all pending operations have now been executed to get - // our state update-to-date. - execPendingActions(); - - if (HONEYCOMB) { - // As of Honeycomb, we save state after pausing. Prior to that - // it is before pausing. With fragments this is an issue, since - // there are many things you may do after pausing but before - // stopping that change the fragment state. For those older - // devices, we will not at this point say that we have saved - // the state, so we will allow them to continue doing fragment - // transactions. This retains the same semantics as Honeycomb, - // though you do have the risk of losing the very most recent state - // if the process is killed... we'll live with that. - mStateSaved = true; - } - - if (mActive == null || mActive.size() <= 0) { - return null; - } - - // First collect all active fragments. - int N = mActive.size(); - FragmentState[] active = new FragmentState[N]; - boolean haveFragments = false; - for (int i=0; i Fragment.INITIALIZING && fs.mSavedFragmentState == null) { - if (mStateBundle == null) { - mStateBundle = new Bundle(); - } - f.onSaveInstanceState(mStateBundle); - if (!mStateBundle.isEmpty()) { - fs.mSavedFragmentState = mStateBundle; - mStateBundle = null; - } - - if (f.mView != null) { - saveFragmentViewState(f); - if (f.mSavedViewState != null) { - if (fs.mSavedFragmentState == null) { - fs.mSavedFragmentState = new Bundle(); - } - fs.mSavedFragmentState.putSparseParcelableArray( - FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState); - } - } - - if (f.mTarget != null) { - if (f.mTarget.mIndex < 0) { - String msg = "Failure saving state: " + f - + " has target not in fragment manager: " + f.mTarget; - Log.e(TAG, msg); - dump(" ", null, new PrintWriter(new LogWriter(TAG)), new String[] { }); - throw new IllegalStateException(msg); - } - if (fs.mSavedFragmentState == null) { - fs.mSavedFragmentState = new Bundle(); - } - putFragment(fs.mSavedFragmentState, - FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget); - if (f.mTargetRequestCode != 0) { - fs.mSavedFragmentState.putInt( - FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, - f.mTargetRequestCode); - } - } - - } else { - fs.mSavedFragmentState = f.mSavedFragmentState; - } - - if (DEBUG) Log.v(TAG, "Saved state of " + f + ": " - + fs.mSavedFragmentState); - } - } - - if (!haveFragments) { - if (DEBUG) Log.v(TAG, "saveAllState: no fragments!"); - return null; - } - - int[] added = null; - BackStackState[] backStack = null; - - // Build list of currently added fragments. - if (mAdded != null) { - N = mAdded.size(); - if (N > 0) { - added = new int[N]; - for (int i=0; i 0) { - backStack = new BackStackState[N]; - for (int i=0; i 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; - FragmentManagerState fms = (FragmentManagerState)state; - if (fms.mActive == null) return; - - // First re-attach any non-config instances we are retaining back - // to their saved state, so we don't try to instantiate them again. - if (nonConfig != null) { - for (int i=0; i(fms.mActive.length); - if (mAvailIndices != null) { - mAvailIndices.clear(); - } - for (int i=0; i(); - } - if (DEBUG) Log.v(TAG, "restoreAllState: adding avail #" + i); - mAvailIndices.add(i); - } - } - - // Update the target of all retained fragments. - if (nonConfig != null) { - for (int i=0; i(fms.mAdded.length); - for (int i=0; i(fms.mBackStack.length); - for (int i=0; i= 0) { - setBackStackIndex(bse.mIndex, bse); - } - } - } else { - mBackStack = null; - } - } - - public void attachActivity(FragmentActivity activity) { - if (mActivity != null) throw new IllegalStateException(); - mActivity = activity; - } - - public void noteStateNotSaved() { - mStateSaved = false; - } - - public void dispatchCreate() { - mStateSaved = false; - moveToState(Fragment.CREATED, false); - } - - public void dispatchActivityCreated() { - mStateSaved = false; - moveToState(Fragment.ACTIVITY_CREATED, false); - } - - public void dispatchStart() { - mStateSaved = false; - moveToState(Fragment.STARTED, false); - } - - public void dispatchResume() { - mStateSaved = false; - moveToState(Fragment.RESUMED, false); - } - - public void dispatchPause() { - moveToState(Fragment.STARTED, false); - } - - public void dispatchStop() { - // See saveAllState() for the explanation of this. We do this for - // all platform versions, to keep our behavior more consistent between - // them. - mStateSaved = true; - - moveToState(Fragment.ACTIVITY_CREATED, false); - } - - public void dispatchReallyStop(boolean retaining) { - if (mActive != null) { - for (int i=0; i newMenus = null; - if (mActive != null) { - for (int i=0; i(); - } - newMenus.add(f); - } - } - } - - if (mCreatedMenus != null) { - for (int i=0; i