Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca43bb06 authored by Louis Chang's avatar Louis Chang
Browse files

Providing caller's token when starting activity in TaskFragment

NEW_TASK flag was added by ATMS when #startActivityInTaskFragment
is called because the activity was started without source record.

Bug: 193846941
Test: starting CCT in sample app
Change-Id: Ida26034324f7ff761f1e688403d78959a01f010d
parent ede42318
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -443,6 +443,7 @@ public final class WindowContainerTransaction implements Parcelable {
     * Starts an activity in the TaskFragment.
     * @param fragmentToken client assigned unique token to create TaskFragment with specified in
     *                      {@link TaskFragmentCreationParams#fragmentToken}.
     * @param callerToken  the activity token that initialized the activity launch.
     * @param activityIntent    intent to start the activity.
     * @param activityOptions    ActivityOptions to start the activity with.
     * @see android.content.Context#startActivity(Intent, Bundle).
@@ -450,12 +451,13 @@ public final class WindowContainerTransaction implements Parcelable {
     */
    @NonNull
    public WindowContainerTransaction startActivityInTaskFragment(
            @NonNull IBinder fragmentToken, @NonNull Intent activityIntent,
            @Nullable Bundle activityOptions) {
            @NonNull IBinder fragmentToken, @NonNull IBinder callerToken,
            @NonNull Intent activityIntent, @Nullable Bundle activityOptions) {
        final HierarchyOp hierarchyOp =
                new HierarchyOp.Builder(
                        HierarchyOp.HIERARCHY_OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT)
                        .setContainer(fragmentToken)
                        .setReparentContainer(callerToken)
                        .setActivityIntent(activityIntent)
                        .setLaunchOptions(activityOptions)
                        .build();
@@ -1060,6 +1062,11 @@ public final class WindowContainerTransaction implements Parcelable {
            return mReparent;
        }

        @NonNull
        public IBinder getCallingActivity() {
            return mReparent;
        }

        public boolean getToTop() {
            return mToTop;
        }
+2 −1
Original line number Diff line number Diff line
@@ -175,7 +175,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
        final TaskFragmentCreationParams fragmentOptions =
                createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode);
        wct.createTaskFragment(fragmentOptions)
                .startActivityInTaskFragment(fragmentToken, activityIntent, activityOptions);
                .startActivityInTaskFragment(fragmentToken, ownerToken, activityIntent,
                        activityOptions);
    }

    TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken,
+5 −1
Original line number Diff line number Diff line
@@ -495,13 +495,17 @@ public class ActivityStartController {
     * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in.
     * @param activityIntent intent to start the activity.
     * @param activityOptions ActivityOptions to start the activity with.
     * @param resultTo the caller activity
     * @return the start result.
     */
    int startActivityInTaskFragment(@NonNull TaskFragment taskFragment,
            @NonNull Intent activityIntent, @Nullable Bundle activityOptions) {
            @NonNull Intent activityIntent, @Nullable Bundle activityOptions,
            @Nullable IBinder resultTo) {
        return obtainStarter(activityIntent, "startActivityInTaskFragment")
                .setActivityOptions(activityOptions)
                .setInTaskFragment(taskFragment)
                .setResultTo(resultTo)
                .setRequestCode(-1)
                .setCallingUid(Binder.getCallingUid())
                .setCallingPid(Binder.getCallingPid())
                .execute();
+2 −1
Original line number Diff line number Diff line
@@ -683,7 +683,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                final Bundle activityOptions = hop.getLaunchOptions();
                final TaskFragment tf = mLaunchTaskFragments.get(fragmentToken);
                final int result = mService.getActivityStartController()
                        .startActivityInTaskFragment(tf, activityIntent, activityOptions);
                        .startActivityInTaskFragment(tf, activityIntent, activityOptions,
                                hop.getCallingActivity());
                if (!isStartResultSuccessful(result)) {
                    final Throwable exception =
                            new ActivityNotFoundException("start activity in taskFragment failed");
+1 −1
Original line number Diff line number Diff line
@@ -319,7 +319,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
        // Allow organizer to create TaskFragment and start/reparent activity to TaskFragment.
        mTransaction.createTaskFragment(mock(TaskFragmentCreationParams.class));
        mTransaction.startActivityInTaskFragment(
                mFragmentToken, new Intent(), null /* activityOptions */);
                mFragmentToken, null /* callerToken */, new Intent(), null /* activityOptions */);
        mTransaction.reparentActivityToTaskFragment(mFragmentToken, mock(IBinder.class));

        // It is expected to fail for the mock TaskFragmentCreationParams. It is ok as we are