diff options
3 files changed, 29 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9b98380dd5e8..202a01f44295 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -366,6 +366,10 @@ class Task extends TaskFragment { * user wants to return to it. */ private WindowProcessController mRootProcess; + /** The TF host info are set once the task has ever added an organized task fragment. */ + int mTaskFragmentHostUid; + String mTaskFragmentHostProcessName; + /** Takes on same value as first root activity */ boolean isPersistable = false; int maxRecents; @@ -1474,6 +1478,11 @@ class Task extends TaskFragment { // passed from Task constructor. final TaskFragment childTaskFrag = child.asTaskFragment(); if (childTaskFrag != null && childTaskFrag.asTask() == null) { + if (childTaskFrag.mTaskFragmentOrganizerProcessName != null + && mTaskFragmentHostProcessName == null) { + mTaskFragmentHostUid = childTaskFrag.mTaskFragmentOrganizerUid; + mTaskFragmentHostProcessName = childTaskFrag.mTaskFragmentOrganizerProcessName; + } childTaskFrag.setMinDimensions(mMinWidth, mMinHeight); // The starting window should keep covering its task when a pure TaskFragment is added diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 2b631f7a404e..6a7f60b3447d 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -320,9 +320,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { /** Organizer that organizing this TaskFragment. */ @Nullable private ITaskFragmentOrganizer mTaskFragmentOrganizer; - @VisibleForTesting + int mTaskFragmentOrganizerUid = INVALID_UID; - private @Nullable String mTaskFragmentOrganizerProcessName; + @Nullable String mTaskFragmentOrganizerProcessName; /** Client assigned unique token for this TaskFragment if this is created by an organizer. */ @Nullable @@ -485,14 +485,16 @@ class TaskFragment extends WindowContainer<WindowContainer> { */ @Nullable private WindowProcessController getOrganizerProcessIfDifferent(@Nullable ActivityRecord r) { - if ((r == null || mTaskFragmentOrganizerProcessName == null) - || (mTaskFragmentOrganizerProcessName.equals(r.processName) - && mTaskFragmentOrganizerUid == r.getUid())) { - // No organizer or the process is the same. + final Task task = getTask(); + if (r == null || task == null || task.mTaskFragmentHostProcessName == null) { + return null; + } + if (task.mTaskFragmentHostProcessName.equals(r.processName) + && task.mTaskFragmentHostUid == r.getUid()) { return null; } - return mAtmService.getProcessController(mTaskFragmentOrganizerProcessName, - mTaskFragmentOrganizerUid); + return mAtmService.getProcessController(task.mTaskFragmentHostProcessName, + task.mTaskFragmentHostUid); } void setAnimationParams(@NonNull TaskFragmentAnimationParams animationParams) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index 83e4151235ea..afa669807c2e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -487,6 +487,16 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { // Flush EVENT_APPEARED. mController.dispatchPendingEvents(); + // Even if the activity is not launched in an organized TaskFragment, it is still considered + // as the remote activity to the organizer process. Because when the task becomes visible, + // the organizer process needs to be interactive (unfrozen) to receive TaskFragment events. + activity.setVisibleRequested(true); + activity.setState(ActivityRecord.State.RESUMED, "test"); + assertTrue(organizerProc.hasVisibleActivities()); + activity.setVisibleRequested(false); + activity.setState(ActivityRecord.State.STOPPED, "test"); + assertFalse(organizerProc.hasVisibleActivities()); + // Make sure the activity belongs to the same app, but it is in a different pid. activity.info.applicationInfo.uid = uid; doReturn(pid + 1).when(activity).getPid(); |