diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index b72cd73e85cfd..3e3fee54bdd07 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -745,7 +745,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } /** - * Returns a {@link TaskRecord} for the input id if available. Null otherwise. + * Returns a {@link TaskRecord} for the input id if available. {@code null} otherwise. * @param id Id of the task we would like returned. * @param matchMode The mode to match the given task id in. * @param stackId The stack to restore the task to (default launch stack will be used if @@ -765,7 +765,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { ActivityStack stack = stacks.get(stackNdx); - TaskRecord task = stack.taskForIdLocked(id); + final TaskRecord task = stack.taskForIdLocked(id); if (task != null) { return task; } @@ -780,11 +780,17 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // Otherwise, check the recent tasks and return if we find it there and we are not restoring // the task from recents if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Looking for task id=" + id + " in recents"); - TaskRecord task = mRecentTasks.taskForIdLocked(id); - if (matchMode == MATCH_TASK_IN_STACKS_OR_RECENT_TASKS) { - if (DEBUG_RECENTS && task == null) { + final TaskRecord task = mRecentTasks.taskForIdLocked(id); + + if (task == null) { + if (DEBUG_RECENTS) { Slog.d(TAG_RECENTS, "\tDidn't find task id=" + id + " in recents"); } + + return null; + } + + if (matchMode == MATCH_TASK_IN_STACKS_OR_RECENT_TASKS) { return task; } diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java new file mode 100644 index 0000000000000..b59c2bc93d731 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.am; + +import static org.junit.Assert.assertNull; + +import android.os.Debug; +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.MediumTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.runner.RunWith; +import org.junit.Test; + +import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; + +/** + * Tests for the {@link ActivityStackSupervisor} class. + * + * Build/Install/Run: + * bit FrameworksServicesTests:com.android.server.am.ActivityStackSupervisorTests + */ +@MediumTest +@Presubmit +@RunWith(AndroidJUnit4.class) +public class ActivityStackSupervisorTests extends ActivityTestsBase { + /** + * This test ensures that we do not try to restore a task based off an invalid task id. The + * stack supervisor is a test version so there will be no tasks present. We should expect + * {@code null} to be returned in this case. + */ + @Test + public void testRestoringInvalidTask() throws Exception { + Debug.waitForDebugger(); + final ActivityManagerService service = createActivityManagerService(); + TaskRecord task = service.mStackSupervisor.anyTaskForIdLocked(0 /*taskId*/, + MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE, 0 /*stackId*/); + assertNull(task); + } +}