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

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

Merge "Modify task navigation to return to recent tasks. DO NOT MERGE" into lmp-preview-dev

parents 0833d2bc e67a784e
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -1143,6 +1143,12 @@ public interface WindowManagerPolicy {
     */
     */
    public void setLastInputMethodWindowLw(WindowState ime, WindowState target);
    public void setLastInputMethodWindowLw(WindowState ime, WindowState target);


    /**
     * Show the recents task list app.
     * @hide
     */
    public void showRecentApps();

    /**
    /**
     * @return The current height of the input method window.
     * @return The current height of the input method window.
     */
     */
+10 −0
Original line number Original line Diff line number Diff line
@@ -478,6 +478,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private static final int MSG_DISABLE_POINTER_LOCATION = 2;
    private static final int MSG_DISABLE_POINTER_LOCATION = 2;
    private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
    private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
    private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
    private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
    private static final int MSG_DISPATCH_SHOW_RECENTS = 5;


    private class PolicyHandler extends Handler {
    private class PolicyHandler extends Handler {
        @Override
        @Override
@@ -495,6 +496,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                case MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK:
                case MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK:
                    dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj);
                    dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj);
                    break;
                    break;
                case MSG_DISPATCH_SHOW_RECENTS:
                    showRecentApps(false);
                    break;
            }
            }
        }
        }
    }
    }
@@ -2459,6 +2463,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
        }
    }
    }


    @Override
    public void showRecentApps() {
        mHandler.removeMessages(MSG_DISPATCH_SHOW_RECENTS);
        mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_RECENTS);
    }

    private void showRecentApps(boolean triggeredFromAltTab) {
    private void showRecentApps(boolean triggeredFromAltTab) {
        mPreloadedRecentApps = false; // preloading no longer needs to be canceled
        mPreloadedRecentApps = false; // preloading no longer needs to be canceled
        try {
        try {
+43 −59
Original line number Original line Diff line number Diff line
@@ -30,6 +30,10 @@ import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
import static com.android.server.am.ActivityManagerService.DEBUG_VISBILITY;
import static com.android.server.am.ActivityManagerService.DEBUG_VISBILITY;
import static com.android.server.am.ActivityManagerService.VALIDATE_TOKENS;
import static com.android.server.am.ActivityManagerService.VALIDATE_TOKENS;


import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;

import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_APP;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_APP;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_SAVED_STATE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_SAVED_STATE;
@@ -1040,40 +1044,6 @@ final class ActivityStack {
        }
        }
    }
    }


    /**
     * Determine if home should be visible below the passed record.
     * @param record activity we are querying for.
     * @return true if home is visible below the passed activity, false otherwise.
     */
    boolean isActivityOverHome(ActivityRecord record) {
        // Start at record and go down, look for either home or a visible fullscreen activity.
        final TaskRecord recordTask = record.task;
        for (int taskNdx = mTaskHistory.indexOf(recordTask); taskNdx >= 0; --taskNdx) {
            TaskRecord task = mTaskHistory.get(taskNdx);
            final ArrayList<ActivityRecord> activities = task.mActivities;
            final int startNdx =
                    task == recordTask ? activities.indexOf(record) : activities.size() - 1;
            for (int activityNdx = startNdx; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if (r.isHomeActivity()) {
                    return true;
                }
                if (!r.finishing && r.fullscreen) {
                    // Passed activity is over a fullscreen activity.
                    return false;
                }
            }
            if (task.mOnTopOfHome) {
                // Got to the bottom of a task on top of home without finding a visible fullscreen
                // activity. Home is visible.
                return true;
            }
        }
        // Got to the bottom of this stack and still don't know. If this is over the home stack
        // then record is over home. May not work if we ever get more than two layers.
        return mStackSupervisor.isFrontStack(this);
    }

    private void setVisibile(ActivityRecord r, boolean visible) {
    private void setVisibile(ActivityRecord r, boolean visible) {
        r.visible = visible;
        r.visible = visible;
        mWindowManager.setAppVisibility(r.appToken, visible);
        mWindowManager.setAppVisibility(r.appToken, visible);
@@ -1103,7 +1073,8 @@ final class ActivityStack {
        for (int i = mStacks.indexOf(this) + 1; i < mStacks.size(); i++) {
        for (int i = mStacks.indexOf(this) + 1; i < mStacks.size(); i++) {
            final ArrayList<TaskRecord> tasks = mStacks.get(i).getAllTasks();
            final ArrayList<TaskRecord> tasks = mStacks.get(i).getAllTasks();
            for (int taskNdx = 0; taskNdx < tasks.size(); taskNdx++) {
            for (int taskNdx = 0; taskNdx < tasks.size(); taskNdx++) {
                final ArrayList<ActivityRecord> activities = tasks.get(taskNdx).mActivities;
                final TaskRecord task = tasks.get(taskNdx);
                final ArrayList<ActivityRecord> activities = task.mActivities;
                for (int activityNdx = 0; activityNdx < activities.size(); activityNdx++) {
                for (int activityNdx = 0; activityNdx < activities.size(); activityNdx++) {
                    final ActivityRecord r = activities.get(activityNdx);
                    final ActivityRecord r = activities.get(activityNdx);


@@ -1114,7 +1085,7 @@ final class ActivityStack {
                    // - Full Screen Activity OR
                    // - Full Screen Activity OR
                    // - On top of Home and our stack is NOT home
                    // - On top of Home and our stack is NOT home
                    if (!r.finishing && r.visible && (r.fullscreen ||
                    if (!r.finishing && r.visible && (r.fullscreen ||
                            (!isHomeStack() && r.frontOfTask && tasks.get(taskNdx).mOnTopOfHome))) {
                            (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()))) {
                        return false;
                        return false;
                    }
                    }
                }
                }
@@ -1242,7 +1213,7 @@ final class ActivityStack {
                        // At this point, nothing else needs to be shown
                        // At this point, nothing else needs to be shown
                        if (DEBUG_VISBILITY) Slog.v(TAG, "Fullscreen: at " + r);
                        if (DEBUG_VISBILITY) Slog.v(TAG, "Fullscreen: at " + r);
                        behindFullscreen = true;
                        behindFullscreen = true;
                    } else if (!isHomeStack() && r.frontOfTask && task.mOnTopOfHome) {
                    } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) {
                        if (DEBUG_VISBILITY) Slog.v(TAG, "Showing home: at " + r);
                        if (DEBUG_VISBILITY) Slog.v(TAG, "Showing home: at " + r);
                        behindFullscreen = true;
                        behindFullscreen = true;
                    }
                    }
@@ -1396,6 +1367,7 @@ final class ActivityStack {
        final boolean userLeaving = mStackSupervisor.mUserLeaving;
        final boolean userLeaving = mStackSupervisor.mUserLeaving;
        mStackSupervisor.mUserLeaving = false;
        mStackSupervisor.mUserLeaving = false;


        final TaskRecord prevTask = prev != null ? prev.task : null;
        if (next == null) {
        if (next == null) {
            // There are no more activities!  Let's just start up the
            // There are no more activities!  Let's just start up the
            // Launcher...
            // Launcher...
@@ -1403,7 +1375,10 @@ final class ActivityStack {
            if (DEBUG_STATES) Slog.d(TAG, "resumeTopActivityLocked: No more activities go home");
            if (DEBUG_STATES) Slog.d(TAG, "resumeTopActivityLocked: No more activities go home");
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            // Only resume home if on home display
            // Only resume home if on home display
            return isOnHomeDisplay() && mStackSupervisor.resumeHomeActivity(prev);
            final int returnTaskType = prevTask == null || !prevTask.isOverHomeStack() ?
                    HOME_ACTIVITY_TYPE : prevTask.getTaskToReturnTo();
            return isOnHomeDisplay() &&
                    mStackSupervisor.resumeHomeStackTask(returnTaskType, prev);
        }
        }


        next.delayedResume = false;
        next.delayedResume = false;
@@ -1422,22 +1397,24 @@ final class ActivityStack {
        }
        }


        final TaskRecord nextTask = next.task;
        final TaskRecord nextTask = next.task;
        final TaskRecord prevTask = prev != null ? prev.task : null;
        if (prevTask != null && prevTask.stack == this &&
        if (prevTask != null && prevTask.stack == this &&
                prevTask.mOnTopOfHome && prev.finishing && prev.frontOfTask) {
                prevTask.isOverHomeStack() && prev.finishing && prev.frontOfTask) {
            if (DEBUG_STACK)  mStackSupervisor.validateTopActivitiesLocked();
            if (DEBUG_STACK)  mStackSupervisor.validateTopActivitiesLocked();
            if (prevTask == nextTask) {
            if (prevTask == nextTask) {
                prevTask.setFrontOfTask();
                prevTask.setFrontOfTask();
            } else if (prevTask != topTask()) {
            } else if (prevTask != topTask()) {
                // This task is going away but it was supposed to return to the home task.
                // This task is going away but it was supposed to return to the home stack.
                // Now the task above it has to return to the home task instead.
                // Now the task above it has to return to the home task instead.
                final int taskNdx = mTaskHistory.indexOf(prevTask) + 1;
                final int taskNdx = mTaskHistory.indexOf(prevTask) + 1;
                mTaskHistory.get(taskNdx).mOnTopOfHome = true;
                mTaskHistory.get(taskNdx).setTaskToReturnTo(HOME_ACTIVITY_TYPE);
            } else {
            } else {
                if (DEBUG_STATES && isOnHomeDisplay()) Slog.d(TAG,
                if (DEBUG_STATES && isOnHomeDisplay()) Slog.d(TAG,
                        "resumeTopActivityLocked: Launching home next");
                        "resumeTopActivityLocked: Launching home next");
                // Only resume home if on home display
                // Only resume home if on home display
                return isOnHomeDisplay() && mStackSupervisor.resumeHomeActivity(prev);
                final int returnTaskType = prevTask == null || !prevTask.isOverHomeStack() ?
                        HOME_ACTIVITY_TYPE : prevTask.getTaskToReturnTo();
                return isOnHomeDisplay() &&
                        mStackSupervisor.resumeHomeStackTask(returnTaskType, prev);
            }
            }
        }
        }


@@ -1808,10 +1785,11 @@ final class ActivityStack {
            ActivityStack lastStack = mStackSupervisor.getLastStack();
            ActivityStack lastStack = mStackSupervisor.getLastStack();
            final boolean fromHome = lastStack.isHomeStack();
            final boolean fromHome = lastStack.isHomeStack();
            if (!isHomeStack() && (fromHome || topTask() != task)) {
            if (!isHomeStack() && (fromHome || topTask() != task)) {
                task.mOnTopOfHome = fromHome;
                task.setTaskToReturnTo(fromHome ?
                        lastStack.topTask().taskType : APPLICATION_ACTIVITY_TYPE);
            }
            }
        } else {
        } else {
            task.mOnTopOfHome = false;
            task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
        }
        }


        mTaskHistory.remove(task);
        mTaskHistory.remove(task);
@@ -2356,8 +2334,8 @@ final class ActivityStack {
            ActivityRecord next = topRunningActivityLocked(null);
            ActivityRecord next = topRunningActivityLocked(null);
            if (next != r) {
            if (next != r) {
                final TaskRecord task = r.task;
                final TaskRecord task = r.task;
                if (r.frontOfTask && task == topTask() && task.mOnTopOfHome) {
                if (r.frontOfTask && task == topTask() && task.isOverHomeStack()) {
                    mStackSupervisor.moveHomeToTop();
                    mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo());
                }
                }
            }
            }
            ActivityRecord top = mStackSupervisor.topRunningActivityLocked();
            ActivityRecord top = mStackSupervisor.topRunningActivityLocked();
@@ -2841,8 +2819,9 @@ final class ActivityStack {
        if (task != null && task.removeActivity(r)) {
        if (task != null && task.removeActivity(r)) {
            if (DEBUG_STACK) Slog.i(TAG,
            if (DEBUG_STACK) Slog.i(TAG,
                    "removeActivityFromHistoryLocked: last activity removed from " + this);
                    "removeActivityFromHistoryLocked: last activity removed from " + this);
            if (mStackSupervisor.isFrontStack(this) && task == topTask() && task.mOnTopOfHome) {
            if (mStackSupervisor.isFrontStack(this) && task == topTask() &&
                mStackSupervisor.moveHomeToTop();
                    task.isOverHomeStack()) {
                mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo());
            }
            }
            removeTask(task);
            removeTask(task);
        }
        }
@@ -3157,12 +3136,13 @@ final class ActivityStack {
        }
        }
    }
    }


    void moveHomeTaskToTop() {
    void moveHomeStackTaskToTop(int homeStackTaskType) {
        final int top = mTaskHistory.size() - 1;
        final int top = mTaskHistory.size() - 1;
        for (int taskNdx = top; taskNdx >= 0; --taskNdx) {
        for (int taskNdx = top; taskNdx >= 0; --taskNdx) {
            final TaskRecord task = mTaskHistory.get(taskNdx);
            final TaskRecord task = mTaskHistory.get(taskNdx);
            if (task.isHomeTask()) {
            if (task.taskType == homeStackTaskType) {
                if (DEBUG_TASKS || DEBUG_STACK) Slog.d(TAG, "moveHomeTaskToTop: moving " + task);
                if (DEBUG_TASKS || DEBUG_STACK)
                    Slog.d(TAG, "moveHomeStackTaskToTop: moving " + task);
                mTaskHistory.remove(taskNdx);
                mTaskHistory.remove(taskNdx);
                mTaskHistory.add(top, task);
                mTaskHistory.add(top, task);
                updateTaskMovement(task, true);
                updateTaskMovement(task, true);
@@ -3274,12 +3254,12 @@ final class ActivityStack {
        int numTasks = mTaskHistory.size();
        int numTasks = mTaskHistory.size();
        for (int taskNdx = numTasks - 1; taskNdx >= 1; --taskNdx) {
        for (int taskNdx = numTasks - 1; taskNdx >= 1; --taskNdx) {
            final TaskRecord task = mTaskHistory.get(taskNdx);
            final TaskRecord task = mTaskHistory.get(taskNdx);
            if (task.mOnTopOfHome) {
            if (task.isOverHomeStack()) {
                break;
                break;
            }
            }
            if (taskNdx == 1) {
            if (taskNdx == 1) {
                // Set the last task before tr to go to home.
                // Set the last task before tr to go to home.
                task.mOnTopOfHome = true;
                task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
            }
            }
        }
        }


@@ -3300,9 +3280,10 @@ final class ActivityStack {
        }
        }


        final TaskRecord task = mResumedActivity != null ? mResumedActivity.task : null;
        final TaskRecord task = mResumedActivity != null ? mResumedActivity.task : null;
        if (task == tr && tr.mOnTopOfHome || numTasks <= 1 && isOnHomeDisplay()) {
        if (task == tr && tr.isOverHomeStack() || numTasks <= 1 && isOnHomeDisplay()) {
            tr.mOnTopOfHome = false;
            final int taskToReturnTo = tr.getTaskToReturnTo();
            return mStackSupervisor.resumeHomeActivity(null);
            tr.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
            return mStackSupervisor.resumeHomeStackTask(taskToReturnTo, null);
        }
        }


        mStackSupervisor.resumeTopActivitiesLocked();
        mStackSupervisor.resumeTopActivitiesLocked();
@@ -3743,8 +3724,11 @@ final class ActivityStack {


        final int taskNdx = mTaskHistory.indexOf(task);
        final int taskNdx = mTaskHistory.indexOf(task);
        final int topTaskNdx = mTaskHistory.size() - 1;
        final int topTaskNdx = mTaskHistory.size() - 1;
        if (task.mOnTopOfHome && taskNdx < topTaskNdx) {
        if (task.isOverHomeStack() && taskNdx < topTaskNdx) {
            mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true;
            final TaskRecord nextTask = mTaskHistory.get(taskNdx + 1);
            if (!nextTask.isOverHomeStack()) {
                nextTask.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
            }
        }
        }
        mTaskHistory.remove(task);
        mTaskHistory.remove(task);
        updateTaskMovement(task, true);
        updateTaskMovement(task, true);
+29 −12
Original line number Original line Diff line number Diff line
@@ -31,6 +31,9 @@ import static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
import static com.android.server.am.ActivityManagerService.TAG;
import static com.android.server.am.ActivityManagerService.TAG;
import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;


import android.app.Activity;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager;
@@ -318,18 +321,27 @@ public final class ActivityStackSupervisor implements DisplayListener {
        }
        }
    }
    }


    void moveHomeToTop() {
    void moveHomeStackTaskToTop(int homeStackTaskType) {
        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
            mWindowManager.showRecentApps();
            return;
        }
        moveHomeStack(true);
        moveHomeStack(true);
        mHomeStack.moveHomeTaskToTop();
        mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
    }
    }


    boolean resumeHomeActivity(ActivityRecord prev) {
    boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) {
        moveHomeToTop();
        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
            mWindowManager.showRecentApps();
            return false;
        }
        moveHomeStackTaskToTop(homeStackTaskType);
        if (prev != null) {
        if (prev != null) {
            prev.task.mOnTopOfHome = false;
            prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
        }
        }

        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
        if (r != null && r.isHomeActivity()) {
        if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) {
            mService.setFocusedActivityLocked(r);
            mService.setFocusedActivityLocked(r);
            return resumeTopActivitiesLocked(mHomeStack, prev, null);
            return resumeTopActivitiesLocked(mHomeStack, prev, null);
        }
        }
@@ -683,7 +695,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
    }
    }


    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
        moveHomeToTop();
        moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE);
        startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 0,
        startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 0,
                null, false, null, null);
                null, false, null, null);
    }
    }
@@ -1615,7 +1627,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
                                // Caller wants to appear on home activity.
                                // Caller wants to appear on home activity.
                                intentActivity.task.mOnTopOfHome = true;
                                intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
                            }
                            }
                            options = null;
                            options = null;
                        }
                        }
@@ -1799,6 +1811,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
                        newTaskInfo != null ? newTaskInfo : r.info,
                        newTaskInfo != null ? newTaskInfo : r.info,
                        newTaskIntent != null ? newTaskIntent : intent,
                        newTaskIntent != null ? newTaskIntent : intent,
                        voiceSession, voiceInteractor, true), null, true);
                        voiceSession, voiceInteractor, true), null, true);
                if (sourceRecord == null) {
                    // Launched from a service or notification or task that is finishing.
                    r.task.setTaskToReturnTo(isFrontStack(mHomeStack) ?
                            mHomeStack.topTask().taskType : RECENTS_ACTIVITY_TYPE);
                }
                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
                        r.task);
                        r.task);
            } else {
            } else {
@@ -1811,7 +1828,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
                    // Caller wants to appear on home activity, so before starting
                    // Caller wants to appear on home activity, so before starting
                    // their own activity we will bring home to the front.
                    // their own activity we will bring home to the front.
                    r.task.mOnTopOfHome = r.task.stack.isOnHomeDisplay();
                    r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
                }
                }
            }
            }
        } else if (sourceRecord != null) {
        } else if (sourceRecord != null) {
@@ -2162,7 +2179,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
        if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
        if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
            // Caller wants the home activity moved with it.  To accomplish this,
            // Caller wants the home activity moved with it.  To accomplish this,
            // we'll just indicate that this task returns to the home task.
            // we'll just indicate that this task returns to the home task.
            task.mOnTopOfHome = true;
            task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
        }
        }
        task.stack.moveTaskToFrontLocked(task, null, options);
        task.stack.moveTaskToFrontLocked(task, null, options);
        if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack="
        if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack="
@@ -2273,7 +2290,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            }
            }
            mWindowManager.addTask(taskId, stackId, false);
            mWindowManager.addTask(taskId, stackId, false);
        }
        }
        resumeHomeActivity(null);
        resumeHomeStackTask(HOME_ACTIVITY_TYPE, null);
    }
    }


    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
@@ -2530,7 +2547,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            }
            }
        } else {
        } else {
            // Stack was moved to another display while user was swapped out.
            // Stack was moved to another display while user was swapped out.
            resumeHomeActivity(null);
            resumeHomeStackTask(HOME_ACTIVITY_TYPE, null);
        }
        }
        return homeInFront;
        return homeInFront;
    }
    }
+27 −17
Original line number Original line Diff line number Diff line
@@ -17,6 +17,9 @@
package com.android.server.am;
package com.android.server.am;


import static com.android.server.am.ActivityManagerService.TAG;
import static com.android.server.am.ActivityManagerService.TAG;
import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;


import android.app.Activity;
import android.app.Activity;
@@ -54,7 +57,6 @@ final class TaskRecord extends ThumbnailHolder {
    private static final String ATTR_ASKEDCOMPATMODE = "asked_compat_mode";
    private static final String ATTR_ASKEDCOMPATMODE = "asked_compat_mode";
    private static final String ATTR_USERID = "user_id";
    private static final String ATTR_USERID = "user_id";
    private static final String ATTR_TASKTYPE = "task_type";
    private static final String ATTR_TASKTYPE = "task_type";
    private static final String ATTR_ONTOPOFHOME = "on_top_of_home";
    private static final String ATTR_LASTDESCRIPTION = "last_description";
    private static final String ATTR_LASTDESCRIPTION = "last_description";
    private static final String ATTR_LASTTIMEMOVED = "last_time_moved";
    private static final String ATTR_LASTTIMEMOVED = "last_time_moved";


@@ -104,9 +106,11 @@ final class TaskRecord extends ThumbnailHolder {


    /** True if persistable, has changed, and has not yet been persisted */
    /** True if persistable, has changed, and has not yet been persisted */
    boolean needsPersisting = false;
    boolean needsPersisting = false;
    /** Launch the home activity when leaving this task. Will be false for tasks that are not on

     * Display.DEFAULT_DISPLAY. */
    /** Indication of what to run next when task exits. Use ActivityRecord types.
    boolean mOnTopOfHome = false;
     * ActivityRecord.APPLICATION_ACTIVITY_TYPE indicates to resume the task below this one in the
     * task stack. */
    private int mTaskToReturnTo = APPLICATION_ACTIVITY_TYPE;


    final ActivityManagerService mService;
    final ActivityManagerService mService;


@@ -123,9 +127,8 @@ final class TaskRecord extends ThumbnailHolder {


    TaskRecord(ActivityManagerService service, int _taskId, Intent _intent, Intent _affinityIntent,
    TaskRecord(ActivityManagerService service, int _taskId, Intent _intent, Intent _affinityIntent,
            String _affinity, ComponentName _realActivity, ComponentName _origActivity,
            String _affinity, ComponentName _realActivity, ComponentName _origActivity,
            boolean _rootWasReset, boolean _askedCompatMode, int _taskType, boolean _onTopOfHome,
            boolean _rootWasReset, boolean _askedCompatMode, int _taskType, int _userId,
            int _userId, String _lastDescription, ArrayList<ActivityRecord> activities,
            String _lastDescription, ArrayList<ActivityRecord> activities, long lastTimeMoved) {
            long lastTimeMoved) {
        mService = service;
        mService = service;
        taskId = _taskId;
        taskId = _taskId;
        intent = _intent;
        intent = _intent;
@@ -138,7 +141,7 @@ final class TaskRecord extends ThumbnailHolder {
        rootWasReset = _rootWasReset;
        rootWasReset = _rootWasReset;
        askedCompatMode = _askedCompatMode;
        askedCompatMode = _askedCompatMode;
        taskType = _taskType;
        taskType = _taskType;
        mOnTopOfHome = _onTopOfHome;
        mTaskToReturnTo = HOME_ACTIVITY_TYPE;
        userId = _userId;
        userId = _userId;
        lastDescription = _lastDescription;
        lastDescription = _lastDescription;
        mActivities = activities;
        mActivities = activities;
@@ -206,6 +209,14 @@ final class TaskRecord extends ThumbnailHolder {
        }
        }
    }
    }


    void setTaskToReturnTo(int taskToReturnTo) {
        mTaskToReturnTo = taskToReturnTo;
    }

    int getTaskToReturnTo() {
        return mTaskToReturnTo;
    }

    void disposeThumbnail() {
    void disposeThumbnail() {
        super.disposeThumbnail();
        super.disposeThumbnail();
        for (int i=mActivities.size()-1; i>=0; i--) {
        for (int i=mActivities.size()-1; i>=0; i--) {
@@ -477,11 +488,15 @@ final class TaskRecord extends ThumbnailHolder {
    }
    }


    boolean isHomeTask() {
    boolean isHomeTask() {
        return taskType == ActivityRecord.HOME_ACTIVITY_TYPE;
        return taskType == HOME_ACTIVITY_TYPE;
    }
    }


    boolean isApplicationTask() {
    boolean isApplicationTask() {
        return taskType == ActivityRecord.APPLICATION_ACTIVITY_TYPE;
        return taskType == APPLICATION_ACTIVITY_TYPE;
    }

    boolean isOverHomeStack() {
        return mTaskToReturnTo == HOME_ACTIVITY_TYPE || mTaskToReturnTo == RECENTS_ACTIVITY_TYPE;
    }
    }


    public TaskAccessInfo getTaskAccessInfoLocked() {
    public TaskAccessInfo getTaskAccessInfoLocked() {
@@ -623,7 +638,6 @@ final class TaskRecord extends ThumbnailHolder {
        out.attribute(null, ATTR_ASKEDCOMPATMODE, String.valueOf(askedCompatMode));
        out.attribute(null, ATTR_ASKEDCOMPATMODE, String.valueOf(askedCompatMode));
        out.attribute(null, ATTR_USERID, String.valueOf(userId));
        out.attribute(null, ATTR_USERID, String.valueOf(userId));
        out.attribute(null, ATTR_TASKTYPE, String.valueOf(taskType));
        out.attribute(null, ATTR_TASKTYPE, String.valueOf(taskType));
        out.attribute(null, ATTR_ONTOPOFHOME, String.valueOf(mOnTopOfHome));
        out.attribute(null, ATTR_LASTTIMEMOVED, String.valueOf(mLastTimeMoved));
        out.attribute(null, ATTR_LASTTIMEMOVED, String.valueOf(mLastTimeMoved));
        if (lastDescription != null) {
        if (lastDescription != null) {
            out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString());
            out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString());
@@ -669,7 +683,6 @@ final class TaskRecord extends ThumbnailHolder {
        boolean rootHasReset = false;
        boolean rootHasReset = false;
        boolean askedCompatMode = false;
        boolean askedCompatMode = false;
        int taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE;
        int taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE;
        boolean onTopOfHome = true;
        int userId = 0;
        int userId = 0;
        String lastDescription = null;
        String lastDescription = null;
        long lastTimeOnTop = 0;
        long lastTimeOnTop = 0;
@@ -697,8 +710,6 @@ final class TaskRecord extends ThumbnailHolder {
                userId = Integer.valueOf(attrValue);
                userId = Integer.valueOf(attrValue);
            } else if (ATTR_TASKTYPE.equals(attrName)) {
            } else if (ATTR_TASKTYPE.equals(attrName)) {
                taskType = Integer.valueOf(attrValue);
                taskType = Integer.valueOf(attrValue);
            } else if (ATTR_ONTOPOFHOME.equals(attrName)) {
                onTopOfHome = Boolean.valueOf(attrValue);
            } else if (ATTR_LASTDESCRIPTION.equals(attrName)) {
            } else if (ATTR_LASTDESCRIPTION.equals(attrName)) {
                lastDescription = attrValue;
                lastDescription = attrValue;
            } else if (ATTR_LASTTIMEMOVED.equals(attrName)) {
            } else if (ATTR_LASTTIMEMOVED.equals(attrName)) {
@@ -736,8 +747,7 @@ final class TaskRecord extends ThumbnailHolder {


        final TaskRecord task = new TaskRecord(stackSupervisor.mService, taskId, intent,
        final TaskRecord task = new TaskRecord(stackSupervisor.mService, taskId, intent,
                affinityIntent, affinity, realActivity, origActivity, rootHasReset,
                affinityIntent, affinity, realActivity, origActivity, rootHasReset,
                askedCompatMode, taskType, onTopOfHome, userId, lastDescription, activities,
                askedCompatMode, taskType, userId, lastDescription, activities, lastTimeOnTop);
                lastTimeOnTop);


        for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) {
        for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) {
            final ActivityRecord r = activities.get(activityNdx);
            final ActivityRecord r = activities.get(activityNdx);
@@ -756,7 +766,7 @@ final class TaskRecord extends ThumbnailHolder {
                    pw.print(" userId="); pw.print(userId);
                    pw.print(" userId="); pw.print(userId);
                    pw.print(" taskType="); pw.print(taskType);
                    pw.print(" taskType="); pw.print(taskType);
                    pw.print(" numFullscreen="); pw.print(numFullscreen);
                    pw.print(" numFullscreen="); pw.print(numFullscreen);
                    pw.print(" mOnTopOfHome="); pw.println(mOnTopOfHome);
                    pw.print(" mTaskToReturnTo="); pw.println(mTaskToReturnTo);
        }
        }
        if (affinity != null) {
        if (affinity != null) {
            pw.print(prefix); pw.print("affinity="); pw.println(affinity);
            pw.print(prefix); pw.print("affinity="); pw.println(affinity);
Loading