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

Commit b9360d68 authored by Jiaming Liu's avatar Jiaming Liu
Browse files

Allow system organizer to force translucent on TaskFragment

Bug: 284050041
Test: atest WindowOrganizerTests
Change-Id: I3ea2672d0ac78364f3c2e01aaf22ab6440068557
parent 52d4cfa2
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -489,8 +489,6 @@ class Task extends TaskFragment {

    private boolean mForceShowForAllUsers;

    private boolean mForceTranslucent = false;

    // The display category name for this task.
    String mRequiredDisplayCategory;

@@ -4512,10 +4510,6 @@ class Task extends TaskFragment {
        return true;
    }

    void setForceTranslucent(boolean set) {
        mForceTranslucent = set;
    }

    @Override
    public boolean isAlwaysOnTop() {
        return !isForceHidden() && super.isAlwaysOnTop();
@@ -4532,11 +4526,6 @@ class Task extends TaskFragment {
        return (mForceHiddenFlags & FLAG_FORCE_HIDDEN_FOR_PINNED_TASK) != 0;
    }

    @Override
    protected boolean isForceTranslucent() {
        return mForceTranslucent;
    }

    @Override
    long getProtoFieldId() {
        return TASK;
+8 −2
Original line number Diff line number Diff line
@@ -375,6 +375,8 @@ class TaskFragment extends WindowContainer<WindowContainer> {
    @interface FlagForceHidden {}
    protected int mForceHiddenFlags = 0;

    private boolean mForceTranslucent = false;

    final Point mLastSurfaceSize = new Point();

    private final Rect mTmpBounds = new Rect();
@@ -879,8 +881,12 @@ class TaskFragment extends WindowContainer<WindowContainer> {
        return true;
    }

    protected boolean isForceTranslucent() {
        return false;
    boolean isForceTranslucent() {
        return mForceTranslucent;
    }

    void setForceTranslucent(boolean set) {
        mForceTranslucent = set;
    }

    boolean isLeafTaskFragment() {
+10 −3
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import static android.window.TaskFragmentOperation.OP_TYPE_SET_RELATIVE_BOUNDS;
import static android.window.TaskFragmentOperation.OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT;
import static android.window.TaskFragmentOperation.OP_TYPE_UNKNOWN;
import static android.window.WindowContainerTransaction.Change.CHANGE_FOCUSABLE;
import static android.window.WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT;
import static android.window.WindowContainerTransaction.Change.CHANGE_HIDDEN;
import static android.window.WindowContainerTransaction.Change.CHANGE_RELATIVE_BOUNDS;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER;
@@ -746,8 +747,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
            }
        }

        if ((c.getChangeMask()
                & WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT) != 0) {
        if ((c.getChangeMask() & CHANGE_FORCE_TRANSLUCENT) != 0) {
            tr.setForceTranslucent(c.getForceTranslucent());
            effects = TRANSACT_EFFECTS_LIFECYCLE;
        }
@@ -855,6 +855,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                effects |= TRANSACT_EFFECTS_LIFECYCLE;
            }
        }
        if ((c.getChangeMask() & CHANGE_FORCE_TRANSLUCENT) != 0) {
            taskFragment.setForceTranslucent(c.getForceTranslucent());
            effects = TRANSACT_EFFECTS_LIFECYCLE;
        }

        effects |= applyChanges(taskFragment, c);

        if (taskFragment.shouldStartChangeTransition(mTmpBounds0, mTmpBounds1)) {
@@ -1996,9 +2001,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub

        if (mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
            // System organizer is allowed to update the hidden and focusable state.
            // We unset the CHANGE_HIDDEN and CHANGE_FOCUSABLE bits because they are checked here.
            // We unset the CHANGE_HIDDEN, CHANGE_FOCUSABLE, and CHANGE_FORCE_TRANSLUCENT bits
            // because they are checked here.
            changeMaskToBeChecked &= ~CHANGE_HIDDEN;
            changeMaskToBeChecked &= ~CHANGE_FOCUSABLE;
            changeMaskToBeChecked &= ~CHANGE_FORCE_TRANSLUCENT;
        }

        // setRelativeBounds is allowed.
+31 −10
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ import org.mockito.ArgumentCaptor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.function.BiConsumer;

/**
 * Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
@@ -583,7 +584,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
    }

    @Test
    public void testTaskFragmentHiddenAndFocusableChanges() {
    public void testTaskFragmentHiddenFocusableTranslucentChanges() {
        removeGlobalMinSizeRestriction();
        final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true)
                .setWindowingMode(WINDOWING_MODE_FULLSCREEN).build();
@@ -605,10 +606,12 @@ public class WindowOrganizerTests extends WindowTestsBase {
        assertTrue(taskFragment.shouldBeVisible(null));
        assertTrue(taskFragment.isFocusable());
        assertTrue(taskFragment.isTopActivityFocusable());
        assertFalse(taskFragment.isForceTranslucent());

        // Apply transaction to the TaskFragment hidden and not focusable.
        t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), true);
        t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), false);
        t.setForceTranslucent(taskFragment.mRemoteToken.toWindowContainerToken(), true);
        mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked(
                t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE,
                false /* shouldApplyIndependently */);
@@ -617,10 +620,12 @@ public class WindowOrganizerTests extends WindowTestsBase {
        assertFalse(taskFragment.shouldBeVisible(null));
        assertFalse(taskFragment.isFocusable());
        assertFalse(taskFragment.isTopActivityFocusable());
        assertTrue(taskFragment.isForceTranslucent());

        // Apply transaction to the TaskFragment not hidden and focusable.
        t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), false);
        t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), true);
        t.setForceTranslucent(taskFragment.mRemoteToken.toWindowContainerToken(), false);
        mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked(
                t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE,
                false /* shouldApplyIndependently */);
@@ -629,10 +634,32 @@ public class WindowOrganizerTests extends WindowTestsBase {
        assertTrue(taskFragment.shouldBeVisible(null));
        assertTrue(taskFragment.isFocusable());
        assertTrue(taskFragment.isTopActivityFocusable());
        assertFalse(taskFragment.isForceTranslucent());
    }

    @Test
    public void testTaskFragmentHiddenAndFocusableChanges_throwsWhenNotSystemOrganizer() {
    public void testTaskFragmentChangeHidden_throwsWhenNotSystemOrganizer() {
        // Non-system organizers are not allow to update the hidden state.
        testTaskFragmentChangesWithoutSystemOrganizerThrowException(
                (t, windowContainerToken) -> t.setHidden(windowContainerToken, true));
    }

    @Test
    public void testTaskFragmentChangeFocusable_throwsWhenNotSystemOrganizer() {
        // Non-system organizers are not allow to update the focusable state.
        testTaskFragmentChangesWithoutSystemOrganizerThrowException(
                (t, windowContainerToken) -> t.setFocusable(windowContainerToken, false));
    }

    @Test
    public void testTaskFragmentChangeTranslucent_throwsWhenNotSystemOrganizer() {
        // Non-system organizers are not allow to update the translucent state.
        testTaskFragmentChangesWithoutSystemOrganizerThrowException(
                (t, windowContainerToken) -> t.setForceTranslucent(windowContainerToken, true));
    }

    private void testTaskFragmentChangesWithoutSystemOrganizerThrowException(
            BiConsumer<WindowContainerTransaction, WindowContainerToken> addOp) {
        removeGlobalMinSizeRestriction();
        final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true)
                .setWindowingMode(WINDOWING_MODE_FULLSCREEN).build();
@@ -641,21 +668,15 @@ public class WindowOrganizerTests extends WindowTestsBase {
        final TaskFragmentOrganizer organizer =
                createTaskFragmentOrganizer(t, false /* isSystemOrganizer */);

        final IBinder token = new Binder();
        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
                .setParentTask(rootTask)
                .setFragmentToken(token)
                .setFragmentToken(new Binder())
                .setOrganizer(organizer)
                .createActivityCount(1)
                .build();

        assertTrue(rootTask.shouldBeVisible(null));
        assertTrue(taskFragment.shouldBeVisible(null));

        t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), true);
        t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), false);
        addOp.accept(t, taskFragment.mRemoteToken.toWindowContainerToken());

        // Non-system organizers are not allow to update the hidden and focusable states.
        assertThrows(SecurityException.class, () ->
                mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked(
                        t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE,