Merge "Update top resumed activity and focused app while adding a task on top" into tm-qpr-dev am: cc159e9abd am: 77e5530a83

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19599364

Change-Id: I8e2d7211c8006578302f9e52e8f42f4e95a0b530
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jerry Chang
2022-08-24 05:56:46 +00:00
committed by Automerger Merge Worker
8 changed files with 21 additions and 22 deletions

View File

@@ -3245,7 +3245,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
rootTask.moveToFront(reason, task);
// Report top activity change to tracking services and WM
if (mRootWindowContainer.getTopResumedActivity() == this) {
mAtmService.setResumedActivityUncheckLocked(this, reason);
mAtmService.setLastResumedActivityUncheckLocked(this, reason);
}
return true;
}

View File

@@ -4624,7 +4624,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
/** Update AMS states when an activity is resumed. */
void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
void setLastResumedActivityUncheckLocked(ActivityRecord r, String reason) {
final Task task = r.getTask();
if (task.isActivityTypeStandard()) {
if (mCurAppTimeTracker != r.appTimeTracker) {

View File

@@ -2083,7 +2083,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
* activity releases the top state and reports back, message about acquiring top state will be
* sent to the new top resumed activity.
*/
void updateTopResumedActivityIfNeeded() {
void updateTopResumedActivityIfNeeded(String reason) {
final ActivityRecord prevTopActivity = mTopResumedActivity;
final Task topRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
if (topRootTask == null || topRootTask.getTopResumedActivity() == prevTopActivity) {
@@ -2119,6 +2119,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
}
mService.updateOomAdj();
}
// Update the last resumed activity and focused app when the top resumed activity changed
// because the new top resumed activity might be already resumed and thus won't have
// activity state change to update the records to AMS.
if (mTopResumedActivity != null) {
mService.setLastResumedActivityUncheckLocked(mTopResumedActivity, reason);
}
scheduleTopResumedActivityStateIfNeeded();
mService.updateTopApp(mTopResumedActivity);

View File

@@ -512,7 +512,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
void onChildPositionChanged(WindowContainer child) {
mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
!mWmService.mPerDisplayFocusEnabled /* updateInputWindows */);
mTaskSupervisor.updateTopResumedActivityIfNeeded();
mTaskSupervisor.updateTopResumedActivityIfNeeded("onChildPositionChanged");
}
@Override

View File

@@ -920,7 +920,7 @@ class Task extends TaskFragment {
// If the original state is resumed, there is no state change to update focused app.
// So here makes sure the activity focus is set if it is the top.
if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) {
mAtmService.setResumedActivityUncheckLocked(r, reason);
mAtmService.setLastResumedActivityUncheckLocked(r, reason);
}
}
if (!animate) {
@@ -2433,11 +2433,7 @@ class Task extends TaskFragment {
focusableTask.moveToFront(myReason);
// Top display focused root task is changed, update top resumed activity if needed.
if (rootTask.getTopResumedActivity() != null) {
mTaskSupervisor.updateTopResumedActivityIfNeeded();
// Set focused app directly because if the next focused activity is already resumed
// (e.g. the next top activity is on a different display), there won't have activity
// state change to update it.
mAtmService.setResumedActivityUncheckLocked(rootTask.getTopResumedActivity(), reason);
mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
}
return rootTask;
}

View File

@@ -323,6 +323,10 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
// Clear preferred top because the adding focusable task has a higher z-order.
mPreferredTopFocusableRootTask = null;
}
// Update the top resumed activity because the preferred top focusable task may be changed.
mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded("addChildTask");
mAtmService.updateSleepIfNeededLocked();
onRootTaskOrderChanged(task);
}
@@ -416,12 +420,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
}
// Update the top resumed activity because the preferred top focusable task may be changed.
mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded();
final ActivityRecord r = child.getTopResumedActivity();
if (r != null && r == mRootWindowContainer.getTopResumedActivity()) {
mAtmService.setResumedActivityUncheckLocked(r, "positionChildAt");
}
mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded("positionChildTaskAt");
if (mChildren.indexOf(child) != oldPosition) {
onRootTaskOrderChanged(child);

View File

@@ -460,7 +460,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
final ActivityRecord prevR = mResumedActivity;
mResumedActivity = r;
mTaskSupervisor.updateTopResumedActivityIfNeeded();
mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
if (r == null && prevR.mDisplayContent != null
&& prevR.mDisplayContent.getFocusedRootTask() == null) {
// Only need to notify DWPC when no activity will resume.
@@ -773,9 +773,6 @@ class TaskFragment extends WindowContainer<WindowContainer> {
Slog.v(TAG, "set resumed activity to:" + record + " reason:" + reason);
}
setResumedActivity(record, reason + " - onActivityStateChanged");
if (record == mRootWindowContainer.getTopResumedActivity()) {
mAtmService.setResumedActivityUncheckLocked(record, reason);
}
mTaskSupervisor.mRecentTasks.add(record.getTask());
}
}

View File

@@ -228,7 +228,7 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase {
mAtm.getTaskChangeNotificationController();
spyOn(taskChangeNotifier);
mAtm.setResumedActivityUncheckLocked(fullScreenActivityA, "resumeA");
mAtm.setLastResumedActivityUncheckLocked(fullScreenActivityA, "resumeA");
verify(taskChangeNotifier).notifyTaskFocusChanged(eq(taskA.mTaskId) /* taskId */,
eq(true) /* focused */);
reset(taskChangeNotifier);
@@ -237,7 +237,7 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase {
.build();
final Task taskB = fullScreenActivityB.getTask();
mAtm.setResumedActivityUncheckLocked(fullScreenActivityB, "resumeB");
mAtm.setLastResumedActivityUncheckLocked(fullScreenActivityB, "resumeB");
verify(taskChangeNotifier).notifyTaskFocusChanged(eq(taskA.mTaskId) /* taskId */,
eq(false) /* focused */);
verify(taskChangeNotifier).notifyTaskFocusChanged(eq(taskB.mTaskId) /* taskId */,
@@ -295,6 +295,7 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase {
activity1.moveFocusableActivityToTop("test");
assertEquals(activity1.getUid(), pendingTopUid[0]);
verify(mAtm).updateOomAdj();
verify(mAtm).setLastResumedActivityUncheckLocked(any(), eq("test"));
}
/**