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

Commit d44711dd authored by Craig Mautner's avatar Craig Mautner
Browse files

Conversion from mHistory to mTaskHistory.

Change-Id: I7c43a923ce248edb4ca7d5fc6d1e0c492522f5a0
parent e3a74d5d
Loading
Loading
Loading
Loading
+200 −249
Original line number Diff line number Diff line
@@ -1057,12 +1057,11 @@ final class ActivityStack {
            mGoingToSleep.release();
        }
        // Ensure activities are no longer sleeping.
        if (VALIDATE_TASK_REPLACE) {
            verifyActivityRecords(true);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                activities.get(activityNdx).setSleeping(false);
            }
        for (int i=mHistory.size()-1; i>=0; i--) {
            ActivityRecord r = mHistory.get(i);
            r.setSleeping(false);
        }
        mGoingToSleepActivities.clear();
    }
@@ -1107,12 +1106,15 @@ final class ActivityStack {
            if (VALIDATE_TASK_REPLACE) {
                verifyActivityRecords(true);
            }
            for (int i=mHistory.size()-1; i>=0; i--) {
                ActivityRecord r = mHistory.get(i);
            for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
                final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
                for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                    final ActivityRecord r = activities.get(activityNdx);
                    if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
                        r.setSleeping(true);
                    }
                }
            }

            if (mGoingToSleepActivities.size() > 0) {
                // Still need to tell some activities to sleep; can't sleep yet.
@@ -1248,15 +1250,9 @@ final class ActivityStack {
    }

    final void activityResumed(IBinder token) {
        ActivityRecord r = null;

        synchronized (mService) {
            if (VALIDATE_TASK_REPLACE) {
                verifyActivityRecords(true);
            }
            int index = indexOfTokenLocked(token);
            if (index >= 0) {
                r = mHistory.get(index);
            final ActivityRecord r = isInStackLocked(token);
            if (r != null) {
                if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; dropping state of: " + r);
                r.icicle = null;
                r.haveState = false;
@@ -1268,15 +1264,9 @@ final class ActivityStack {
        if (DEBUG_PAUSE) Slog.v(
            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);

        ActivityRecord r = null;

        synchronized (mService) {
            if (VALIDATE_TASK_REPLACE) {
                verifyActivityRecords(true);
            }
            int index = indexOfTokenLocked(token);
            if (index >= 0) {
                r = mHistory.get(index);
            final ActivityRecord r = isInStackLocked(token);
            if (r != null) {
                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
                if (mPausingActivity == r) {
                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
@@ -1489,21 +1479,23 @@ final class ActivityStack {
        if (VALIDATE_TASK_REPLACE) {
            verifyActivityRecords(true);
        }
        final int count = mHistory.size();
        int i = count-1;
        while (mHistory.get(i) != top) {
            i--;
        }
        ActivityRecord r;
        boolean aboveTop = true;
        boolean behindFullscreen = false;
        for (; i>=0; i--) {
            r = mHistory.get(i);
            if (DEBUG_VISBILITY) Slog.v(
                    TAG, "Make visible? " + r + " finishing=" + r.finishing
                    + " state=" + r.state);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if (r.finishing) {
                    continue;
                }
                if (aboveTop && r != top) {
                    continue;
                }
                aboveTop = false;
                if (!behindFullscreen) {
                    if (DEBUG_VISBILITY) Slog.v(
                            TAG, "Make visible? " + r + " finishing=" + r.finishing
                            + " state=" + r.state);
                    
                    final boolean doThisProcess = onlyThisProcess == null
                            || onlyThisProcess.equals(r.processName);
@@ -1574,21 +1566,8 @@ final class ActivityStack {
                        if (DEBUG_VISBILITY) Slog.v(
                                TAG, "Stopping: fullscreen at " + r);
                        behindFullscreen = true;
                i--;
                break;
                    }
        }

        // Now for any activities that aren't visible to the user, make
        // sure they no longer are keeping the screen frozen.
        while (i >= 0) {
            r = mHistory.get(i);
            if (DEBUG_VISBILITY) Slog.v(
                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
                    + " state=" + r.state
                    + " behindFullscreen=" + behindFullscreen);
            if (!r.finishing) {
                if (behindFullscreen) {
                } else {
                    if (r.visible) {
                        if (DEBUG_VISBILITY) Slog.v(
                                TAG, "Making invisible: " + r);
@@ -1612,13 +1591,8 @@ final class ActivityStack {
                        if (DEBUG_VISBILITY) Slog.v(
                                TAG, "Already invisible: " + r);
                    }
                } else if (r.fullscreen) {
                    if (DEBUG_VISBILITY) Slog.v(
                            TAG, "Now behindFullscreen: " + r);
                    behindFullscreen = true;
                }
            }
            i--;
        }
    }

@@ -2027,14 +2001,8 @@ final class ActivityStack {

    /** Temporary until startActivityLocked is rewritten for tasks. */
    private int convertAddPos(int addPos) {
        final int taskId = mHistory.get(addPos).task.taskId;
        addPos--;
        int taskOffset = 0;
        while (addPos >= 0 && taskId == mHistory.get(addPos).task.taskId) {
            ++taskOffset;
            --addPos;
        }
        return taskOffset;
        final ActivityRecord r = mHistory.get(addPos);
        return r.task.mActivities.indexOf(r);
    }

    private final void startActivityLocked(ActivityRecord r, boolean newTask,
@@ -2715,8 +2683,7 @@ final class ActivityStack {
                    }
                    if (DEBUG_TASKS || VALIDATE_TASK_REPLACE) Slog.w(TAG,
                            "resetTaskIntendedTask: would call finishActivity on " + p);
                    if (finishActivityLocked(p, -1, Activity.RESULT_CANCELED, null, "reset",
                            false)) {
                    if (finishActivityLocked(p, Activity.RESULT_CANCELED, null, "reset", false)) {
                        end--;
                        srcPos--;
                    }
@@ -2793,8 +2760,7 @@ final class ActivityStack {
                        }
                        if (VALIDATE_TASK_REPLACE) Slog.w(TAG,
                                "resetAffinityTaskIfNeededLocked: calling finishActivity on " + p);
                        finishActivityLocked(p, -1, Activity.RESULT_CANCELED, null, "reset",
                                false);
                        finishActivityLocked(p, Activity.RESULT_CANCELED, null, "reset", false);
                    }
                } else {
                    int taskTopI = mHistory.indexOf(taskTop);
@@ -2837,8 +2803,8 @@ final class ActivityStack {
                        if (targetNdx > 0) {
                            ActivityRecord p = taskActivities.get(targetNdx - 1);
                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
                                if (finishActivityLocked(p, -1, Activity.RESULT_CANCELED, null,
                                        "replace", false)) {
                                if (finishActivityLocked(p, Activity.RESULT_CANCELED, null, "replace",
                                        false)) {
                                    taskTopI--;
                                }
                            }
@@ -2951,8 +2917,8 @@ final class ActivityStack {
                    if (opts != null) {
                        ret.updateOptionsLocked(opts);
                    }
                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
                            null, "clear", false)) {
                    if (finishActivityLocked(r, Activity.RESULT_CANCELED, null,
                            "clear", false)) {
                        i--;
                    }
                }
@@ -2965,8 +2931,8 @@ final class ActivityStack {
                    if (!ret.finishing) {
                        int index = mHistory.indexOf(ret);
                        if (index >= 0) {
                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
                                    null, "clear", false);
                            finishActivityLocked(ret, Activity.RESULT_CANCELED, null,
                                    "clear", false);
                        }
                        return null;
                    }
@@ -2994,8 +2960,8 @@ final class ActivityStack {
                i++;
                continue;
            }
            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
                    null, "clear", false)) {
            if (!finishActivityLocked(r, Activity.RESULT_CANCELED, null,
                    "clear", false)) {
                i++;
            }
        }
@@ -4131,8 +4097,7 @@ final class ActivityStack {
            }

            // Get the activity record.
            int index = mHistory.indexOf(r);
            if (index >= 0) {
            if (isInStackLocked(token) != null) {
                res = r;

                if (fromTimeout) {
@@ -4281,7 +4246,7 @@ final class ActivityStack {
        }
        ActivityRecord r = mHistory.get(index);

        finishActivityLocked(r, index, resultCode, resultData, reason, oomAdj);
        finishActivityLocked(r, resultCode, resultData, reason, oomAdj);
        return true;
    }

@@ -4297,8 +4262,8 @@ final class ActivityStack {
            if (r.resultTo == self && r.requestCode == requestCode) {
                if ((r.resultWho == null && resultWho == null) ||
                    (r.resultWho != null && r.resultWho.equals(resultWho))) {
                    finishActivityLocked(r, i,
                            Activity.RESULT_CANCELED, null, "request-sub", false);
                    finishActivityLocked(r, Activity.RESULT_CANCELED,
                            null, "request-sub", false);
                }
            }
        }
@@ -4313,8 +4278,8 @@ final class ActivityStack {
            Slog.w(TAG, "  Force finishing activity "
                    + r.intent.getComponent().flattenToShortString());
            int index = mHistory.indexOf(r);
            r.stack.finishActivityLocked(r, index,
                    Activity.RESULT_CANCELED, null, "crashed", false);
            r.stack.finishActivityLocked(r, Activity.RESULT_CANCELED,
                    null, "crashed", false);
            // Also terminate any activities below it that aren't yet
            // stopped, to avoid a situation where one will get
            // re-start our crashing activity once it gets resumed again.
@@ -4327,8 +4292,8 @@ final class ActivityStack {
                    if (!r.isHomeActivity || mService.mHomeProcess != r.app) {
                        Slog.w(TAG, "  Force finishing activity "
                                + r.intent.getComponent().flattenToShortString());
                        r.stack.finishActivityLocked(r, index,
                                Activity.RESULT_CANCELED, null, "crashed", false);
                        r.stack.finishActivityLocked(r, Activity.RESULT_CANCELED,
                                null, "crashed", false);
                    }
                }
            }
@@ -4355,8 +4320,8 @@ final class ActivityStack {
            if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
                break;
            }
            finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null,
                    "request-affinity", true);
            finishActivityLocked(cur, Activity.RESULT_CANCELED, null, "request-affinity",
                    true);
            index--;
        }
        return true;
@@ -4393,30 +4358,17 @@ final class ActivityStack {
     * @return Returns true if this activity has been removed from the history
     * list, or false if it is still in the list and will be removed later.
     */
    final boolean finishActivityLocked(ActivityRecord r,
            int resultCode, Intent resultData, String reason, boolean oomAdj) {
        int index = mHistory.indexOf(r);
        if (index >= 0) {
            return finishActivityLocked(r, index, resultCode, resultData, reason, false, oomAdj);
        }
        return false;
    }

    /**
     * @return Returns true if this activity has been removed from the history
     * list, or false if it is still in the list and will be removed later.
     */
    final boolean finishActivityLocked(ActivityRecord r, int index,
            int resultCode, Intent resultData, String reason, boolean oomAdj) {
        return finishActivityLocked(r, index, resultCode, resultData, reason, false, oomAdj);
    final boolean finishActivityLocked(ActivityRecord r, int resultCode,
            Intent resultData, String reason, boolean oomAdj) {
        return finishActivityLocked(r, resultCode, resultData, reason, false, oomAdj);
    }

    /**
     * @return Returns true if this activity has been removed from the history
     * list, or false if it is still in the list and will be removed later.
     */
    final boolean finishActivityLocked(ActivityRecord r, int index, int resultCode,
            Intent resultData, String reason, boolean immediate, boolean oomAdj) {
    final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData,
            String reason, boolean immediate, boolean oomAdj) {
        if (r.finishing) {
            Slog.w(TAG, "Duplicate finish request for " + r);
            return false;
@@ -4426,9 +4378,10 @@ final class ActivityStack {
        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
                r.userId, System.identityHashCode(r),
                r.task.taskId, r.shortComponentName, reason);
        if (index < (mHistory.size()-1)) {
            ActivityRecord next = mHistory.get(index+1);
            if (next.task == r.task) {
        final ArrayList<ActivityRecord> activities = r.task.mActivities;
        final int index = activities.indexOf(r);
        if (index < (activities.size() - 1)) {
            ActivityRecord next = activities.get(index+1);
            if (r.frontOfTask) {
                // The next activity is now the front of the task.
                next.frontOfTask = true;
@@ -4440,7 +4393,6 @@ final class ActivityStack {
                next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
            }
        }
        }

        r.pauseKeyDispatchingLocked();
        if (mMainStack) {
@@ -4459,8 +4411,7 @@ final class ActivityStack {
        }

        if (immediate) {
            return finishCurrentActivityLocked(r, index,
                    FINISH_IMMEDIATELY, oomAdj) == null;
            return finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, oomAdj) == null;
        } else if (mResumedActivity == r) {
            boolean endTask = index <= 0
                    || (mHistory.get(index-1)).task != r.task;
@@ -4483,8 +4434,7 @@ final class ActivityStack {
            // If the activity is PAUSING, we will complete the finish once
            // it is done pausing; else we can just directly finish it here.
            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
            return finishCurrentActivityLocked(r, index,
                    FINISH_AFTER_PAUSE, oomAdj) == null;
            return finishCurrentActivityLocked(r, FINISH_AFTER_PAUSE, oomAdj) == null;
        } else {
            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
        }
@@ -4496,18 +4446,9 @@ final class ActivityStack {
    private static final int FINISH_AFTER_PAUSE = 1;
    private static final int FINISH_AFTER_VISIBLE = 2;

    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
            int mode, boolean oomAdj) {
        final int index = mHistory.indexOf(r);
        if (index < 0) {
            return null;
        }

        return finishCurrentActivityLocked(r, index, mode, oomAdj);
    }

    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
            int index, int mode, boolean oomAdj) {
            int mode, boolean oomAdj) {
        // First things first: if this activity is currently visible,
        // and the resumed activity is not yet visible, then hold off on
        // finishing until the resumed one becomes visible.
@@ -4768,8 +4709,10 @@ final class ActivityStack {
    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
        boolean lastIsOpaque = false;
        boolean activityRemoved = false;
        for (int i=mHistory.size()-1; i>=0; i--) {
            ActivityRecord r = mHistory.get(i);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if (r.finishing) {
                    continue;
                }
@@ -4796,6 +4739,7 @@ final class ActivityStack {
                    }
                }
            }
        }
        if (activityRemoved) {
            resumeTopActivityLocked(null);
        }
@@ -4912,8 +4856,7 @@ final class ActivityStack {
                    mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
                }

                int index = mHistory.indexOf(r);
                if (index >= 0) {
                if (isInStackLocked(token) != null) {
                    if (r.state == ActivityState.DESTROYING) {
                        cleanUpActivityLocked(r, true, false);
                        removeActivityFromHistoryLocked(r);
@@ -5574,9 +5517,10 @@ final class ActivityStack {
    }

    boolean willActivityBeVisibleLocked(IBinder token) {
        int i;
        for (i = mHistory.size() - 1; i >= 0; i--) {
            ActivityRecord r = mHistory.get(i);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if (r.appToken == token) {
                        return true;
                }
@@ -5584,15 +5528,19 @@ final class ActivityStack {
                    return false;
                }
            }
        }
        return true;
    }

    void closeSystemDialogsLocked() {
        for (int i = mHistory.size() - 1; i >= 0; i--) {
            ActivityRecord r = mHistory.get(i);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
                r.stack.finishActivityLocked(r, i,
                        Activity.RESULT_CANCELED, null, "close-sys", true);
                    r.stack.finishActivityLocked(r, Activity.RESULT_CANCELED,
                            null, "close-sys", true);
                }
            }
        }
    }
@@ -5625,8 +5573,8 @@ final class ActivityStack {
                    r.app = null;
                }
                lastTask = r.task;
                if (r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED,
                        null, "force-stop", true)) {
                if (r.stack.finishActivityLocked(r, Activity.RESULT_CANCELED, null,
                        "force-stop", true)) {
                    i--;
                }
            }
@@ -5707,18 +5655,21 @@ final class ActivityStack {
            TAG, "Performing unhandledBack(): top activity at " + top);
        if (top > 0) {
            finishActivityLocked(mHistory.get(top),
                        top, Activity.RESULT_CANCELED, null, "unhandled-back", true);
                        Activity.RESULT_CANCELED, null, "unhandled-back", true);
        }
    }

    void handleAppCrashLocked(ProcessRecord app) {
        for (int i = mHistory.size() - 1; i >= 0; i--) {
            ActivityRecord r = mHistory.get(i);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if (r.app == app) {
                    Slog.w(TAG, "  Force finishing activity "
                            + r.intent.getComponent().flattenToShortString());
                r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED,
                        null, "crashed", false);
                    r.stack.finishActivityLocked(r, Activity.RESULT_CANCELED, null, "crashed",
                            false);
                }
            }
        }
    }