diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 184de58c8446c1ed57cd9f581e224ede2267db72..442269ab40153440d9d78ecd08f83d59be4401a0 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -64,6 +64,7 @@ import android.graphics.Bitmap; import android.os.Environment; import android.os.IBinder; import android.os.RemoteException; +import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.text.TextUtils; @@ -506,6 +507,16 @@ class RecentTasks { Slog.i(TAG, "Loading recents for user " + userId + " into memory."); List<Task> tasks = mTaskPersister.restoreTasksForUserLocked(userId, preaddedTasks); + + // Tasks are ordered from most recent to least recent. Update the last active time to be + // in sync with task recency when device reboots, so the most recent task has the + // highest last active time + long currentElapsedTime = SystemClock.elapsedRealtime(); + for (int i = 0; i < tasks.size(); i++) { + Task task = tasks.get(i); + task.lastActiveTime = currentElapsedTime - i; + } + mTasks.addAll(tasks); cleanupLocked(userId); mUsersWithRecentsLoaded.put(userId, true); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 25619b9ec5e8447b3c7645684d91a905f7503464..4c25a4bf1455cc90e50f814783272d5aadcc77ba 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -91,6 +91,7 @@ import java.util.List; import java.util.Random; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; /** * Build/Install/Run: @@ -562,6 +563,38 @@ public class RecentTasksTest extends WindowTestsBase { .doesNotContain(TEST_USER_1_ID); } + @Test + public void testTasksWithCorrectOrderOfLastActiveTime() { + mRecentTasks.setOnlyTestVisibleRange(); + mRecentTasks.unloadUserDataFromMemoryLocked(TEST_USER_0_ID); + + // Setup some tasks for the user + mTaskPersister.mUserTaskIdsOverride = new SparseBooleanArray(); + mTaskPersister.mUserTaskIdsOverride.put(1, true); + mTaskPersister.mUserTaskIdsOverride.put(2, true); + mTaskPersister.mUserTaskIdsOverride.put(3, true); + mTaskPersister.mUserTasksOverride = new ArrayList<>(); + mTaskPersister.mUserTasksOverride.add(createTaskBuilder(".UserTask1").build()); + mTaskPersister.mUserTasksOverride.add(createTaskBuilder(".UserTask2").build()); + mTaskPersister.mUserTasksOverride.add(createTaskBuilder(".UserTask3").build()); + + // Assert no user tasks are initially loaded + assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).hasLength(0); + + // Load tasks + mRecentTasks.loadUserRecentsLocked(TEST_USER_0_ID); + assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList().contains(TEST_USER_0_ID); + + // Sort the time descendingly so the order should be in-sync with task recency (most + // recent to least recent) + List<Task> tasksSortedByTime = mRecentTasks.getRawTasks().stream() + .sorted((o1, o2) -> Long.compare(o2.lastActiveTime, o1.lastActiveTime)) + .collect(Collectors.toList()); + + assertTrue("Task order is not in sync with its recency", + mRecentTasks.getRawTasks().equals(tasksSortedByTime)); + } + @Test public void testOrderedIteration() { mRecentTasks.setOnlyTestVisibleRange();