From 9c906fbc942bbddba7fe3bc1c6e905281712a118 Mon Sep 17 00:00:00 2001 From: Shivam Agrawal Date: Wed, 27 Oct 2021 16:20:14 -0700 Subject: [PATCH] Include Activities That Have Not Been Assigned... ...to a Process Yet in TaskFragmentInfo TaskFragmentInfo might be reported before an activity has been assigned to a process, which would prevent the activity from being reported in the TaskFragmentInfo activities array because the activity process id does not match the TaskFragmentOrganizer process id. However, the activity is still reported in the running activity count and makes the TaskFragment non-empty. This discrepency results in unnecessary split info callbacks because the change in TaskFragmentInfo#isEmpty or runningActivityCount triggers an onTaskFragmentInfoChanged callback in SplitController, which triggers a split info callback. However, this split info callback will soon be stale information because once the activity has been attached to a process, the activity lifecycle listener in SplitController will send a split info callback. This CL uses a combination of uid and process name to check that the activity belongs to the TaskFragmentOrganizer process instead of the process id. uid and process name are set during activity creation whereas pid is set afterwards, which causes the discrepency. Bug: b/204193051 b/205240942 b/204721225 b/204405410 Test: atest CtsWindowManagerJetpackTestCases:ActivityEmbeddingLaunchTests Change-Id: Icfa28325da0278d2fb70e1111ffd39412b370bdb --- .../com/android/server/wm/TaskFragment.java | 22 +++++++++---------- .../server/wm/WindowOrganizerController.java | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index f08ebba7839ed..44c7d09d8a537 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -31,6 +31,7 @@ import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; +import static android.os.Process.INVALID_UID; import static android.os.UserHandle.USER_NULL; import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManager.TRANSIT_CLOSE; @@ -221,6 +222,8 @@ class TaskFragment extends WindowContainer { /** Organizer that organizing this TaskFragment. */ @Nullable private ITaskFragmentOrganizer mTaskFragmentOrganizer; + private int mTaskFragmentOrganizerUid = INVALID_UID; + private @Nullable String mTaskFragmentOrganizerProcessName; /** Client assigned unique token for this TaskFragment if this is created by an organizer. */ @Nullable @@ -233,13 +236,6 @@ class TaskFragment extends WindowContainer { */ private boolean mDelayLastActivityRemoval; - /** - * The PID of the organizer that created this TaskFragment. It should be the same as the PID - * of {@link android.window.TaskFragmentCreationParams#getOwnerToken()}. - * {@link ActivityRecord#INVALID_PID} if this is not an organizer-created TaskFragment. - */ - private int mTaskFragmentOrganizerPid = ActivityRecord.INVALID_PID; - final Point mLastSurfaceSize = new Point(); private final Rect mTmpInsets = new Rect(); @@ -338,9 +334,11 @@ class TaskFragment extends WindowContainer { mDelayLastActivityRemoval = false; } - void setTaskFragmentOrganizer(TaskFragmentOrganizerToken organizer, int pid) { + void setTaskFragmentOrganizer(@NonNull TaskFragmentOrganizerToken organizer, int uid, + @NonNull String processName) { mTaskFragmentOrganizer = ITaskFragmentOrganizer.Stub.asInterface(organizer.asBinder()); - mTaskFragmentOrganizerPid = pid; + mTaskFragmentOrganizerUid = uid; + mTaskFragmentOrganizerProcessName = processName; } /** Whether this TaskFragment is organized by the given {@code organizer}. */ @@ -2178,9 +2176,11 @@ class TaskFragment extends WindowContainer { List childActivities = new ArrayList<>(); for (int i = 0; i < getChildCount(); i++) { WindowContainer wc = getChildAt(i); - if (mTaskFragmentOrganizerPid != ActivityRecord.INVALID_PID + if (mTaskFragmentOrganizerUid != INVALID_UID && wc.asActivityRecord() != null - && wc.asActivityRecord().getPid() == mTaskFragmentOrganizerPid) { + && wc.asActivityRecord().info.processName.equals( + mTaskFragmentOrganizerProcessName) + && wc.asActivityRecord().getUid() == mTaskFragmentOrganizerUid) { // Only includes Activities that belong to the organizer process for security. childActivities.add(wc.asActivityRecord().appToken); } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 43a4f977e73aa..5dd01a5b46ec5 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1205,8 +1205,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub creationParams.getFragmentToken(), true /* createdByOrganizer */); // Set task fragment organizer immediately, since it might have to be notified about further // actions. - taskFragment.setTaskFragmentOrganizer( - creationParams.getOrganizer(), ownerActivity.getPid()); + taskFragment.setTaskFragmentOrganizer(creationParams.getOrganizer(), + ownerActivity.getUid(), ownerActivity.info.processName); ownerActivity.getTask().addChild(taskFragment, POSITION_TOP); taskFragment.setWindowingMode(creationParams.getWindowingMode()); taskFragment.setBounds(creationParams.getInitialBounds());