diff --git a/core/java/android/window/TaskFragmentInfo.java b/core/java/android/window/TaskFragmentInfo.java index f864c91be31f8..6d4a2f130129b 100644 --- a/core/java/android/window/TaskFragmentInfo.java +++ b/core/java/android/window/TaskFragmentInfo.java @@ -25,6 +25,9 @@ import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; +import java.util.ArrayList; +import java.util.List; + /** * Stores information about a particular TaskFragment. * @hide @@ -50,9 +53,16 @@ public final class TaskFragmentInfo implements Parcelable { /** Whether this TaskFragment is visible on the window hierarchy. */ private final boolean mIsVisible; + /** + * List of Activity tokens that are children of this TaskFragment. It only contains Activities + * that belong to the organizer process for security. + */ + private final List mActivities = new ArrayList<>(); + public TaskFragmentInfo( @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token, - @NonNull Configuration configuration, boolean isEmpty, boolean isVisible) { + @NonNull Configuration configuration, boolean isEmpty, boolean isVisible, + List activities) { if (fragmentToken == null) { throw new IllegalArgumentException("Invalid TaskFragmentInfo."); } @@ -61,6 +71,7 @@ public final class TaskFragmentInfo implements Parcelable { mConfiguration.setTo(configuration); mIsEmpty = isEmpty; mIsVisible = isVisible; + mActivities.addAll(activities); } public IBinder getFragmentToken() { @@ -83,6 +94,10 @@ public final class TaskFragmentInfo implements Parcelable { return mIsVisible; } + public List getActivities() { + return mActivities; + } + @WindowingMode public int getWindowingMode() { return mConfiguration.windowConfiguration.getWindowingMode(); @@ -101,7 +116,8 @@ public final class TaskFragmentInfo implements Parcelable { && mToken.equals(that.mToken) && mIsEmpty == that.mIsEmpty && mIsVisible == that.mIsVisible - && getWindowingMode() == that.getWindowingMode(); + && getWindowingMode() == that.getWindowingMode() + && mActivities.equals(that.mActivities); } private TaskFragmentInfo(Parcel in) { @@ -110,6 +126,7 @@ public final class TaskFragmentInfo implements Parcelable { mConfiguration.readFromParcel(in); mIsEmpty = in.readBoolean(); mIsVisible = in.readBoolean(); + in.readBinderList(mActivities); } @Override @@ -119,6 +136,7 @@ public final class TaskFragmentInfo implements Parcelable { mConfiguration.writeToParcel(dest, flags); dest.writeBoolean(mIsEmpty); dest.writeBoolean(mIsVisible); + dest.writeBinderList(mActivities); } @NonNull diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 25d30336e0e71..65e10b8477e62 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -205,6 +205,13 @@ class TaskFragment extends WindowContainer { @Nullable private IBinder mFragmentToken; + /** + * 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; + private final Rect mTmpInsets = new Rect(); private final Rect mTmpBounds = new Rect(); private final Rect mTmpFullBounds = new Rect(); @@ -271,8 +278,9 @@ class TaskFragment extends WindowContainer { taskFragment.mAdjacentTaskFragment = this; } - void setTaskFragmentOrganizer(ITaskFragmentOrganizer organizer) { + void setTaskFragmentOrganizer(ITaskFragmentOrganizer organizer, int pid) { mTaskFragmentOrganizer = organizer; + mTaskFragmentOrganizerPid = pid; } TaskFragment getAdjacentTaskFragment() { @@ -1991,12 +1999,23 @@ class TaskFragment extends WindowContainer { * called from {@link Task}. */ TaskFragmentInfo getTaskFragmentInfo() { + List childActivities = new ArrayList<>(); + for (int i = 0; i < getChildCount(); i++) { + WindowContainer wc = getChildAt(i); + if (mTaskFragmentOrganizerPid != ActivityRecord.INVALID_PID + && wc.asActivityRecord() != null + && wc.asActivityRecord().getPid() == mTaskFragmentOrganizerPid) { + // Only includes Activities that belong to the organizer process for security. + childActivities.add(wc.asActivityRecord().appToken); + } + } return new TaskFragmentInfo( mFragmentToken, mRemoteToken.toWindowContainerToken(), getConfiguration(), getChildCount() == 0, - isVisible()); + isVisible(), + childActivities); } @Nullable diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index eeb83c66ce2bf..8dae839051fac 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -924,7 +924,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub ownerActivity.getTask().addChild(taskFragment, POSITION_TOP); taskFragment.setWindowingMode(creationParams.getWindowingMode()); taskFragment.setBounds(creationParams.getInitialBounds()); - taskFragment.setTaskFragmentOrganizer(creationParams.getOrganizer()); + taskFragment.setTaskFragmentOrganizer( + creationParams.getOrganizer(), ownerActivity.getPid()); mLaunchTaskFragments.put(creationParams.getFragmentToken(), taskFragment); }