Loading services/core/java/com/android/server/wm/Task.java +9 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,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; Loading Loading @@ -1468,6 +1472,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 Loading services/core/java/com/android/server/wm/TaskFragment.java +10 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -485,6 +485,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(); Loading Loading
services/core/java/com/android/server/wm/Task.java +9 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,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; Loading Loading @@ -1468,6 +1472,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 Loading
services/core/java/com/android/server/wm/TaskFragment.java +10 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading
services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -485,6 +485,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(); Loading