Merge "Providing caller's token when starting activity in TaskFragment" into sc-v2-dev am: 692e92bfde

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15359961

Change-Id: Ib5f1f947f4357f91a93bb818b63ac619d36b1d7f
This commit is contained in:
Louis Chang
2021-07-23 08:44:24 +00:00
committed by Automerger Merge Worker
5 changed files with 19 additions and 6 deletions

View File

@@ -443,6 +443,7 @@ public final class WindowContainerTransaction implements Parcelable {
* Starts an activity in the TaskFragment. * Starts an activity in the TaskFragment.
* @param fragmentToken client assigned unique token to create TaskFragment with specified in * @param fragmentToken client assigned unique token to create TaskFragment with specified in
* {@link TaskFragmentCreationParams#fragmentToken}. * {@link TaskFragmentCreationParams#fragmentToken}.
* @param callerToken the activity token that initialized the activity launch.
* @param activityIntent intent to start the activity. * @param activityIntent intent to start the activity.
* @param activityOptions ActivityOptions to start the activity with. * @param activityOptions ActivityOptions to start the activity with.
* @see android.content.Context#startActivity(Intent, Bundle). * @see android.content.Context#startActivity(Intent, Bundle).
@@ -450,12 +451,13 @@ public final class WindowContainerTransaction implements Parcelable {
*/ */
@NonNull @NonNull
public WindowContainerTransaction startActivityInTaskFragment( public WindowContainerTransaction startActivityInTaskFragment(
@NonNull IBinder fragmentToken, @NonNull Intent activityIntent, @NonNull IBinder fragmentToken, @NonNull IBinder callerToken,
@Nullable Bundle activityOptions) { @NonNull Intent activityIntent, @Nullable Bundle activityOptions) {
final HierarchyOp hierarchyOp = final HierarchyOp hierarchyOp =
new HierarchyOp.Builder( new HierarchyOp.Builder(
HierarchyOp.HIERARCHY_OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT) HierarchyOp.HIERARCHY_OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT)
.setContainer(fragmentToken) .setContainer(fragmentToken)
.setReparentContainer(callerToken)
.setActivityIntent(activityIntent) .setActivityIntent(activityIntent)
.setLaunchOptions(activityOptions) .setLaunchOptions(activityOptions)
.build(); .build();
@@ -1060,6 +1062,11 @@ public final class WindowContainerTransaction implements Parcelable {
return mReparent; return mReparent;
} }
@NonNull
public IBinder getCallingActivity() {
return mReparent;
}
public boolean getToTop() { public boolean getToTop() {
return mToTop; return mToTop;
} }

View File

@@ -175,7 +175,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
final TaskFragmentCreationParams fragmentOptions = final TaskFragmentCreationParams fragmentOptions =
createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode); createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode);
wct.createTaskFragment(fragmentOptions) wct.createTaskFragment(fragmentOptions)
.startActivityInTaskFragment(fragmentToken, activityIntent, activityOptions); .startActivityInTaskFragment(fragmentToken, ownerToken, activityIntent,
activityOptions);
} }
TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken, TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken,

View File

@@ -495,13 +495,17 @@ public class ActivityStartController {
* @param taskFragment TaskFragment {@link TaskFragment} to start the activity in. * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in.
* @param activityIntent intent to start the activity. * @param activityIntent intent to start the activity.
* @param activityOptions ActivityOptions to start the activity with. * @param activityOptions ActivityOptions to start the activity with.
* @param resultTo the caller activity
* @return the start result. * @return the start result.
*/ */
int startActivityInTaskFragment(@NonNull TaskFragment taskFragment, int startActivityInTaskFragment(@NonNull TaskFragment taskFragment,
@NonNull Intent activityIntent, @Nullable Bundle activityOptions) { @NonNull Intent activityIntent, @Nullable Bundle activityOptions,
@Nullable IBinder resultTo) {
return obtainStarter(activityIntent, "startActivityInTaskFragment") return obtainStarter(activityIntent, "startActivityInTaskFragment")
.setActivityOptions(activityOptions) .setActivityOptions(activityOptions)
.setInTaskFragment(taskFragment) .setInTaskFragment(taskFragment)
.setResultTo(resultTo)
.setRequestCode(-1)
.setCallingUid(Binder.getCallingUid()) .setCallingUid(Binder.getCallingUid())
.setCallingPid(Binder.getCallingPid()) .setCallingPid(Binder.getCallingPid())
.execute(); .execute();

View File

@@ -683,7 +683,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
final Bundle activityOptions = hop.getLaunchOptions(); final Bundle activityOptions = hop.getLaunchOptions();
final TaskFragment tf = mLaunchTaskFragments.get(fragmentToken); final TaskFragment tf = mLaunchTaskFragments.get(fragmentToken);
final int result = mService.getActivityStartController() final int result = mService.getActivityStartController()
.startActivityInTaskFragment(tf, activityIntent, activityOptions); .startActivityInTaskFragment(tf, activityIntent, activityOptions,
hop.getCallingActivity());
if (!isStartResultSuccessful(result)) { if (!isStartResultSuccessful(result)) {
final Throwable exception = final Throwable exception =
new ActivityNotFoundException("start activity in taskFragment failed"); new ActivityNotFoundException("start activity in taskFragment failed");

View File

@@ -319,7 +319,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
// Allow organizer to create TaskFragment and start/reparent activity to TaskFragment. // Allow organizer to create TaskFragment and start/reparent activity to TaskFragment.
mTransaction.createTaskFragment(mock(TaskFragmentCreationParams.class)); mTransaction.createTaskFragment(mock(TaskFragmentCreationParams.class));
mTransaction.startActivityInTaskFragment( mTransaction.startActivityInTaskFragment(
mFragmentToken, new Intent(), null /* activityOptions */); mFragmentToken, null /* callerToken */, new Intent(), null /* activityOptions */);
mTransaction.reparentActivityToTaskFragment(mFragmentToken, mock(IBinder.class)); mTransaction.reparentActivityToTaskFragment(mFragmentToken, mock(IBinder.class));
// It is expected to fail for the mock TaskFragmentCreationParams. It is ok as we are // It is expected to fail for the mock TaskFragmentCreationParams. It is ok as we are