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

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

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

View File

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

View File

@@ -4624,7 +4624,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
} }
/** Update AMS states when an activity is resumed. */ /** 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(); final Task task = r.getTask();
if (task.isActivityTypeStandard()) { if (task.isActivityTypeStandard()) {
if (mCurAppTimeTracker != r.appTimeTracker) { 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 * activity releases the top state and reports back, message about acquiring top state will be
* sent to the new top resumed activity. * sent to the new top resumed activity.
*/ */
void updateTopResumedActivityIfNeeded() { void updateTopResumedActivityIfNeeded(String reason) {
final ActivityRecord prevTopActivity = mTopResumedActivity; final ActivityRecord prevTopActivity = mTopResumedActivity;
final Task topRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask(); final Task topRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
if (topRootTask == null || topRootTask.getTopResumedActivity() == prevTopActivity) { if (topRootTask == null || topRootTask.getTopResumedActivity() == prevTopActivity) {
@@ -2119,6 +2119,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
} }
mService.updateOomAdj(); 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(); scheduleTopResumedActivityStateIfNeeded();
mService.updateTopApp(mTopResumedActivity); mService.updateTopApp(mTopResumedActivity);

View File

@@ -514,7 +514,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
void onChildPositionChanged(WindowContainer child) { void onChildPositionChanged(WindowContainer child) {
mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
!mWmService.mPerDisplayFocusEnabled /* updateInputWindows */); !mWmService.mPerDisplayFocusEnabled /* updateInputWindows */);
mTaskSupervisor.updateTopResumedActivityIfNeeded(); mTaskSupervisor.updateTopResumedActivityIfNeeded("onChildPositionChanged");
} }
@Override @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. // 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. // So here makes sure the activity focus is set if it is the top.
if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) { if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) {
mAtmService.setResumedActivityUncheckLocked(r, reason); mAtmService.setLastResumedActivityUncheckLocked(r, reason);
} }
} }
if (!animate) { if (!animate) {
@@ -2439,11 +2439,7 @@ class Task extends TaskFragment {
focusableTask.moveToFront(myReason); focusableTask.moveToFront(myReason);
// Top display focused root task is changed, update top resumed activity if needed. // Top display focused root task is changed, update top resumed activity if needed.
if (rootTask.getTopResumedActivity() != null) { if (rootTask.getTopResumedActivity() != null) {
mTaskSupervisor.updateTopResumedActivityIfNeeded(); mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
// 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);
} }
return rootTask; 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. // Clear preferred top because the adding focusable task has a higher z-order.
mPreferredTopFocusableRootTask = null; mPreferredTopFocusableRootTask = null;
} }
// Update the top resumed activity because the preferred top focusable task may be changed.
mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded("addChildTask");
mAtmService.updateSleepIfNeededLocked(); mAtmService.updateSleepIfNeededLocked();
onRootTaskOrderChanged(task); 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. // Update the top resumed activity because the preferred top focusable task may be changed.
mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded(); mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded("positionChildTaskAt");
final ActivityRecord r = child.getTopResumedActivity();
if (r != null && r == mRootWindowContainer.getTopResumedActivity()) {
mAtmService.setResumedActivityUncheckLocked(r, "positionChildAt");
}
if (mChildren.indexOf(child) != oldPosition) { if (mChildren.indexOf(child) != oldPosition) {
onRootTaskOrderChanged(child); onRootTaskOrderChanged(child);

View File

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

View File

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