diff options
4 files changed, 96 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index b9550feeab8a..24b5f618e32b 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -49,6 +49,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskSupervisor.REMOVE_FROM_RECENTS; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -83,6 +84,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLog; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.am.ActivityManagerService; +import com.android.window.flags.Flags; import com.google.android.collect.Sets; @@ -1452,9 +1454,10 @@ class RecentTasks { * @return whether the given active task should be presented to the user through SystemUI. */ @VisibleForTesting - boolean isVisibleRecentTask(Task task) { + boolean isVisibleRecentTask(@NonNull Task task) { if (DEBUG_RECENTS_TRIM_TASKS) { Slog.d(TAG, "isVisibleRecentTask: task=" + task + + " isForceExcludedFromRecents=" + task.isForceExcludedFromRecents() + " minVis=" + mMinNumVisibleTasks + " maxVis=" + mMaxNumVisibleTasks + " sessionDuration=" + mActiveTasksSessionDurationMs + " inactiveDuration=" + task.getInactiveDuration() @@ -1464,6 +1467,11 @@ class RecentTasks { + " intentFlags=" + task.getBaseIntent().getFlags()); } + // Ignore the task if it is force excluded from recents. + if (Flags.excludeTaskFromRecents() && task.isForceExcludedFromRecents()) { + return false; + } + switch (task.getActivityType()) { case ACTIVITY_TYPE_HOME: case ACTIVITY_TYPE_RECENTS: diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3cce17242648..89634707995a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -625,6 +625,9 @@ class Task extends TaskFragment { boolean mAlignActivityLocaleWithTask = false; + /** @see #isForceExcludedFromRecents() */ + private boolean mForceExcludedFromRecents; + private Task(ActivityTaskManagerService atmService, int _taskId, Intent _intent, Intent _affinityIntent, String _affinity, String _rootAffinity, ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset, @@ -3842,7 +3845,8 @@ class Task extends TaskFragment { pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime); pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)"); pw.print(prefix); pw.print("isTrimmable=" + mIsTrimmableFromRecents); - pw.print(" isForceHidden="); pw.println(isForceHidden()); + pw.print(" isForceHidden="); pw.print(isForceHidden()); + pw.print(" isForceExcludedFromRecents="); pw.println(isForceExcludedFromRecents()); if (mLaunchAdjacentDisabled) { pw.println(prefix + "mLaunchAdjacentDisabled=true"); } @@ -4555,11 +4559,45 @@ class Task extends TaskFragment { /** * @return whether this task is always on top without taking visibility into account. + * @deprecated b/388630258 replace hidden bubble tasks with reordering. + * {@link RecentTasks#isVisibleRecentTask} now checks {@link #isForceExcludedFromRecents}. */ - public boolean isAlwaysOnTopWhenVisible() { + @Deprecated + boolean isAlwaysOnTopWhenVisible() { return super.isAlwaysOnTop(); } + /** + * Returns whether this task is forcibly excluded from the Recents list. + * + * <p>This flag is used by {@link RecentTasks#isVisibleRecentTask} to determine + * if the task should be presented to the user through SystemUI. If this method + * returns {@code true}, the task will not be shown in Recents, regardless of other + * visibility criteria. + * + * @return {@code true} if the task is excluded, {@code false} otherwise. + */ + boolean isForceExcludedFromRecents() { + return mForceExcludedFromRecents; + } + + /** + * Sets whether this task should be forcibly excluded from the Recents list. + * + * <p>This method is intended to be used in conjunction with + * {@link android.window.WindowContainerTransaction#setTaskForceExcludedFromRecents} to modify the + * task's exclusion state. + * + * @param excluded {@code true} to exclude the task, {@code false} otherwise. + */ + void setForceExcludedFromRecents(boolean excluded) { + if (!Flags.excludeTaskFromRecents()) { + Slog.w(TAG, "Flag " + Flags.FLAG_EXCLUDE_TASK_FROM_RECENTS + " is not enabled"); + return; + } + mForceExcludedFromRecents = excluded; + } + boolean isForceHiddenForPinnedTask() { return (mForceHiddenFlags & FLAG_FORCE_HIDDEN_FOR_PINNED_TASK) != 0; } 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 2c6884e7a35a..4458b7330a68 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -81,6 +81,7 @@ import android.window.TaskSnapshot; import androidx.test.filters.MediumTest; import com.android.server.wm.RecentTasks.Callbacks; +import com.android.window.flags.Flags; import org.junit.Before; import org.junit.Rule; @@ -931,6 +932,20 @@ public class RecentTasksTest extends WindowTestsBase { } @Test + public void testVisibleTask_forceExcludedFromRecents() { + final Task forceExcludedFromRecentsTask = mTasks.getFirst(); + forceExcludedFromRecentsTask.setForceExcludedFromRecents(true); + + final boolean visible = mRecentTasks.isVisibleRecentTask(forceExcludedFromRecentsTask); + + if (Flags.excludeTaskFromRecents()) { + assertFalse(visible); + } else { + assertTrue(visible); + } + } + + @Test public void testFreezeTaskListOrder_reorderExistingTask() { // Add some tasks mRecentTasks.add(mTasks.get(0)); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index b617f0285606..e57f1144e6e9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -86,6 +86,7 @@ import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.os.IBinder; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.util.DisplayMetrics; import android.util.Xml; @@ -99,6 +100,7 @@ import androidx.test.filters.MediumTest; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.window.flags.Flags; import org.junit.Assert; import org.junit.Before; @@ -2161,6 +2163,36 @@ public class TaskTests extends WindowTestsBase { } + @Test + public void testIsForceExcludedFromRecents_defaultFalse() { + final Task task = createTask(mDisplayContent); + assertFalse(task.isForceExcludedFromRecents()); + } + + @Test + public void testSetForceExcludedFromRecents() { + final Task task = createTask(mDisplayContent); + + task.setForceExcludedFromRecents(true); + + if (Flags.excludeTaskFromRecents()) { + assertTrue(task.isForceExcludedFromRecents()); + } else { + assertFalse(task.isForceExcludedFromRecents()); + } + } + + @Test + @EnableFlags(Flags.FLAG_EXCLUDE_TASK_FROM_RECENTS) + public void testSetForceExcludedFromRecents_resetsTaskForceExcludedFromRecents() { + final Task task = createTask(mDisplayContent); + task.setForceExcludedFromRecents(true); + + task.setForceExcludedFromRecents(false); + + assertFalse(task.isForceExcludedFromRecents()); + } + private Task getTestTask() { return new TaskBuilder(mSupervisor).setCreateActivity(true).build(); } |