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

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

Adding a new TaskFragmentOperation to set dim area on Task

The new TaskFragmentOperation is set only if app requested to,
and the flag is enabled on the device.

Bug: 253533308
Test: TaskFragmentOrganizerControllerTest SplitPresenterTest
Change-Id: I72244ddb14bcaa88039080c425c5946ec8323af6
parent 07c812e2
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -120,6 +120,11 @@ public final class TaskFragmentOperation implements Parcelable {
     */
    public static final int OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE = 15;

    /**
     * Applies dimming on the parent Task which could cross two TaskFragments.
     */
    public static final int OP_TYPE_SET_DIM_ON_TASK = 16;

    @IntDef(prefix = { "OP_TYPE_" }, value = {
            OP_TYPE_UNKNOWN,
            OP_TYPE_CREATE_TASK_FRAGMENT,
@@ -138,6 +143,7 @@ public final class TaskFragmentOperation implements Parcelable {
            OP_TYPE_REORDER_TO_TOP_OF_TASK,
            OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE,
            OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE,
            OP_TYPE_SET_DIM_ON_TASK,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface OperationType {}
@@ -165,12 +171,14 @@ public final class TaskFragmentOperation implements Parcelable {

    private final boolean mIsolatedNav;

    private final boolean mDimOnTask;

    private TaskFragmentOperation(@OperationType int opType,
            @Nullable TaskFragmentCreationParams taskFragmentCreationParams,
            @Nullable IBinder activityToken, @Nullable Intent activityIntent,
            @Nullable Bundle bundle, @Nullable IBinder secondaryFragmentToken,
            @Nullable TaskFragmentAnimationParams animationParams,
            boolean isolatedNav) {
            boolean isolatedNav, boolean dimOnTask) {
        mOpType = opType;
        mTaskFragmentCreationParams = taskFragmentCreationParams;
        mActivityToken = activityToken;
@@ -179,6 +187,7 @@ public final class TaskFragmentOperation implements Parcelable {
        mSecondaryFragmentToken = secondaryFragmentToken;
        mAnimationParams = animationParams;
        mIsolatedNav = isolatedNav;
        mDimOnTask = dimOnTask;
    }

    private TaskFragmentOperation(Parcel in) {
@@ -190,6 +199,7 @@ public final class TaskFragmentOperation implements Parcelable {
        mSecondaryFragmentToken = in.readStrongBinder();
        mAnimationParams = in.readTypedObject(TaskFragmentAnimationParams.CREATOR);
        mIsolatedNav = in.readBoolean();
        mDimOnTask = in.readBoolean();
    }

    @Override
@@ -202,6 +212,7 @@ public final class TaskFragmentOperation implements Parcelable {
        dest.writeStrongBinder(mSecondaryFragmentToken);
        dest.writeTypedObject(mAnimationParams, flags);
        dest.writeBoolean(mIsolatedNav);
        dest.writeBoolean(mDimOnTask);
    }

    @NonNull
@@ -282,6 +293,13 @@ public final class TaskFragmentOperation implements Parcelable {
        return mIsolatedNav;
    }

    /**
     * Returns whether the dim layer should apply on the parent Task.
     */
    public boolean isDimOnTask() {
        return mDimOnTask;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
@@ -305,6 +323,7 @@ public final class TaskFragmentOperation implements Parcelable {
            sb.append(", animationParams=").append(mAnimationParams);
        }
        sb.append(", isolatedNav=").append(mIsolatedNav);
        sb.append(", dimOnTask=").append(mDimOnTask);

        sb.append('}');
        return sb.toString();
@@ -313,7 +332,7 @@ public final class TaskFragmentOperation implements Parcelable {
    @Override
    public int hashCode() {
        return Objects.hash(mOpType, mTaskFragmentCreationParams, mActivityToken, mActivityIntent,
                mBundle, mSecondaryFragmentToken, mAnimationParams, mIsolatedNav);
                mBundle, mSecondaryFragmentToken, mAnimationParams, mIsolatedNav, mDimOnTask);
    }

    @Override
@@ -329,7 +348,8 @@ public final class TaskFragmentOperation implements Parcelable {
                && Objects.equals(mBundle, other.mBundle)
                && Objects.equals(mSecondaryFragmentToken, other.mSecondaryFragmentToken)
                && Objects.equals(mAnimationParams, other.mAnimationParams)
                && mIsolatedNav == other.mIsolatedNav;
                && mIsolatedNav == other.mIsolatedNav
                && mDimOnTask == other.mDimOnTask;
    }

    @Override
@@ -363,6 +383,8 @@ public final class TaskFragmentOperation implements Parcelable {

        private boolean mIsolatedNav;

        private boolean mDimOnTask;

        /**
         * @param opType the {@link OperationType} of this {@link TaskFragmentOperation}.
         */
@@ -434,6 +456,15 @@ public final class TaskFragmentOperation implements Parcelable {
            return this;
        }

        /**
         * Sets the dimming to apply on the parent Task if any.
         */
        @NonNull
        public Builder setDimOnTask(boolean dimOnTask) {
            mDimOnTask = dimOnTask;
            return this;
        }

        /**
         * Constructs the {@link TaskFragmentOperation}.
         */
@@ -441,7 +472,7 @@ public final class TaskFragmentOperation implements Parcelable {
        public TaskFragmentOperation build() {
            return new TaskFragmentOperation(mOpType, mTaskFragmentCreationParams, mActivityToken,
                    mActivityIntent, mBundle, mSecondaryFragmentToken, mAnimationParams,
                    mIsolatedNav);
                    mIsolatedNav, mDimOnTask);
        }
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package androidx.window.extensions.embedding;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_FRONT;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_ANIMATION_PARAMS;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_DIM_ON_TASK;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_ISOLATED_NAVIGATION;

import static androidx.window.extensions.embedding.SplitContainer.getFinishPrimaryWithSecondaryBehavior;
@@ -356,6 +357,13 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
        wct.addTaskFragmentOperation(fragmentToken, operation);
    }

    void setTaskFragmentDimOnTask(@NonNull WindowContainerTransaction wct,
            @NonNull IBinder fragmentToken, boolean dimOnTask) {
        final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
                OP_TYPE_SET_DIM_ON_TASK).setDimOnTask(dimOnTask).build();
        wct.addTaskFragmentOperation(fragmentToken, operation);
    }

    void updateTaskFragmentInfo(@NonNull TaskFragmentInfo taskFragmentInfo) {
        mFragmentInfos.put(taskFragmentInfo.getFragmentToken(), taskFragmentInfo);
    }
+27 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.content.pm.PackageManager.MATCH_ALL;

import static androidx.window.extensions.embedding.WindowAttributes.DIM_AREA_ON_TASK;

import android.app.Activity;
import android.app.ActivityThread;
import android.app.WindowConfiguration;
@@ -56,6 +58,7 @@ import androidx.window.extensions.layout.WindowLayoutComponentImpl;
import androidx.window.extensions.layout.WindowLayoutInfo;

import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;

import java.util.ArrayList;
import java.util.List;
@@ -384,6 +387,13 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
        setCompanionTaskFragment(wct, primaryContainer.getTaskFragmentToken(),
                secondaryContainer.getTaskFragmentToken(), splitRule, isStacked);

        // Sets the dim area when the two TaskFragments are adjacent.
        final boolean dimOnTask = !isStacked
                && splitAttributes.getWindowAttributes().getDimArea() == DIM_AREA_ON_TASK
                && Flags.fullscreenDimFlag();
        setTaskFragmentDimOnTask(wct, primaryContainer.getTaskFragmentToken(), dimOnTask);
        setTaskFragmentDimOnTask(wct, secondaryContainer.getTaskFragmentToken(), dimOnTask);

        // Setting isolated navigation and clear non-sticky pinned container if needed.
        final SplitPinRule splitPinRule =
                splitRule instanceof SplitPinRule ? (SplitPinRule) splitRule : null;
@@ -578,6 +588,23 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
                bounds.isEmpty() ? WINDOWING_MODE_FULLSCREEN : WINDOWING_MODE_MULTI_WINDOW);
    }

    @Override
    void setTaskFragmentDimOnTask(@NonNull WindowContainerTransaction wct,
            @NonNull IBinder fragmentToken, boolean dimOnTask) {
        final TaskFragmentContainer container = mController.getContainer(fragmentToken);
        if (container == null) {
            throw new IllegalStateException("setTaskFragmentDimOnTask on TaskFragment that is"
                    + " not registered with controller.");
        }

        if (container.isLastDimOnTask() == dimOnTask) {
            return;
        }

        container.setLastDimOnTask(dimOnTask);
        super.setTaskFragmentDimOnTask(wct, fragmentToken, dimOnTask);
    }

    /**
     * Expands the split container if the current split bounds are smaller than the Activity or
     * Intent that is added to the container.
+15 −0
Original line number Diff line number Diff line
@@ -171,6 +171,11 @@ class TaskFragmentContainer {
    /** Whether this TaskFragment enable isolated navigation. */
    private boolean mIsIsolatedNavigationEnabled;

    /**
     * Whether to apply dimming on the parent Task that was requested last.
     */
    private boolean mLastDimOnTask;

    /**
     * @see #TaskFragmentContainer(Activity, Intent, TaskContainer, SplitController,
     * TaskFragmentContainer, String, Bundle)
@@ -836,6 +841,16 @@ class TaskFragmentContainer {
        mIsIsolatedNavigationEnabled = isolatedNavigationEnabled;
    }

    /** Sets whether to apply dim on the parent Task. */
    void setLastDimOnTask(boolean lastDimOnTask) {
        mLastDimOnTask = lastDimOnTask;
    }

    /** Returns whether to apply dim on the parent Task. */
    boolean isLastDimOnTask() {
        return mLastDimOnTask;
    }

    /**
     * Adds the pending appeared activity that has requested to be launched in this task fragment.
     * @see android.app.ActivityClient#isRequestedToLaunchInTaskFragment
+13 −0
Original line number Diff line number Diff line
@@ -234,6 +234,19 @@ public class SplitPresenterTest {
        verify(mTransaction, never()).setCompanionTaskFragment(any(), any());
    }

    @Test
    public void testSetTaskFragmentDimOnTask() {
        final TaskFragmentContainer container = mController.newContainer(mActivity, TASK_ID);

        mPresenter.setTaskFragmentDimOnTask(mTransaction, container.getTaskFragmentToken(), true);
        verify(mTransaction).addTaskFragmentOperation(eq(container.getTaskFragmentToken()), any());

        // No request to set the same adjacent TaskFragments.
        clearInvocations(mTransaction);
        mPresenter.setTaskFragmentDimOnTask(mTransaction, container.getTaskFragmentToken(), true);
        verify(mTransaction, never()).addTaskFragmentOperation(any(), any());
    }

    @Test
    public void testUpdateAnimationParams() {
        final TaskFragmentContainer container = mController.newContainer(mActivity, TASK_ID);
Loading