summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/Task.java9
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java10
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();