Adds TaskInfo to some TaskChangeListener methods
This change dispatches TaskInfo directly for some methods
which currently only pass taskId. This eliminates the need
for second binder call to search for the TaskInfo.
See also: ag/6306456
Bug: 124058588
Bug: 123631242
Test: atest WmTests:TaskStackChangedListenerTest
Change-Id: I2e4c458f2a1ae684ef8d9f6a4ab2fbcfe13570b5
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 932cfd3..a4457e2 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -4019,7 +4019,7 @@
"Prepare close transition: finishing " + r);
if (endTask) {
mService.getTaskChangeNotificationController().notifyTaskRemovalStarted(
- task.taskId);
+ task.getTaskInfo());
}
getDisplay().mDisplayContent.prepareAppTransition(transit, false);
@@ -4924,8 +4924,7 @@
mRootActivityContainer.resumeFocusedStacksTopActivities();
EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, tr.userId, tr.taskId);
-
- mService.getTaskChangeNotificationController().notifyTaskMovedToFront(tr.taskId);
+ mService.getTaskChangeNotificationController().notifyTaskMovedToFront(tr.getTaskInfo());
} finally {
getDisplay().continueUpdateImeTarget();
}
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 0a3c2fb..e5127dd 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -2336,7 +2336,8 @@
Slog.w(TAG, "Failed to put " + task + " on display " + preferredDisplayId);
// Display a warning toast that we failed to put a task on a secondary display.
mService.getTaskChangeNotificationController()
- .notifyActivityLaunchOnSecondaryDisplayFailed();
+ .notifyActivityLaunchOnSecondaryDisplayFailed(task.getTaskInfo(),
+ preferredDisplayId);
return;
} else if (!forceNonResizable && handleForcedResizableTask(task,
FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY)) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 258819f..761431d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -2763,7 +2763,7 @@
r.setTaskDescription(td);
final TaskRecord task = r.getTaskRecord();
task.updateTaskDescription();
- mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.taskId, td);
+ mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.getTaskInfo());
}
}
}
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 15478b4..c6c85fd 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -70,7 +70,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.am.ActivityManagerService;
-import com.android.server.wm.TaskRecord.TaskActivitiesReport;
import com.google.android.collect.Sets;
@@ -180,7 +179,6 @@
private final HashMap<ComponentName, ActivityInfo> mTmpAvailActCache = new HashMap<>();
private final HashMap<String, ApplicationInfo> mTmpAvailAppCache = new HashMap<>();
private final SparseBooleanArray mTmpQuietProfileUserIds = new SparseBooleanArray();
- private final TaskActivitiesReport mTmpReport = new TaskActivitiesReport();
@VisibleForTesting
RecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) {
@@ -1587,7 +1585,7 @@
*/
ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr) {
ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();
- tr.fillTaskInfo(rti, mTmpReport);
+ tr.fillTaskInfo(rti);
// Fill in some deprecated values
rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID;
rti.persistentId = rti.taskId;
diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java
index 34282cd..3bf437d 100644
--- a/services/core/java/com/android/server/wm/RunningTasks.java
+++ b/services/core/java/com/android/server/wm/RunningTasks.java
@@ -35,8 +35,6 @@
private static final Comparator<TaskRecord> LAST_ACTIVE_TIME_COMPARATOR =
(o1, o2) -> Long.signum(o2.lastActiveTime - o1.lastActiveTime);
- private final TaskRecord.TaskActivitiesReport mTmpReport =
- new TaskRecord.TaskActivitiesReport();
private final TreeSet<TaskRecord> mTmpSortedSet = new TreeSet<>(LAST_ACTIVE_TIME_COMPARATOR);
private final ArrayList<TaskRecord> mTmpStackTasks = new ArrayList<>();
@@ -80,7 +78,7 @@
*/
private RunningTaskInfo createRunningTaskInfo(TaskRecord task) {
final RunningTaskInfo rti = new RunningTaskInfo();
- task.fillTaskInfo(rti, mTmpReport);
+ task.fillTaskInfo(rti);
// Fill in some deprecated values
rti.id = rti.taskId;
return rti;
diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
index bb3df02..789f987e 100644
--- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
+++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
@@ -16,9 +16,11 @@
package com.android.server.wm;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.TaskSnapshot;
import android.app.ITaskStackListener;
-import android.app.ActivityManager.TaskDescription;
+import android.app.TaskInfo;
import android.content.ComponentName;
import android.os.Binder;
import android.os.Handler;
@@ -80,11 +82,11 @@
};
private final TaskStackConsumer mNotifyTaskMovedToFront = (l, m) -> {
- l.onTaskMovedToFront(m.arg1);
+ l.onTaskMovedToFront((RunningTaskInfo) m.obj);
};
private final TaskStackConsumer mNotifyTaskDescriptionChanged = (l, m) -> {
- l.onTaskDescriptionChanged(m.arg1, (TaskDescription) m.obj);
+ l.onTaskDescriptionChanged((RunningTaskInfo) m.obj);
};
private final TaskStackConsumer mNotifyActivityRequestedOrientationChanged = (l, m) -> {
@@ -92,7 +94,7 @@
};
private final TaskStackConsumer mNotifyTaskRemovalStarted = (l, m) -> {
- l.onTaskRemovalStarted(m.arg1);
+ l.onTaskRemovalStarted((RunningTaskInfo) m.obj);
};
private final TaskStackConsumer mNotifyActivityPinned = (l, m) -> {
@@ -125,7 +127,7 @@
};
private final TaskStackConsumer mNotifyActivityLaunchOnSecondaryDisplayFailed = (l, m) -> {
- l.onActivityLaunchOnSecondaryDisplayFailed();
+ l.onActivityLaunchOnSecondaryDisplayFailed((RunningTaskInfo) m.obj, m.arg1);
};
private final TaskStackConsumer mNotifyTaskProfileLocked = (l, m) -> {
@@ -344,10 +346,11 @@
msg.sendToTarget();
}
- void notifyActivityLaunchOnSecondaryDisplayFailed() {
+ void notifyActivityLaunchOnSecondaryDisplayFailed(TaskInfo ti, int requestedDisplayId) {
mHandler.removeMessages(NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG);
final Message msg = mHandler.obtainMessage(
- NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG);
+ NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG, requestedDisplayId,
+ 0 /* unused */, ti);
forAllLocalListeners(mNotifyActivityLaunchOnSecondaryDisplayFailed, msg);
msg.sendToTarget();
}
@@ -366,16 +369,15 @@
msg.sendToTarget();
}
- void notifyTaskMovedToFront(int taskId) {
- final Message msg = mHandler.obtainMessage(NOTIFY_TASK_MOVED_TO_FRONT_LISTENERS_MSG,
- taskId, 0 /* unused */);
+ void notifyTaskMovedToFront(TaskInfo ti) {
+ final Message msg = mHandler.obtainMessage(NOTIFY_TASK_MOVED_TO_FRONT_LISTENERS_MSG, ti);
forAllLocalListeners(mNotifyTaskMovedToFront, msg);
msg.sendToTarget();
}
- void notifyTaskDescriptionChanged(int taskId, TaskDescription taskDescription) {
+ void notifyTaskDescriptionChanged(TaskInfo taskInfo) {
final Message msg = mHandler.obtainMessage(NOTIFY_TASK_DESCRIPTION_CHANGED_LISTENERS_MSG,
- taskId, 0 /* unused */, taskDescription);
+ taskInfo);
forAllLocalListeners(mNotifyTaskDescriptionChanged, msg);
msg.sendToTarget();
@@ -393,12 +395,10 @@
* the window manager. This allows interested parties to perform relevant animations before
* the window disappears.
*/
- void notifyTaskRemovalStarted(int taskId) {
- final Message msg = mHandler.obtainMessage(NOTIFY_TASK_REMOVAL_STARTED_LISTENERS, taskId,
- 0 /* unused */);
+ void notifyTaskRemovalStarted(ActivityManager.RunningTaskInfo taskInfo) {
+ final Message msg = mHandler.obtainMessage(NOTIFY_TASK_REMOVAL_STARTED_LISTENERS, taskInfo);
forAllLocalListeners(mNotifyTaskRemovalStarted, msg);
msg.sendToTarget();
-
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java
index 59d7560..08540a3 100644
--- a/services/core/java/com/android/server/wm/TaskRecord.java
+++ b/services/core/java/com/android/server/wm/TaskRecord.java
@@ -341,6 +341,9 @@
// TODO: remove after unification
Task mTask;
+ /** Used by fillTaskInfo */
+ final TaskActivitiesReport mReuseActivitiesReport = new TaskActivitiesReport();
+
/**
* Don't use constructor directly. Use {@link #create(ActivityTaskManagerService, int,
* ActivityInfo, Intent, TaskDescription)} instead.
@@ -2319,26 +2322,24 @@
/**
* Fills in a {@link TaskInfo} with information from this task.
* @param info the {@link TaskInfo} to fill in
- * @param reuseActivitiesReport a temporary activities report that we can reuse to fetch the
- * running activities
*/
- void fillTaskInfo(TaskInfo info, TaskActivitiesReport reuseActivitiesReport) {
- getNumRunningActivities(reuseActivitiesReport);
+ void fillTaskInfo(TaskInfo info) {
+ getNumRunningActivities(mReuseActivitiesReport);
info.userId = userId;
info.stackId = getStackId();
info.taskId = taskId;
info.displayId = mStack == null ? Display.INVALID_DISPLAY : mStack.mDisplayId;
info.isRunning = getTopActivity() != null;
info.baseIntent = new Intent(getBaseIntent());
- info.baseActivity = reuseActivitiesReport.base != null
- ? reuseActivitiesReport.base.intent.getComponent()
+ info.baseActivity = mReuseActivitiesReport.base != null
+ ? mReuseActivitiesReport.base.intent.getComponent()
: null;
- info.topActivity = reuseActivitiesReport.top != null
- ? reuseActivitiesReport.top.mActivityComponent
+ info.topActivity = mReuseActivitiesReport.top != null
+ ? mReuseActivitiesReport.top.mActivityComponent
: null;
info.origActivity = origActivity;
info.realActivity = realActivity;
- info.numActivities = reuseActivitiesReport.numActivities;
+ info.numActivities = mReuseActivitiesReport.numActivities;
info.lastActiveTime = lastActiveTime;
info.taskDescription = new ActivityManager.TaskDescription(lastTaskDescription);
info.supportsSplitScreenMultiWindow = supportsSplitScreenWindowingMode();
@@ -2346,6 +2347,15 @@
info.configuration.setTo(getConfiguration());
}
+ /**
+ * Returns a {@link TaskInfo} with information from this task.
+ */
+ ActivityManager.RunningTaskInfo getTaskInfo() {
+ ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo();
+ fillTaskInfo(info);
+ return info;
+ }
+
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("userId="); pw.print(userId);
pw.print(" effectiveUid="); UserHandle.formatUid(pw, effectiveUid);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
index bcf9dd2..84bc564 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java
@@ -37,6 +37,7 @@
import static org.mockito.Mockito.mock;
import android.app.ActivityManager;
+import android.app.TaskInfo;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -108,8 +109,7 @@
public void testCopyBaseIntentForTaskInfo() {
final TaskRecord task = createTaskRecord(1);
task.lastTaskDescription = new ActivityManager.TaskDescription();
- final ActivityManager.RecentTaskInfo info = new ActivityManager.RecentTaskInfo();
- task.fillTaskInfo(info, new TaskRecord.TaskActivitiesReport());
+ final TaskInfo info = task.getTaskInfo();
// The intent of info should be a copy so assert that they are different instances.
assertThat(info.baseIntent, not(sameInstance(task.getBaseIntent())));