Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df8e542a authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Redefine FLAG_ACTIVITY_NEW_DOCUMENT without NEW_TASK" into lmp-preview-dev

parents d478a3a0 f357c0ca
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -7544,12 +7544,12 @@ package android.content {
    field public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; // 0x400000
    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
    field public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864; // 0x4000000
    field public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000
    field public static final deprecated int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000
    field public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; // 0x800000
    field public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; // 0x2000000
    field public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; // 0x100000
    field public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 134217728; // 0x8000000
    field public static final int FLAG_ACTIVITY_NEW_DOCUMENT = 268959744; // 0x10080000
    field public static final int FLAG_ACTIVITY_NEW_DOCUMENT = 524288; // 0x80000
    field public static final int FLAG_ACTIVITY_NEW_TASK = 268435456; // 0x10000000
    field public static final int FLAG_ACTIVITY_NO_ANIMATION = 65536; // 0x10000
    field public static final int FLAG_ACTIVITY_NO_HISTORY = 1073741824; // 0x40000000
@@ -8000,6 +8000,7 @@ package android.content.pm {
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int DOCUMENT_LAUNCH_ALWAYS = 2; // 0x2
    field public static final int DOCUMENT_LAUNCH_INTO_EXISTING = 1; // 0x1
    field public static final int DOCUMENT_LAUNCH_NEVER = 3; // 0x3
    field public static final int DOCUMENT_LAUNCH_NONE = 0; // 0x0
    field public static final int FLAG_ALLOW_TASK_REPARENTING = 64; // 0x40
    field public static final int FLAG_ALWAYS_RETAIN_TASK_STATE = 8; // 0x8
+3 −26
Original line number Diff line number Diff line
@@ -3707,30 +3707,8 @@ public class Intent implements Parcelable, Cloneable {
     */
    public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 0x00100000;
    /**
     * If set, this marks a point in the task's activity stack that should
     * be cleared when the task is reset.  That is, the next time the task
     * is brought to the foreground with
     * {@link #FLAG_ACTIVITY_RESET_TASK_IF_NEEDED} (typically as a result of
     * the user re-launching it from home), this activity and all on top of
     * it will be finished so that the user does not return to them, but
     * instead returns to whatever activity preceeded it.
     *
     * <p>When this flag is assigned to the root activity all activities up
     * to, but not including the root activity, will be cleared. This prevents
     * this flag from being used to finish all activities in a task and thereby
     * ending the task.
     *
     * <p>This is useful for cases where you have a logical break in your
     * application.  For example, an e-mail application may have a command
     * to view an attachment, which launches an image view activity to
     * display it.  This activity should be part of the e-mail application's
     * task, since it is a part of the task the user is involved in.  However,
     * if the user leaves that task, and later selects the e-mail app from
     * home, we may like them to return to the conversation they were
     * viewing, not the picture attachment, since that is confusing.  By
     * setting this flag when launching the image viewer, that viewer and
     * any activities it starts will be removed the next time the user returns
     * to mail.
     * @deprecated As of API 21 this performs identically to
     * {@link #FLAG_ACTIVITY_NEW_DOCUMENT} which should be used instead of this.
     */
    public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 0x00080000;
    /**
@@ -3757,8 +3735,7 @@ public class Intent implements Parcelable, Cloneable {
     * @see android.R.attr#documentLaunchMode
     * @see #FLAG_ACTIVITY_MULTIPLE_TASK
     */
    public static final int FLAG_ACTIVITY_NEW_DOCUMENT =
            FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | FLAG_ACTIVITY_NEW_TASK;
    public static final int FLAG_ACTIVITY_NEW_DOCUMENT = FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
    /**
     * If set, this flag will prevent the normal {@link android.app.Activity#onUserLeaveHint}
     * callback from occurring on the current frontmost activity before it is
+5 −0
Original line number Diff line number Diff line
@@ -83,6 +83,11 @@ public class ActivityInfo extends ComponentInfo
     * the {@link android.R.attr#documentLaunchMode} attribute.
     */
    public static final int DOCUMENT_LAUNCH_ALWAYS = 2;
    /**
     * Constant corresponding to <code>never</code> in
     * the {@link android.R.attr#documentLaunchMode} attribute.
     */
    public static final int DOCUMENT_LAUNCH_NEVER = 3;
    /**
     * The document launch mode style requested by the activity. From the
     * {@link android.R.attr#documentLaunchMode} attribute, one of
+20 −7
Original line number Diff line number Diff line
@@ -898,16 +898,22 @@
         android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} to every Intent used to launch
         the activity.

         <p>The documentLaunchMode attribute may be assigned one of three values, "none",
         "intoExisting" and "always", described in detail below. For values other than
         <code>none</code> the activity must be defined with
         {@link android.R.attr#launchMode} <code>standard</code> or <code>singleTop</code>.
         <p>The documentLaunchMode attribute may be assigned one of four values, "none",
         "intoExisting", "always" and "never", described in detail below. For values other than
         <code>none</code> and <code>never</code> the activity must be defined with
         {@link android.R.attr#launchMode} <code>standard</code>.
         If this attribute is not specified, <code>none</code> will be used.
         Note that <code>none</code> can be overridden at run time if the Intent used
         to launch it contains the flag {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}.
         to launch it contains the flag {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT
         Intent.FLAG_ACTIVITY_NEW_DOCUMENT}.
         Similarly <code>intoExisting</code> will be overridden by the flag
         {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} combined with
         {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}. -->
         {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT
         Intent.FLAG_ACTIVITY_NEW_DOCUMENT} combined with
         {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK
         Intent.FLAG_ACTIVITY_MULTIPLE_TASK}. If the value of
         documentLaunchModes is <code>never</code> then any use of
.........{@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT
         Intent.FLAG_ACTIVITY_NEW_DOCUMENT} to launch this activity will be ignored. -->
    <attr name="documentLaunchMode">
        <!-- The default mode, which will create a new task only when
             {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK
@@ -931,6 +937,13 @@
             and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK
             Intent.FLAG_ACTIVITY_MULTIPLE_TASK} both set. -->
        <enum name="always" value="2" />
        <!-- This activity will not be launched into a new document even if the Intent contains
             {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT
             Intent.FLAG_ACTIVITY_NEW_DOCUMENT}. This gives the activity writer ultimate
             control over how their activity is used. Note that applications prior to api
             21 will default to documentLaunchMode="none" so only activities that explicitly
             opt out with <code>"never"</code> may do so. -->
        <enum name="never" value="3" />
    </attr>

    <!-- The maximum number of entries of tasks rooted at this activity in the recent task list.
+44 −33
Original line number Diff line number Diff line
@@ -1460,6 +1460,47 @@ public final class ActivityStackSupervisor implements DisplayListener {

        int launchFlags = intent.getFlags();

        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
                (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE ||
                        r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK)) {
            // We have a conflict between the Intent and the Activity manifest, manifest wins.
            Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
                    "\"singleInstance\" or \"singleTask\"");
            launchFlags &=
                    ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        } else {
            switch (r.info.documentLaunchMode) {
                case ActivityInfo.DOCUMENT_LAUNCH_NONE:
                    break;
                case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
                    break;
                case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
                    break;
                case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
                    launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
                    break;
            }
        }

        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
            // For whatever reason this activity is being launched into a new
            // task...  yet the caller has requested a result back.  Well, that
            // is pretty messed up, so instead immediately send back a cancel
            // and let the new task continue launched as normal without a
            // dependency on its originator.
            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
            r.resultTo.task.stack.sendActivityResultLocked(-1,
                    r.resultTo, r.resultWho, r.requestCode,
                    Activity.RESULT_CANCELED, null);
            r.resultTo = null;
        }

        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) {
            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
        }

        // We'll invoke onUserLeaving before onPause only if the launching
        // activity did not explicitly state that this is an automated launch.
        mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
@@ -1490,20 +1531,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
            }
        }

        switch (r.info.documentLaunchMode) {
            case ActivityInfo.DOCUMENT_LAUNCH_NONE:
                break;
            case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
                intent.addFlags(
                        Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                launchFlags = intent.getFlags();
                break;
            case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
                launchFlags = intent.getFlags();
                break;
        }
        final boolean newDocument = intent.isDocument();
        if (sourceRecord == null) {
            // This activity is not being started from another...  in this
            // case we -always- start a new task.
@@ -1512,11 +1539,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
            }
        } else if (newDocument) {
            if (r.launchMode != ActivityInfo.LAUNCH_MULTIPLE) {
                Slog.w(TAG, "FLAG_ACTIVITY_NEW_DOCUMENT and launchMode != \"standard\"");
                r.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
            }
        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
            // The original activity who is starting us is running as a single
            // instance...  this new activity it is starting must go on its
@@ -1555,18 +1577,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            sourceStack = null;
        }

        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
            // For whatever reason this activity is being launched into a new
            // task...  yet the caller has requested a result back.  Well, that
            // is pretty messed up, so instead immediately send back a cancel
            // and let the new task continue launched as normal without a
            // dependency on its originator.
            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
            r.resultTo.task.stack.sendActivityResultLocked(-1,
                    r.resultTo, r.resultWho, r.requestCode,
                Activity.RESULT_CANCELED, null);
            r.resultTo = null;
        }
        intent.setFlags(launchFlags);

        boolean addingToTask = false;
        boolean movedHome = false;
Loading