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

Commit af0e4488 authored by Wale Ogunwale's avatar Wale Ogunwale
Browse files

Have AMS.setFocusedActivityLocked() move the focus stack to the front

Bug: 19219490
Change-Id: I089c42a6cf6277f5975064103c9804c2ab05dcd6
parent 9fc3cef1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2398,8 +2398,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            } else {
                finishRunningVoiceLocked();
            }
            mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity");
            if (r != null) {
            if (r != null && mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity")) {
                mWindowManager.setFocusedApp(r.appToken, true);
            }
            applyUpdateLockStateLocked(r);
@@ -2423,6 +2422,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                ActivityRecord r = stack.topRunningActivityLocked(null);
                if (r != null) {
                    setFocusedActivityLocked(r, "setFocusedStack");
                    mStackSupervisor.resumeTopActivitiesLocked(stack, null, null);
                }
            }
        }
+12 −6
Original line number Diff line number Diff line
@@ -496,11 +496,19 @@ final class ActivityStack {

    final void moveToFront(String reason) {
        if (isAttached()) {
            if (isOnHomeDisplay()) {
                mStackSupervisor.moveHomeStack(isHomeStack(), reason);
            }
            final boolean homeStack = isHomeStack()
                    || (mActivityContainer.mParentActivity != null
                        && mActivityContainer.mParentActivity.isHomeActivity());

            if (!homeStack) {
                // Need to move this stack to the front before calling
                // {@link ActivityStackSupervisor#moveHomeStack} below.
                mStacks.remove(this);
                mStacks.add(this);
            }
            if (isOnHomeDisplay()) {
                mStackSupervisor.moveHomeStack(homeStack, reason);
            }
            final TaskRecord task = topTask();
            if (task != null) {
                mWindowManager.moveTaskToTop(task.taskId);
@@ -2580,7 +2588,6 @@ final class ActivityStack {
        if (top == null) {
            return false;
        }
        stack.moveToFront(myReason);
        mService.setFocusedActivityLocked(top, myReason);
        return true;
    }
@@ -3654,8 +3661,7 @@ final class ActivityStack {
            }
        }

        if (DEBUG_TRANSITION) Slog.v(TAG,
                "Prepare to back transition: task=" + taskId);
        if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare to back transition: task=" + taskId);

        boolean prevIsHome = false;
        if (tr.isOverHomeStack()) {
+33 −34
Original line number Diff line number Diff line
@@ -1541,25 +1541,27 @@ public final class ActivityStackSupervisor implements DisplayListener {
        return err;
    }

    ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) {
    ActivityStack computeStackFocus(ActivityRecord r, boolean newTask) {
        final TaskRecord task = r.task;

        // On leanback only devices we should keep all activities in the same stack.
        if (!mLeanbackOnlyDevice &&
                (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) {

            ActivityStack stack;

            if (task != null) {
                final ActivityStack taskStack = task.stack;
                if (taskStack.isOnHomeDisplay()) {
                    if (mFocusedStack != taskStack) {
                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " +
                stack = task.stack;
                if (stack.isOnHomeDisplay()) {
                    if (mFocusedStack != stack) {
                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "computeStackFocus: Setting " +
                                "focused stack to r=" + r + " task=" + task);
                        mFocusedStack = taskStack;
                    } else {
                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                            "adjustStackFocus: Focused stack already=" + mFocusedStack);
                            "computeStackFocus: Focused stack already=" + mFocusedStack);
                    }
                }
                return taskStack;
                return stack;
            }

            final ActivityContainer container = r.mInitialActivityContainer;
@@ -1572,43 +1574,41 @@ public final class ActivityStackSupervisor implements DisplayListener {
            if (mFocusedStack != mHomeStack && (!newTask ||
                    mFocusedStack.mActivityContainer.isEligibleForNewTasks())) {
                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
                        "computeStackFocus: Have a focused stack=" + mFocusedStack);
                return mFocusedStack;
            }

            final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks;
            for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) {
                final ActivityStack stack = homeDisplayStacks.get(stackNdx);
                stack = homeDisplayStacks.get(stackNdx);
                if (!stack.isHomeStack()) {
                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                            "adjustStackFocus: Setting focused stack=" + stack);
                    mFocusedStack = stack;
                    return mFocusedStack;
                            "computeStackFocus: Setting focused stack=" + stack);
                    return stack;
                }
            }

            // Need to create an app stack for this user.
            mFocusedStack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
                    " stackId=" + mFocusedStack.mStackId);
            return mFocusedStack;
            stack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "computeStackFocus: New stack r=" + r +
                    " stackId=" + stack.mStackId);
            return stack;
        }
        return mHomeStack;
    }

    void setFocusedStack(ActivityRecord r, String reason) {
        if (r != null) {
            final TaskRecord task = r.task;
            boolean isHomeActivity = !r.isApplicationActivity();
            if (!isHomeActivity && task != null) {
                isHomeActivity = !task.isApplicationTask();
            }
            if (!isHomeActivity && task != null) {
                final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity;
                isHomeActivity = parent != null && parent.isHomeActivity();
    boolean setFocusedStack(ActivityRecord r, String reason) {
        if (r == null) {
            // Not sure what you are trying to do, but it is not going to work...
            return false;
        }
            moveHomeStack(isHomeActivity, reason);
        final TaskRecord task = r.task;
        if (task == null || task.stack == null) {
            Slog.w(TAG, "Can't set focus stack for r=" + r + " task=" + task);
            return false;
        }
        task.stack.moveToFront(reason);
        return true;
    }

    final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord,
@@ -2082,10 +2082,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
            }
            newTask = true;
            targetStack = adjustStackFocus(r, newTask);
            if (!launchTaskBehind) {
            targetStack = computeStackFocus(r, newTask);
            targetStack.moveToFront("startingNewTask");
            }

            if (reuseTask == null) {
                r.setTask(targetStack.createTaskRecord(getNextTaskId(),
                        newTaskInfo != null ? newTaskInfo : r.info,
@@ -2206,7 +2205,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            // This not being started from an existing activity, and not part
            // of a new task...  just put it in the top task, though these days
            // this case should never happen.
            targetStack = adjustStackFocus(r, newTask);
            targetStack = computeStackFocus(r, newTask);
            targetStack.moveToFront("addingToTopTask");
            ActivityRecord prev = targetStack.topActivity();
            r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(),