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

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

Merge changes I09e00935,Iddd09920 into main

* changes:
  Add TaskFragment operation to set can affect system ui flag
  Move canAffectSystemUiFlags to TaskFragment
parents 0f4ac144 60f3c56e
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -161,6 +161,16 @@ public final class TaskFragmentOperation implements Parcelable {
     */
    public static final int OP_TYPE_SET_PINNED = 19;

    /**
     * Sets whether this TaskFragment can affect system UI flags such as the status bar. Default
     * is {@code true}.
     *
     * This operation is only allowed for system organizers. See
     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
     * ITaskFragmentOrganizer, boolean)}
     */
    public static final int OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS = 20;

    @IntDef(prefix = { "OP_TYPE_" }, value = {
            OP_TYPE_UNKNOWN,
            OP_TYPE_CREATE_TASK_FRAGMENT,
@@ -183,6 +193,7 @@ public final class TaskFragmentOperation implements Parcelable {
            OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH,
            OP_TYPE_SET_DECOR_SURFACE_BOOSTED,
            OP_TYPE_SET_PINNED,
            OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface OperationType {}
+3 −1
Original line number Diff line number Diff line
@@ -5476,7 +5476,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    }

    boolean canAffectSystemUiFlags() {
        return task != null && task.canAffectSystemUiFlags() && isVisible()
        final TaskFragment taskFragment = getTaskFragment();
        return taskFragment != null && taskFragment.canAffectSystemUiFlags()
                && isVisible()
                && !mWaitForEnteringPinnedMode && !inPinnedWindowingMode();
    }

+0 −18
Original line number Diff line number Diff line
@@ -468,9 +468,6 @@ class Task extends TaskFragment {
    // NOTE: This value needs to be persisted with each task
    private TaskDescription mTaskDescription;

    /** @see #setCanAffectSystemUiFlags */
    private boolean mCanAffectSystemUiFlags = true;

    private static Exception sTmpException;

    private boolean mForceShowForAllUsers;
@@ -3288,21 +3285,6 @@ class Task extends TaskFragment {
        return isRootTask() && callback.test(this) ? this : null;
    }

    /**
     * @param canAffectSystemUiFlags If false, all windows in this task can not affect SystemUI
     *                               flags. See {@link WindowState#canAffectSystemUiFlags()}.
     */
    void setCanAffectSystemUiFlags(boolean canAffectSystemUiFlags) {
        mCanAffectSystemUiFlags = canAffectSystemUiFlags;
    }

    /**
     * @see #setCanAffectSystemUiFlags
     */
    boolean canAffectSystemUiFlags() {
        return mCanAffectSystemUiFlags;
    }

    void dontAnimateDimExit() {
        mDimmer.dontAnimateExit();
    }
+24 −0
Original line number Diff line number Diff line
@@ -409,6 +409,9 @@ class TaskFragment extends WindowContainer<WindowContainer> {

    private boolean mForceTranslucent = false;

    /** @see #setCanAffectSystemUiFlags */
    private boolean mCanAffectSystemUiFlags = true;

    final Point mLastSurfaceSize = new Point();

    private final Rect mTmpBounds = new Rect();
@@ -966,6 +969,27 @@ class TaskFragment extends WindowContainer<WindowContainer> {
        return !forAllActivities(r -> !isAllowedToEmbedActivityInTrustedMode(r));
    }

    /**
     * @param canAffectSystemUiFlags If false, all windows in this taskfragment can not affect
     *                               SystemUI flags. See
     *                               {@link WindowState#canAffectSystemUiFlags()}.
     */
    void setCanAffectSystemUiFlags(boolean canAffectSystemUiFlags) {
        mCanAffectSystemUiFlags = canAffectSystemUiFlags;
    }

    /**
     * @see #setCanAffectSystemUiFlags
     */
    boolean canAffectSystemUiFlags() {
        if (!mCanAffectSystemUiFlags) {
            return false;
        }
        final TaskFragment parentTaskFragment =
                getParent() != null ? getParent().asTaskFragment() : null;
        return parentTaskFragment == null || parentTaskFragment.canAffectSystemUiFlags();
    }

    /**
     * Returns the TaskFragment that is being organized, which could be this or the ascendant
     * TaskFragment.
+18 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static android.window.TaskFragmentOperation.OP_TYPE_REPARENT_ACTIVITY_TO_
import static android.window.TaskFragmentOperation.OP_TYPE_REQUEST_FOCUS_ON_TASK_FRAGMENT;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_ANIMATION_PARAMS;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_COMPANION_TASK_FRAGMENT;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_DECOR_SURFACE_BOOSTED;
import static android.window.TaskFragmentOperation.OP_TYPE_SET_DIM_ON_TASK;
@@ -1862,6 +1863,13 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                taskFragment.setPinned(pinned);
                break;
            }
            case OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS: {
                taskFragment.setCanAffectSystemUiFlags(operation.getBooleanValue());

                // Request to apply the flags.
                mService.mWindowManager.mWindowPlacerLocked.requestTraversal();
                break;
            }
        }
        return effects;
    }
@@ -1937,6 +1945,16 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
            return false;
        }

        if ((opType == OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS)
                && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
            final Throwable exception = new SecurityException(
                    "Only a system organizer can perform OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS."
            );
            sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
                    opType, exception);
            return false;
        }

        final IBinder secondaryFragmentToken = operation.getSecondaryFragmentToken();
        return secondaryFragmentToken == null
                || validateTaskFragment(mLaunchTaskFragments.get(secondaryFragmentToken), opType,
Loading