diff options
| -rw-r--r-- | api/current.txt | 8 | ||||
| -rw-r--r-- | core/java/android/app/Activity.java | 43 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManagerNative.java | 14 | ||||
| -rw-r--r-- | core/java/android/app/Fragment.java | 7 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.java | 2 | ||||
| -rw-r--r-- | core/java/android/app/PendingIntent.java | 86 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 12 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ActivityManagerService.java | 17 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ActivityRecord.java | 24 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ActivityStack.java | 31 | ||||
| -rw-r--r-- | services/java/com/android/server/am/PendingIntentRecord.java | 11 |
11 files changed, 220 insertions, 35 deletions
diff --git a/api/current.txt b/api/current.txt index 541ce5116b57..505ee680dd61 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2864,6 +2864,12 @@ package android.app { field public android.content.ComponentName topActivity; } + public class ActivityOptions { + method public void join(android.app.ActivityOptions); + method public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int); + method public android.os.Bundle toBundle(); + } + public class AlarmManager { method public void cancel(android.app.PendingIntent); method public void set(int, long, android.app.PendingIntent); @@ -3728,7 +3734,9 @@ package android.app { method public void cancel(); method public int describeContents(); method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int); + method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle); method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int); + method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle); method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int); method public android.content.IntentSender getIntentSender(); method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index dc12acd51c0f..ea3274595ad4 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -32,7 +32,6 @@ import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; -import android.content.res.Resources.Theme; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -55,7 +54,6 @@ import android.util.AttributeSet; import android.util.EventLog; import android.util.Log; import android.util.SparseArray; -import android.util.TypedValue; import android.view.ActionMode; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -3208,7 +3206,8 @@ public class Activity extends ContextThemeWrapper * @param requestCode If >= 0, this code will be returned in * onActivityResult() when the activity exits. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException * @@ -3288,7 +3287,10 @@ public class Activity extends ContextThemeWrapper * <var>flagsMask</var> * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. If options + * have also been supplied by the IntentSender, options given here will + * override any that conflict with those given by the IntentSender. */ public void startIntentSenderForResult(IntentSender intent, int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, @@ -3369,7 +3371,8 @@ public class Activity extends ContextThemeWrapper * * @param intent The intent to start. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException * @@ -3417,7 +3420,8 @@ public class Activity extends ContextThemeWrapper * * @param intents The intents to start. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException * @@ -3465,7 +3469,10 @@ public class Activity extends ContextThemeWrapper * <var>flagsMask</var> * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. If options + * have also been supplied by the IntentSender, options given here will + * override any that conflict with those given by the IntentSender. */ public void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, @@ -3521,7 +3528,8 @@ public class Activity extends ContextThemeWrapper * onActivityResult() when the activity exits, as described in * {@link #startActivityForResult}. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @return If a new activity was launched then true is returned; otherwise * false is returned and you must handle the Intent yourself. @@ -3592,7 +3600,8 @@ public class Activity extends ContextThemeWrapper * your own activity; the only changes you can make are to the extras * inside of it. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @return Returns a boolean indicating whether there was another Activity * to start: true if there was a next activity to start, false if there @@ -3644,7 +3653,8 @@ public class Activity extends ContextThemeWrapper * @param intent The intent to start. * @param requestCode Reply request code. < 0 if reply is not requested. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException * @@ -3694,7 +3704,8 @@ public class Activity extends ContextThemeWrapper * @param intent The intent to start. * @param requestCode Reply request code. < 0 if reply is not requested. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException * @@ -3744,6 +3755,14 @@ public class Activity extends ContextThemeWrapper * Call immediately after one of the flavors of {@link #startActivity(Intent)} * or {@link #finish} to specify an explicit transition animation to * perform next. + * + * <p>As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN} an alternative + * to using this with starting activities is to supply the desired animation + * information through a {@link ActivityOptions} bundle to + * {@link #startActivity(Intent, Bundle) or a related function. This allows + * you to specify a custom animation even when starting an activity from + * outside the context of the current top activity. + * * @param enterAnim A resource ID of the animation resource to use for * the incoming activity. Use 0 for no animation. * @param exitAnim A resource ID of the animation resource to use for @@ -4065,7 +4084,7 @@ public class Activity extends ContextThemeWrapper ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName, mParent == null ? mToken : mParent.mToken, - mEmbeddedID, requestCode, new Intent[] { data }, null, flags); + mEmbeddedID, requestCode, new Intent[] { data }, null, flags, null); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { // Empty diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 732d211233ea..a3cc352f75d5 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -835,9 +835,11 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM requestResolvedTypes = null; } int fl = data.readInt(); + Bundle options = data.readInt() != 0 + ? Bundle.CREATOR.createFromParcel(data) : null; IIntentSender res = getIntentSender(type, packageName, token, resultWho, requestCode, requestIntents, - requestResolvedTypes, fl); + requestResolvedTypes, fl, options); reply.writeNoException(); reply.writeStrongBinder(res != null ? res.asBinder() : null); return true; @@ -2607,8 +2609,8 @@ class ActivityManagerProxy implements IActivityManager } public IIntentSender getIntentSender(int type, String packageName, IBinder token, String resultWho, - int requestCode, Intent[] intents, String[] resolvedTypes, int flags) - throws RemoteException { + int requestCode, Intent[] intents, String[] resolvedTypes, int flags, + Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); @@ -2625,6 +2627,12 @@ class ActivityManagerProxy implements IActivityManager data.writeInt(0); } data.writeInt(flags); + if (options != null) { + data.writeInt(1); + options.writeToParcel(data, 0); + } else { + data.writeInt(0); + } mRemote.transact(GET_INTENT_SENDER_TRANSACTION, data, reply, 0); reply.readException(); IIntentSender res = IIntentSender.Stub.asInterface( diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index dadc4e5ff593..c493f0fb9284 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -965,6 +965,8 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene /** * Call {@link Activity#startActivity(Intent)} on the fragment's * containing Activity. + * + * @param intent The intent to start. */ public void startActivity(Intent intent) { startActivity(intent, null); @@ -973,6 +975,11 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene /** * Call {@link Activity#startActivity(Intent, Bundle)} on the fragment's * containing Activity. + * + * @param intent The intent to start. + * @param options Additional options for how the Activity should be started. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. */ public void startActivity(Intent intent, Bundle options) { if (mActivity == null) { diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 9306bd2a1416..31066b5bb584 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -169,7 +169,7 @@ public interface IActivityManager extends IInterface { public IIntentSender getIntentSender(int type, String packageName, IBinder token, String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes, - int flags) throws RemoteException; + int flags, Bundle options) throws RemoteException; public void cancelIntentSender(IIntentSender sender) throws RemoteException; public boolean clearApplicationUserData(final String packageName, final IPackageDataObserver observer, int userId) throws RemoteException; diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index 57192c3c45e3..aa366b6af9a7 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -188,6 +188,35 @@ public final class PendingIntent implements Parcelable { */ public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) { + return getActivity(context, requestCode, intent, flags, null); + } + + /** + * Retrieve a PendingIntent that will start a new activity, like calling + * {@link Context#startActivity(Intent) Context.startActivity(Intent)}. + * Note that the activity will be started outside of the context of an + * existing activity, so you must use the {@link Intent#FLAG_ACTIVITY_NEW_TASK + * Intent.FLAG_ACTIVITY_NEW_TASK} launch flag in the Intent. + * + * @param context The Context in which this PendingIntent should start + * the activity. + * @param requestCode Private request code for the sender (currently + * not used). + * @param intent Intent of the activity to be launched. + * @param flags May be {@link #FLAG_ONE_SHOT}, {@link #FLAG_NO_CREATE}, + * {@link #FLAG_CANCEL_CURRENT}, {@link #FLAG_UPDATE_CURRENT}, + * or any of the flags as supported by + * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts + * of the intent that can be supplied when the actual send happens. + * @param options Additional options for how the Activity should be started. + * May be null if there are no options. + * + * @return Returns an existing or new PendingIntent matching the given + * parameters. May return null only if {@link #FLAG_NO_CREATE} has been + * supplied. + */ + public static PendingIntent getActivity(Context context, int requestCode, + Intent intent, int flags, Bundle options) { String packageName = context.getPackageName(); String resolvedType = intent != null ? intent.resolveTypeIfNeeded( context.getContentResolver()) : null; @@ -197,7 +226,8 @@ public final class PendingIntent implements Parcelable { ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_ACTIVITY, packageName, null, null, requestCode, new Intent[] { intent }, - resolvedType != null ? new String[] { resolvedType } : null, flags); + resolvedType != null ? new String[] { resolvedType } : null, + flags, options); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } @@ -247,6 +277,52 @@ public final class PendingIntent implements Parcelable { */ public static PendingIntent getActivities(Context context, int requestCode, Intent[] intents, int flags) { + return getActivities(context, requestCode, intents, flags, null); + } + + /** + * Like {@link #getActivity(Context, int, Intent, int)}, but allows an + * array of Intents to be supplied. The first Intent in the array is + * taken as the primary key for the PendingIntent, like the single Intent + * given to {@link #getActivity(Context, int, Intent, int)}. Upon sending + * the resulting PendingIntent, all of the Intents are started in the same + * way as they would be by passing them to {@link Context#startActivities(Intent[])}. + * + * <p class="note"> + * The <em>first</em> intent in the array will be started outside of the context of an + * existing activity, so you must use the {@link Intent#FLAG_ACTIVITY_NEW_TASK + * Intent.FLAG_ACTIVITY_NEW_TASK} launch flag in the Intent. (Activities after + * the first in the array are started in the context of the previous activity + * in the array, so FLAG_ACTIVITY_NEW_TASK is not needed nor desired for them.) + * </p> + * + * <p class="note"> + * The <em>last</em> intent in the array represents the key for the + * PendingIntent. In other words, it is the significant element for matching + * (as done with the single intent given to {@link #getActivity(Context, int, Intent, int)}, + * its content will be the subject of replacement by + * {@link #send(Context, int, Intent)} and {@link #FLAG_UPDATE_CURRENT}, etc. + * This is because it is the most specific of the supplied intents, and the + * UI the user actually sees when the intents are started. + * </p> + * + * @param context The Context in which this PendingIntent should start + * the activity. + * @param requestCode Private request code for the sender (currently + * not used). + * @param intents Array of Intents of the activities to be launched. + * @param flags May be {@link #FLAG_ONE_SHOT}, {@link #FLAG_NO_CREATE}, + * {@link #FLAG_CANCEL_CURRENT}, {@link #FLAG_UPDATE_CURRENT}, + * or any of the flags as supported by + * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts + * of the intent that can be supplied when the actual send happens. + * + * @return Returns an existing or new PendingIntent matching the given + * parameters. May return null only if {@link #FLAG_NO_CREATE} has been + * supplied. + */ + public static PendingIntent getActivities(Context context, int requestCode, + Intent[] intents, int flags, Bundle options) { String packageName = context.getPackageName(); String[] resolvedTypes = new String[intents.length]; for (int i=0; i<intents.length; i++) { @@ -257,7 +333,7 @@ public final class PendingIntent implements Parcelable { IIntentSender target = ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_ACTIVITY, packageName, - null, null, requestCode, intents, resolvedTypes, flags); + null, null, requestCode, intents, resolvedTypes, flags, options); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } @@ -294,7 +370,8 @@ public final class PendingIntent implements Parcelable { ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_BROADCAST, packageName, null, null, requestCode, new Intent[] { intent }, - resolvedType != null ? new String[] { resolvedType } : null, flags); + resolvedType != null ? new String[] { resolvedType } : null, + flags, null); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } @@ -332,7 +409,8 @@ public final class PendingIntent implements Parcelable { ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_SERVICE, packageName, null, null, requestCode, new Intent[] { intent }, - resolvedType != null ? new String[] { resolvedType } : null, flags); + resolvedType != null ? new String[] { resolvedType } : null, + flags, null); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 19a5bc0103fd..741a6e90b556 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -846,7 +846,9 @@ public abstract class Context { * * @param intent The description of the activity to start. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * May be null if there are no options. See {@link android.app.ActivityOptions} + * for how to build the Bundle supplied here; there are no supported definitions + * for building it manually. * * @throws ActivityNotFoundException * @@ -884,7 +886,8 @@ public abstract class Context { * * @param intents An array of Intents to be started. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. * * @throws ActivityNotFoundException * @@ -930,7 +933,10 @@ public abstract class Context { * <var>flagsMask</var> * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * May be null if there are no options. + * See {@link android.content.Context#startActivity(Intent, Bundle) + * Context.startActivity(Intent, Bundle)} for more details. If options + * have also been supplied by the IntentSender, options given here will + * override any that conflict with those given by the IntentSender. * * @see #startActivity(Intent, Bundle) * @see #startIntentSender(IntentSender, Intent, int, int, int) diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index caee1ab658e1..d21212fe6ecb 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -2258,7 +2258,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i=0; i<N; i++) { PendingActivityLaunch pal = mPendingActivityLaunches.get(i); mMainStack.startActivityUncheckedLocked(pal.r, pal.sourceRecord, - pal.startFlags, doResume && i == (N-1)); + pal.startFlags, doResume && i == (N-1), null); } mPendingActivityLaunches.clear(); } @@ -4252,7 +4252,8 @@ public final class ActivityManagerService extends ActivityManagerNative public IIntentSender getIntentSender(int type, String packageName, IBinder token, String resultWho, - int requestCode, Intent[] intents, String[] resolvedTypes, int flags) { + int requestCode, Intent[] intents, String[] resolvedTypes, + int flags, Bundle options) { enforceNotIsolatedCaller("getIntentSender"); // Refuse possible leaked file descriptors if (intents != null) { @@ -4278,6 +4279,11 @@ public final class ActivityManagerService extends ActivityManagerNative "Intent array length does not match resolvedTypes length"); } } + if (options != null) { + if (options.hasFileDescriptors()) { + throw new IllegalArgumentException("File descriptors passed in options"); + } + } synchronized(this) { int callingUid = Binder.getCallingUid(); @@ -4300,7 +4306,7 @@ public final class ActivityManagerService extends ActivityManagerNative Slog.i(TAG_MU, "Getting intent sender for origCallingUid=" + Binder.getOrigCallingUid()); return getIntentSenderLocked(type, packageName, Binder.getOrigCallingUid(), - token, resultWho, requestCode, intents, resolvedTypes, flags); + token, resultWho, requestCode, intents, resolvedTypes, flags, options); } catch (RemoteException e) { throw new SecurityException(e); @@ -4310,7 +4316,8 @@ public final class ActivityManagerService extends ActivityManagerNative IIntentSender getIntentSenderLocked(int type, String packageName, int callingUid, IBinder token, String resultWho, - int requestCode, Intent[] intents, String[] resolvedTypes, int flags) { + int requestCode, Intent[] intents, String[] resolvedTypes, int flags, + Bundle options) { if (DEBUG_MU) Slog.v(TAG_MU, "getIntentSenderLocked(): uid=" + callingUid); ActivityRecord activity = null; @@ -4332,7 +4339,7 @@ public final class ActivityManagerService extends ActivityManagerNative PendingIntentRecord.Key key = new PendingIntentRecord.Key( type, packageName, activity, resultWho, - requestCode, intents, resolvedTypes, flags); + requestCode, intents, resolvedTypes, flags, options); WeakReference<PendingIntentRecord> ref; ref = mIntentSenderRecords.get(key); PendingIntentRecord rec = ref != null ? ref.get() : null; diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java index b42d98ea844d..53cb2b07a337 100644 --- a/services/java/com/android/server/am/ActivityRecord.java +++ b/services/java/com/android/server/am/ActivityRecord.java @@ -20,6 +20,7 @@ import com.android.server.AttributeCache; import com.android.server.am.ActivityStack.ActivityState; import android.app.Activity; +import android.app.ActivityOptions; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -95,6 +96,7 @@ final class ActivityRecord { ArrayList results; // pending ActivityResult objs we have received HashSet<WeakReference<PendingIntentRecord>> pendingResults; // all pending intents for this act ArrayList newIntents; // any pending new intents for single-top mode + ActivityOptions pendingOptions; // most recently given options HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold UriPermissionOwner uriPermissions; // current special URI access perms. ProcessRecord app; // if non-null, hosting application @@ -538,6 +540,28 @@ final class ActivityRecord { } } + void updateOptionsLocked(Bundle options) { + if (options != null) { + pendingOptions = new ActivityOptions(options); + } + } + + void applyOptionsLocked() { + if (pendingOptions != null) { + if (pendingOptions.isCustomAnimation()) { + service.mWindowManager.overridePendingAppTransition( + pendingOptions.getPackageName(), + pendingOptions.getCustomEnterResId(), + pendingOptions.getCustomExitResId()); + } + pendingOptions = null; + } + } + + void clearOptionsLocked() { + pendingOptions = null; + } + void removeUriPermissionsLocked() { if (uriPermissions != null) { uriPermissions.removeUriPermissionsLocked(); diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 13ee008a6008..7e8df356e2a4 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -22,6 +22,7 @@ import com.android.server.am.ActivityManagerService.PendingActivityLaunch; import android.app.Activity; import android.app.ActivityManager; +import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IActivityManager; import android.app.IThumbnailRetriever; @@ -1456,6 +1457,7 @@ final class ActivityStack { // We are starting up the next activity, so tell the window manager // that the previous one will be hidden soon. This way it can know // to ignore it when computing the desired screen orientation. + boolean noAnim = false; if (prev != null) { if (prev.finishing) { if (DEBUG_TRANSITION) Slog.v(TAG, @@ -1474,6 +1476,7 @@ final class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare open transition: prev=" + prev); if (mNoAnimActivities.contains(next)) { + noAnim = true; mService.mWindowManager.prepareAppTransition( WindowManagerPolicy.TRANSIT_NONE, false); } else { @@ -1490,6 +1493,7 @@ final class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare open transition: no previous"); if (mNoAnimActivities.contains(next)) { + noAnim = true; mService.mWindowManager.prepareAppTransition( WindowManagerPolicy.TRANSIT_NONE, false); } else { @@ -1497,6 +1501,11 @@ final class ActivityStack { WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); } } + if (!noAnim) { + next.applyOptionsLocked(); + } else { + next.clearOptionsLocked(); + } if (next.app != null && next.app.thread != null) { if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); @@ -1655,7 +1664,7 @@ final class ActivityStack { } private final void startActivityLocked(ActivityRecord r, boolean newTask, - boolean doResume, boolean keepCurTransition) { + boolean doResume, boolean keepCurTransition, Bundle options) { final int NH = mHistory.size(); int addPos = -1; @@ -1748,6 +1757,7 @@ final class ActivityStack { : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); mNoAnimActivities.remove(r); } + r.updateOptionsLocked(options); mService.mWindowManager.addAppToken( addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen); boolean doShow = true; @@ -2457,7 +2467,7 @@ final class ActivityStack { } err = startActivityUncheckedLocked(r, sourceRecord, - startFlags, true); + startFlags, true, options); if (mDismissKeyguardOnNextActivity && mPausingActivity == null) { // Someone asked to have the keyguard dismissed on the next // activity start, but we are not actually doing an activity @@ -2480,7 +2490,8 @@ final class ActivityStack { } final int startActivityUncheckedLocked(ActivityRecord r, - ActivityRecord sourceRecord, int startFlags, boolean doResume) { + ActivityRecord sourceRecord, int startFlags, boolean doResume, + Bundle options) { final Intent intent = r.intent; final int callingUid = r.launchedFromUid; final int userId = r.userId; @@ -2591,6 +2602,7 @@ final class ActivityStack { // We really do want to push this one into the // user's face, right now. moveHomeToFrontFromLaunchLocked(launchFlags); + r.updateOptionsLocked(options); moveTaskToFrontLocked(taskTop.task, r); } } @@ -2794,6 +2806,7 @@ final class ActivityStack { if (where >= 0) { ActivityRecord top = moveActivityToFrontLocked(where); logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); + top.updateOptionsLocked(options); top.deliverNewIntentLocked(callingUid, r.intent); if (doResume) { resumeTopActivityLocked(null); @@ -2829,7 +2842,7 @@ final class ActivityStack { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); } logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); - startActivityLocked(r, newTask, doResume, keepCurTransition); + startActivityLocked(r, newTask, doResume, keepCurTransition, options); return ActivityManager.START_SUCCESS; } @@ -2944,7 +2957,7 @@ final class ActivityStack { ActivityManager.INTENT_SENDER_ACTIVITY, "android", realCallingUid, null, null, 0, new Intent[] { intent }, new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT - | PendingIntent.FLAG_ONE_SHOT); + | PendingIntent.FLAG_ONE_SHOT, null); Intent newIntent = new Intent(); if (requestCode >= 0) { @@ -3095,9 +3108,15 @@ final class ActivityStack { "FLAG_CANT_SAVE_STATE not supported here"); } + Bundle theseOptions; + if (options != null && i == intents.length-1) { + theseOptions = options; + } else { + theseOptions = null; + } int res = startActivityLocked(caller, intent, resolvedTypes[i], aInfo, resultTo, null, -1, callingPid, callingUid, - 0, options, componentSpecified, outActivity); + 0, theseOptions, componentSpecified, outActivity); if (res < 0) { return res; } diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java index 9676084d3455..ad15da1a9211 100644 --- a/services/java/com/android/server/am/PendingIntentRecord.java +++ b/services/java/com/android/server/am/PendingIntentRecord.java @@ -49,6 +49,7 @@ class PendingIntentRecord extends IIntentSender.Stub { final int requestCode; final Intent requestIntent; final String requestResolvedType; + final Bundle options; Intent[] allIntents; String[] allResolvedTypes; final int flags; @@ -57,7 +58,7 @@ class PendingIntentRecord extends IIntentSender.Stub { private static final int ODD_PRIME_NUMBER = 37; Key(int _t, String _p, ActivityRecord _a, String _w, - int _r, Intent[] _i, String[] _it, int _f) { + int _r, Intent[] _i, String[] _it, int _f, Bundle _o) { type = _t; packageName = _p; activity = _a; @@ -68,6 +69,7 @@ class PendingIntentRecord extends IIntentSender.Stub { allIntents = _i; allResolvedTypes = _it; flags = _f; + options = _o; int hash = 23; hash = (ODD_PRIME_NUMBER*hash) + _f; @@ -215,6 +217,13 @@ class PendingIntentRecord extends IIntentSender.Stub { boolean sendFinish = finishedReceiver != null; switch (key.type) { case ActivityManager.INTENT_SENDER_ACTIVITY: + if (options == null) { + options = key.options; + } else if (key.options != null) { + Bundle opts = new Bundle(key.options); + opts.putAll(options); + options = opts; + } try { if (key.allIntents != null && key.allIntents.length > 1) { Intent[] allIntents = new Intent[key.allIntents.length]; |