Loading services/core/java/com/android/server/wm/RecentTasks.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.graphics.Bitmap; import android.os.Environment; import android.os.Environment; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserHandle; import android.text.TextUtils; import android.text.TextUtils; Loading Loading @@ -506,6 +507,16 @@ class RecentTasks { Slog.i(TAG, "Loading recents for user " + userId + " into memory."); Slog.i(TAG, "Loading recents for user " + userId + " into memory."); List<Task> tasks = mTaskPersister.restoreTasksForUserLocked(userId, preaddedTasks); 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); mTasks.addAll(tasks); cleanupLocked(userId); cleanupLocked(userId); mUsersWithRecentsLoaded.put(userId, true); mUsersWithRecentsLoaded.put(userId, true); Loading services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +33 −0 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,7 @@ import java.util.List; import java.util.Random; import java.util.Random; import java.util.Set; import java.util.Set; import java.util.function.Function; import java.util.function.Function; import java.util.stream.Collectors; /** /** * Build/Install/Run: * Build/Install/Run: Loading Loading @@ -562,6 +563,38 @@ public class RecentTasksTest extends WindowTestsBase { .doesNotContain(TEST_USER_1_ID); .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 @Test public void testOrderedIteration() { public void testOrderedIteration() { mRecentTasks.setOnlyTestVisibleRange(); mRecentTasks.setOnlyTestVisibleRange(); Loading Loading
services/core/java/com/android/server/wm/RecentTasks.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.graphics.Bitmap; import android.os.Environment; import android.os.Environment; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserHandle; import android.text.TextUtils; import android.text.TextUtils; Loading Loading @@ -506,6 +507,16 @@ class RecentTasks { Slog.i(TAG, "Loading recents for user " + userId + " into memory."); Slog.i(TAG, "Loading recents for user " + userId + " into memory."); List<Task> tasks = mTaskPersister.restoreTasksForUserLocked(userId, preaddedTasks); 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); mTasks.addAll(tasks); cleanupLocked(userId); cleanupLocked(userId); mUsersWithRecentsLoaded.put(userId, true); mUsersWithRecentsLoaded.put(userId, true); Loading
services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +33 −0 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,7 @@ import java.util.List; import java.util.Random; import java.util.Random; import java.util.Set; import java.util.Set; import java.util.function.Function; import java.util.function.Function; import java.util.stream.Collectors; /** /** * Build/Install/Run: * Build/Install/Run: Loading Loading @@ -562,6 +563,38 @@ public class RecentTasksTest extends WindowTestsBase { .doesNotContain(TEST_USER_1_ID); .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 @Test public void testOrderedIteration() { public void testOrderedIteration() { mRecentTasks.setOnlyTestVisibleRange(); mRecentTasks.setOnlyTestVisibleRange(); Loading