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

Commit ec584382 authored by Tiger's avatar Tiger
Browse files

Describe requested visibilities in public types (3/n: server side)

This CL migrates requestedVisibilities (InsetsVisibilities) to
requestedVisibleTypes (int) at the system server side.

Bug: 253420890
Bug: 234093736
Test: atest DisplayContentTests DisplayPolicyTests
Change-Id: I35df21a4b36f3071b33455085bce903ea854dcb2
parent 9c4be367
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1459,7 +1459,8 @@ public final class WindowInsets {
            }
        }

        static String toString(@InsetsType int types) {
        /** @hide */
        public static String toString(@InsetsType int types) {
            StringBuilder result = new StringBuilder();
            if ((types & STATUS_BARS) != 0) {
                result.append("statusBars |");
+10 −28
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ import static android.view.Display.STATE_UNKNOWN;
import static android.view.Display.isSuspendedState;
import static android.view.InsetsState.ITYPE_IME;
import static android.view.InsetsState.ITYPE_LEFT_GESTURES;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_RIGHT_GESTURES;
import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_270;
@@ -55,6 +54,7 @@ import static android.view.Surface.ROTATION_90;
import static android.view.View.GONE;
import static android.view.WindowInsets.Type.displayCutout;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.systemBars;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY;
@@ -216,7 +216,6 @@ import android.view.InputDevice;
import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetsType;
import android.view.InsetsVisibilities;
import android.view.MagnificationSpec;
import android.view.PrivacyIndicatorBounds;
import android.view.RemoteAnimationDefinition;
@@ -789,11 +788,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        // higher window hierarchy, we don't give it focus if the next IME layering target
        // doesn't request IME visible.
        if (w.mIsImWindow && w.isChildWindow() && (mImeLayeringTarget == null
                || !mImeLayeringTarget.getRequestedVisibility(ITYPE_IME))) {
                || !mImeLayeringTarget.isRequestedVisible(ime()))) {
            return false;
        }
        if (w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG && mImeLayeringTarget != null
                && !mImeLayeringTarget.getRequestedVisibility(ITYPE_IME)
                && !mImeLayeringTarget.isRequestedVisible(ime())
                && !mImeLayeringTarget.isVisibleRequested()) {
            return false;
        }
@@ -2060,7 +2059,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        // is opened for logging metrics.
        if (mWmService.mAccessibilityController.hasCallbacks()) {
            final boolean isImeShow = mImeControlTarget != null
                    && mImeControlTarget.getRequestedVisibility(ITYPE_IME);
                    && mImeControlTarget.isRequestedVisible(ime());
            mWmService.mAccessibilityController.updateImeVisibilityIfNeeded(mDisplayId, isImeShow);
        }
    }
@@ -5685,7 +5684,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        final int type = win.mAttrs.type;
        final int privateFlags = win.mAttrs.privateFlags;
        final boolean stickyHideNav =
                !win.getRequestedVisibility(ITYPE_NAVIGATION_BAR)
                !win.isRequestedVisible(navigationBars())
                        && win.mAttrs.insetsFlags.behavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
        return (!stickyHideNav || ignoreRequest) && type != TYPE_INPUT_METHOD
                && type != TYPE_NOTIFICATION_SHADE && win.getActivityType() != ACTIVITY_TYPE_HOME
@@ -6695,7 +6694,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

    class RemoteInsetsControlTarget implements InsetsControlTarget {
        private final IDisplayWindowInsetsController mRemoteInsetsController;
        private final InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();
        private @InsetsType int mRequestedVisibleTypes = WindowInsets.Type.defaultVisible();
        private final boolean mCanShowTransient;

@@ -6764,19 +6762,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        }

        @Override
        public boolean getRequestedVisibility(@InternalInsetsType int type) {
            if (type == ITYPE_IME) {
        public boolean isRequestedVisible(@InsetsType int types) {
            if (types == ime()) {
                return getInsetsStateController().getImeSourceProvider().isImeShowing();
            }
            return mRequestedVisibilities.getVisibility(type);
            return (mRequestedVisibleTypes & types) != 0;
        }

        /**
         * Returns requested visible types of insets.
         *
         * @return an integer as the requested visible insets types.
         */
        @InsetsType int getRequestedVisibleTypes() {
        @Override
        public @InsetsType int getRequestedVisibleTypes() {
            return mRequestedVisibleTypes;
        }

@@ -6786,18 +6780,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        void setRequestedVisibleTypes(@InsetsType int requestedVisibleTypes) {
            if (mRequestedVisibleTypes != requestedVisibleTypes) {
                mRequestedVisibleTypes = requestedVisibleTypes;

                // TODO (253420890): Remove this when removing mRequestedVisibilities.
                final @InsetsType int defaultVisibleTypes = WindowInsets.Type.defaultVisible();
                final InsetsVisibilities insetsVisibilities = new InsetsVisibilities();
                for (@InternalInsetsType int i = InsetsState.SIZE - 1; i >= 0; i--) {
                    @InsetsType int type = InsetsState.toPublicType(i);
                    if ((type & (requestedVisibleTypes ^ defaultVisibleTypes)) != 0) {
                        // We only set the visibility if it is different from the default one.
                        insetsVisibilities.setVisibility(i, (type & requestedVisibleTypes) != 0);
                    }
                }
                mRequestedVisibilities.set(insetsVisibilities);
            }
        }
    }
+28 −17
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ import android.view.InsetsVisibilities;
import android.view.Surface;
import android.view.View;
import android.view.ViewDebug;
import android.view.WindowInsets;
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowLayout;
@@ -324,6 +325,7 @@ public class DisplayPolicy {
    private int mLastDisableFlags;
    private int mLastAppearance;
    private int mLastBehavior;
    private int mLastRequestedVisibleTypes = Type.defaultVisible();
    private InsetsVisibilities mRequestedVisibilities = new InsetsVisibilities();
    private AppearanceRegion[] mLastStatusBarAppearanceRegions;
    private LetterboxDetails[] mLastLetterboxDetails;
@@ -1861,7 +1863,7 @@ public class DisplayPolicy {
        if (mTopFullscreenOpaqueWindowState == null || mForceShowSystemBars) {
            return false;
        }
        return !mTopFullscreenOpaqueWindowState.getRequestedVisibility(ITYPE_STATUS_BAR);
        return !mTopFullscreenOpaqueWindowState.isRequestedVisible(Type.statusBars());
    }

    /**
@@ -2221,17 +2223,8 @@ public class DisplayPolicy {
            return;
        }

        final @InsetsType int restorePositionTypes =
                (controlTarget.getRequestedVisibility(ITYPE_NAVIGATION_BAR)
                        ? Type.navigationBars() : 0)
                | (controlTarget.getRequestedVisibility(ITYPE_STATUS_BAR)
                        ? Type.statusBars() : 0)
                | (mExtraNavBarAlt != null && controlTarget.getRequestedVisibility(
                                ITYPE_EXTRA_NAVIGATION_BAR)
                        ? Type.navigationBars() : 0)
                | (mClimateBarAlt != null && controlTarget.getRequestedVisibility(
                                ITYPE_CLIMATE_BAR)
                        ? Type.statusBars() : 0);
        final @InsetsType int restorePositionTypes = (Type.statusBars() | Type.navigationBars())
                & controlTarget.getRequestedVisibleTypes();

        if (swipeTarget == mNavigationBar
                && (restorePositionTypes & Type.navigationBars()) != 0) {
@@ -2325,8 +2318,8 @@ public class DisplayPolicy {
                navColorWin) | opaqueAppearance;
        final int behavior = win.mAttrs.insetsFlags.behavior;
        final String focusedApp = win.mAttrs.packageName;
        final boolean isFullscreen = !win.getRequestedVisibility(ITYPE_STATUS_BAR)
                || !win.getRequestedVisibility(ITYPE_NAVIGATION_BAR);
        final boolean isFullscreen = !win.isRequestedVisible(Type.statusBars())
                || !win.isRequestedVisible(Type.navigationBars());
        final AppearanceRegion[] statusBarAppearanceRegions =
                new AppearanceRegion[mStatusBarAppearanceRegionList.size()];
        mStatusBarAppearanceRegionList.toArray(statusBarAppearanceRegions);
@@ -2336,11 +2329,12 @@ public class DisplayPolicy {
            callStatusBarSafely(statusBar -> statusBar.setDisableFlags(displayId, disableFlags,
                    cause));
        }
        final @InsetsType int requestedVisibleTypes = win.getRequestedVisibleTypes();
        final LetterboxDetails[] letterboxDetails = new LetterboxDetails[mLetterboxDetails.size()];
        mLetterboxDetails.toArray(letterboxDetails);
        if (mLastAppearance == appearance
                && mLastBehavior == behavior
                && mRequestedVisibilities.equals(win.getRequestedVisibilities())
                && mLastRequestedVisibleTypes == requestedVisibleTypes
                && Objects.equals(mFocusedApp, focusedApp)
                && mLastFocusIsFullscreen == isFullscreen
                && Arrays.equals(mLastStatusBarAppearanceRegions, statusBarAppearanceRegions)
@@ -2353,9 +2347,12 @@ public class DisplayPolicy {
                    isFullscreen || (appearance & APPEARANCE_LOW_PROFILE_BARS) != 0);
        }
        final InsetsVisibilities requestedVisibilities =
                new InsetsVisibilities(win.getRequestedVisibilities());
                mLastRequestedVisibleTypes == requestedVisibleTypes
                        ? mRequestedVisibilities
                        : toInsetsVisibilities(requestedVisibleTypes);
        mLastAppearance = appearance;
        mLastBehavior = behavior;
        mLastRequestedVisibleTypes = requestedVisibleTypes;
        mRequestedVisibilities = requestedVisibilities;
        mFocusedApp = focusedApp;
        mLastFocusIsFullscreen = isFullscreen;
@@ -2366,6 +2363,20 @@ public class DisplayPolicy {
                requestedVisibilities, focusedApp, letterboxDetails));
    }

    // TODO (253420890): Remove this when removing mRequestedVisibilities.
    private static InsetsVisibilities toInsetsVisibilities(@InsetsType int requestedVisibleTypes) {
        final @InsetsType int defaultVisibleTypes = WindowInsets.Type.defaultVisible();
        final InsetsVisibilities insetsVisibilities = new InsetsVisibilities();
        for (@InternalInsetsType int i = InsetsState.SIZE - 1; i >= 0; i--) {
            @InsetsType int type = InsetsState.toPublicType(i);
            if ((type & (requestedVisibleTypes ^ defaultVisibleTypes)) != 0) {
                // We only set the visibility if it is different from the default one.
                insetsVisibilities.setVisibility(i, (type & requestedVisibleTypes) != 0);
            }
        }
        return insetsVisibilities;
    }

    private void callStatusBarSafely(Consumer<StatusBarManagerInternal> consumer) {
        mHandler.post(() -> {
            StatusBarManagerInternal statusBar = getStatusBarManagerInternal();
@@ -2456,7 +2467,7 @@ public class DisplayPolicy {
        appearance = configureNavBarOpacity(appearance, multiWindowTaskVisible,
                freeformRootTaskVisible);

        final boolean requestHideNavBar = !win.getRequestedVisibility(ITYPE_NAVIGATION_BAR);
        final boolean requestHideNavBar = !win.isRequestedVisible(Type.navigationBars());
        final long now = SystemClock.uptimeMillis();
        final boolean pendingPanic = mPendingPanicGestureUptime != 0
                && now - mPendingPanicGestureUptime <= PANIC_GESTURE_EXPIRATION;
+2 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.Trace;
import android.util.proto.ProtoOutputStream;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.WindowInsets;
import android.window.TaskSnapshot;

@@ -104,7 +105,7 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider
    @Override
    protected boolean updateClientVisibility(InsetsControlTarget caller) {
        boolean changed = super.updateClientVisibility(caller);
        if (changed && caller.getRequestedVisibility(mSource.getType())) {
        if (changed && caller.isRequestedVisible(InsetsState.toPublicType(mSource.getType()))) {
            reportImeDrawnForOrganizer(caller);
        }
        return changed;
+11 −5
Original line number Diff line number Diff line
@@ -17,8 +17,7 @@
package com.android.server.wm;

import android.inputmethodservice.InputMethodService;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetsType;
import android.view.WindowInsets;
import android.view.WindowInsets.Type.InsetsType;

/**
@@ -40,10 +39,17 @@ interface InsetsControlTarget {
    }

    /**
     * @return The requested visibility of this target.
     * @return {@code true} if any of the {@link InsetsType} is requested visible by this target.
     */
    default boolean getRequestedVisibility(@InternalInsetsType int type) {
        return InsetsState.getDefaultVisibility(type);
    default boolean isRequestedVisible(@InsetsType int types) {
        return (WindowInsets.Type.defaultVisible() & types) != 0;
    }

    /**
     * @return {@link InsetsType}s which are requested visible by this target.
     */
    default @InsetsType int getRequestedVisibleTypes() {
        return WindowInsets.Type.defaultVisible();
    }

    /**
Loading