summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/RecentTasks.java10
-rw-r--r--services/core/java/com/android/server/wm/Task.java42
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskTests.java32
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();
}