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

Commit 6b6d7b97 authored by Jiaming Liu's avatar Jiaming Liu Committed by Android (Google) Code Review
Browse files

Merge "Allow system organizer to force translucent on TaskFragment" into main

parents ddec5209 b9360d68
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -486,8 +486,6 @@ class Task extends TaskFragment {

    private boolean mForceShowForAllUsers;

    private boolean mForceTranslucent = false;

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

@@ -4502,10 +4500,6 @@ class Task extends TaskFragment {
        return true;
    }

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

    @Override
    public boolean isAlwaysOnTop() {
        return !isForceHidden() && super.isAlwaysOnTop();
@@ -4522,11 +4516,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
@@ -374,6 +374,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();
@@ -843,8 +845,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;
@@ -768,8 +769,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;
        }
@@ -877,6 +877,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)) {
@@ -2022,9 +2027,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,