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

Commit c1735a1f authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Allow ActivityEmbedding to finish Activity through WCT" into tm-qpr-dev

parents b2689e03 840218d5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3406,6 +3406,7 @@ package android.window {
    method @NonNull public android.window.WindowContainerTransaction createTaskFragment(@NonNull android.window.TaskFragmentCreationParams);
    method @NonNull public android.window.WindowContainerTransaction deleteTaskFragment(@NonNull android.window.WindowContainerToken);
    method public int describeContents();
    method @NonNull public android.window.WindowContainerTransaction finishActivity(@NonNull android.os.IBinder);
    method @NonNull public android.window.WindowContainerTransaction removeTask(@NonNull android.window.WindowContainerToken);
    method @NonNull public android.window.WindowContainerTransaction reorder(@NonNull android.window.WindowContainerToken, boolean);
    method @NonNull public android.window.WindowContainerTransaction reparent(@NonNull android.window.WindowContainerToken, @Nullable android.window.WindowContainerToken, boolean);
+20 −0
Original line number Diff line number Diff line
@@ -705,6 +705,23 @@ public final class WindowContainerTransaction implements Parcelable {
        return this;
    }

    /**
     * Finishes the Activity.
     * Comparing to directly calling {@link android.app.Activity#finish()}, calling this can make
     * sure the finishing happens in the same transaction with other operations.
     * @param activityToken activity to be finished.
     */
    @NonNull
    public WindowContainerTransaction finishActivity(@NonNull IBinder activityToken) {
        final HierarchyOp hierarchyOp =
                new HierarchyOp.Builder(
                        HierarchyOp.HIERARCHY_OP_TYPE_FINISH_ACTIVITY)
                        .setContainer(activityToken)
                        .build();
        mHierarchyOps.add(hierarchyOp);
        return this;
    }

    /**
     * Sets/removes the always on top flag for this {@code windowContainer}. See
     * {@link com.android.server.wm.ConfigurationContainer#setAlwaysOnTop(boolean)}.
@@ -1163,6 +1180,7 @@ public final class WindowContainerTransaction implements Parcelable {
        public static final int HIERARCHY_OP_TYPE_REQUEST_FOCUS_ON_TASK_FRAGMENT = 18;
        public static final int HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP = 19;
        public static final int HIERARCHY_OP_TYPE_REMOVE_TASK = 20;
        public static final int HIERARCHY_OP_TYPE_FINISH_ACTIVITY = 21;

        // The following key(s) are for use with mLaunchOptions:
        // When launching a task (eg. from recents), this is the taskId to be launched.
@@ -1484,6 +1502,8 @@ public final class WindowContainerTransaction implements Parcelable {
                            + " alwaysOnTop=" + mAlwaysOnTop + "}";
                case HIERARCHY_OP_TYPE_REMOVE_TASK:
                    return "{RemoveTask: task=" + mContainer + "}";
                case HIERARCHY_OP_TYPE_FINISH_ACTIVITY:
                    return "{finishActivity: activity=" + mContainer + "}";
                default:
                    return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
                            + " mToTop=" + mToTop
+2 −2
Original line number Diff line number Diff line
@@ -432,7 +432,7 @@ class TaskFragmentContainer {
                    // In case we have requested to reparent the activity to another container (as
                    // pendingAppeared), we don't want to finish it with this container.
                    && mController.getContainerWithActivity(activity) == this) {
                activity.finish();
                wct.finishActivity(activity.getActivityToken());
            }
        }

@@ -457,7 +457,7 @@ class TaskFragmentContainer {
                    || controller.shouldRetainAssociatedActivity(this, activity)) {
                continue;
            }
            activity.finish();
            wct.finishActivity(activity.getActivityToken());
        }
        mActivitiesToFinishOnExit.clear();
    }
+4 −4
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ public class SplitControllerTest {

        verify(mSplitPresenter, never()).deleteTaskFragment(any(), any());
        verify(mSplitController).removeContainer(tf);
        verify(mActivity, never()).finish();
        verify(mTransaction, never()).finishActivity(any());
    }

    @Test
@@ -1004,9 +1004,9 @@ public class SplitControllerTest {
        assertTrue(primaryContainer.isFinished());
        assertTrue(secondaryContainer0.isFinished());
        assertTrue(secondaryContainer1.isFinished());
        verify(mActivity).finish();
        verify(secondaryActivity0).finish();
        verify(secondaryActivity1).finish();
        verify(mTransaction).finishActivity(mActivity.getActivityToken());
        verify(mTransaction).finishActivity(secondaryActivity0.getActivityToken());
        verify(mTransaction).finishActivity(secondaryActivity1.getActivityToken());
        assertTrue(taskContainer.mContainers.isEmpty());
        assertTrue(taskContainer.mSplitContainers.isEmpty());
    }
+9 −10
Original line number Diff line number Diff line
@@ -107,30 +107,29 @@ public class TaskFragmentContainerTest {
        final TaskFragmentContainer container = new TaskFragmentContainer(mActivity,
                null /* pendingAppearedIntent */, taskContainer, mController);
        doReturn(container).when(mController).getContainerWithActivity(mActivity);
        final WindowContainerTransaction wct = new WindowContainerTransaction();

        // Only remove the activity, but not clear the reference until appeared.
        container.finish(true /* shouldFinishDependent */, mPresenter, wct, mController);
        container.finish(true /* shouldFinishDependent */, mPresenter, mTransaction, mController);

        verify(mActivity).finish();
        verify(mTransaction).finishActivity(mActivity.getActivityToken());
        verify(mPresenter, never()).deleteTaskFragment(any(), any());
        verify(mController, never()).removeContainer(any());

        // Calling twice should not finish activity again.
        clearInvocations(mActivity);
        container.finish(true /* shouldFinishDependent */, mPresenter, wct, mController);
        clearInvocations(mTransaction);
        container.finish(true /* shouldFinishDependent */, mPresenter, mTransaction, mController);

        verify(mActivity, never()).finish();
        verify(mTransaction, never()).finishActivity(any());
        verify(mPresenter, never()).deleteTaskFragment(any(), any());
        verify(mController, never()).removeContainer(any());

        // Remove all references after the container has appeared in server.
        doReturn(new ArrayList<>()).when(mInfo).getActivities();
        container.setInfo(mTransaction, mInfo);
        container.finish(true /* shouldFinishDependent */, mPresenter, wct, mController);
        container.finish(true /* shouldFinishDependent */, mPresenter, mTransaction, mController);

        verify(mActivity, never()).finish();
        verify(mPresenter).deleteTaskFragment(wct, container.getTaskFragmentToken());
        verify(mTransaction, never()).finishActivity(any());
        verify(mPresenter).deleteTaskFragment(mTransaction, container.getTaskFragmentToken());
        verify(mController).removeContainer(container);
    }

@@ -150,7 +149,7 @@ public class TaskFragmentContainerTest {
        // The activity is requested to be reparented, so don't finish it.
        container0.finish(true /* shouldFinishDependent */, mPresenter, wct, mController);

        verify(mActivity, never()).finish();
        verify(mTransaction, never()).finishActivity(any());
        verify(mPresenter).deleteTaskFragment(wct, container0.getTaskFragmentToken());
        verify(mController).removeContainer(container0);
    }
Loading