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

Commit 72e2997f authored by Yunfan Chen's avatar Yunfan Chen
Browse files

Extend providedInternalInsets to be type specific

This change will change the providedInternalInsets from a single insets
to a insets array. The one adding the insets can make use of the array
to apply different insets to the window when calculating the provided
insets by the window for different insets types.

With that, the task bar can provide zero insets for the tappable element
type when stashed.

Bug: 215411414
Test: DisplayPolicyTests
Change-Id: I84cd7ef6a2bc19229d3c09f752f65c83eb5c7dde
parent 6b0ae59a
Loading
Loading
Loading
Loading
+41 −14
Original line number Diff line number Diff line
@@ -3592,12 +3592,13 @@ public interface WindowManager extends ViewManager {

        /**
         * If specified, the insets provided by this window will be our window frame minus the
         * insets specified by providedInternalInsets. This should not be used together with
         * {@link WindowState#mGivenContentInsets}. If both of them are set, both will be applied.
         * insets specified by providedInternalInsets for each type. This should not be used
         * together with {@link WindowState#mGivenContentInsets}. If both of them are set, both will
         * be applied.
         *
         * @hide
         */
        public Insets providedInternalInsets = Insets.NONE;
        public Insets[] providedInternalInsets;

        /**
         * If specified, the insets provided by this window for the IME will be our window frame
@@ -3605,7 +3606,7 @@ public interface WindowManager extends ViewManager {
         *
         * @hide
         */
        public Insets providedInternalImeInsets = Insets.NONE;
        public Insets[] providedInternalImeInsets;

        /**
         * If specified, the frame that used to calculate relative {@link RoundedCorner} will be
@@ -3991,8 +3992,18 @@ public interface WindowManager extends ViewManager {
            } else {
                out.writeInt(0);
            }
            providedInternalInsets.writeToParcel(out, 0 /* parcelableFlags */);
            providedInternalImeInsets.writeToParcel(out, 0 /* parcelableFlags */);
            if (providedInternalInsets != null) {
                out.writeInt(providedInternalInsets.length);
                out.writeTypedArray(providedInternalInsets, 0 /* parcelableFlags */);
            } else {
                out.writeInt(0);
            }
            if (providedInternalImeInsets != null) {
                out.writeInt(providedInternalImeInsets.length);
                out.writeTypedArray(providedInternalImeInsets, 0 /* parcelableFlags */);
            } else {
                out.writeInt(0);
            }
            out.writeBoolean(insetsRoundedCornerFrame);
            if (paramsForRotation != null) {
                checkNonRecursiveParams();
@@ -4072,8 +4083,16 @@ public interface WindowManager extends ViewManager {
                providesInsetsTypes = new int[insetsTypesLength];
                in.readIntArray(providesInsetsTypes);
            }
            providedInternalInsets = Insets.CREATOR.createFromParcel(in);
            providedInternalImeInsets = Insets.CREATOR.createFromParcel(in);
            int providedInternalInsetsLength = in.readInt();
            if (providedInternalInsetsLength > 0) {
                providedInternalInsets = new Insets[providedInternalInsetsLength];
                in.readTypedArray(providedInternalInsets, Insets.CREATOR);
            }
            int providedInternalImeInsetsLength = in.readInt();
            if (providedInternalImeInsetsLength > 0) {
                providedInternalImeInsets = new Insets[providedInternalImeInsetsLength];
                in.readTypedArray(providedInternalImeInsets, Insets.CREATOR);
            }
            insetsRoundedCornerFrame = in.readBoolean();
            int paramsForRotationLength = in.readInt();
            if (paramsForRotationLength > 0) {
@@ -4376,12 +4395,12 @@ public interface WindowManager extends ViewManager {
                changes |= LAYOUT_CHANGED;
            }

            if (!providedInternalInsets.equals(o.providedInternalInsets)) {
            if (!Arrays.equals(providedInternalInsets, o.providedInternalInsets)) {
                providedInternalInsets = o.providedInternalInsets;
                changes |= LAYOUT_CHANGED;
            }

            if (!providedInternalImeInsets.equals(o.providedInternalImeInsets)) {
            if (!Arrays.equals(providedInternalImeInsets, o.providedInternalImeInsets)) {
                providedInternalImeInsets = o.providedInternalImeInsets;
                changes |= LAYOUT_CHANGED;
            }
@@ -4592,13 +4611,21 @@ public interface WindowManager extends ViewManager {
                    sb.append(InsetsState.typeToString(providesInsetsTypes[i]));
                }
            }
            if (!providedInternalInsets.equals(Insets.NONE)) {
            if (providedInternalInsets != null) {
                sb.append(System.lineSeparator());
                sb.append(" providedInternalInsets=");
                sb.append(providedInternalInsets);
                for (int i = 0; i < providedInternalInsets.length; ++i) {
                    if (i > 0) sb.append(' ');
                    sb.append((providedInternalInsets[i]));
                }
            }
            if (!providedInternalImeInsets.equals(Insets.NONE)) {
            if (providedInternalImeInsets != null) {
                sb.append(System.lineSeparator());
                sb.append(" providedInternalImeInsets=");
                sb.append(providedInternalImeInsets);
                for (int i = 0; i < providedInternalImeInsets.length; ++i) {
                    if (i > 0) sb.append(' ');
                    sb.append((providedInternalImeInsets[i]));
                }
            }
            if (insetsRoundedCornerFrame) {
                sb.append(" insetsRoundedCornerFrame=");
+1 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ public class WindowManagerWrapper {
    public static final int ITYPE_RIGHT_TAPPABLE_ELEMENT = InsetsState.ITYPE_RIGHT_TAPPABLE_ELEMENT;
    public static final int ITYPE_BOTTOM_TAPPABLE_ELEMENT =
            InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT;
    public static final int ITYPE_SIZE = InsetsState.SIZE;

    public static final int ANIMATION_DURATION_RESIZE = InsetsController.ANIMATION_DURATION_RESIZE;
    public static final Interpolator RESIZE_INTERPOLATOR = InsetsController.RESIZE_INTERPOLATOR;
+5 −2
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetsType;
import android.view.InsetsVisibilities;
import android.view.KeyEvent;
@@ -1551,10 +1552,12 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
                        | WindowManager.LayoutParams.FLAG_SLIPPERY,
                PixelFormat.TRANSLUCENT);
        lp.gravity = gravity;
        lp.providedInternalInsets = new Insets[InsetsState.SIZE];
        if (insetsHeight != -1) {
            lp.providedInternalInsets = Insets.of(0, height - insetsHeight, 0, 0);
            lp.providedInternalInsets[ITYPE_NAVIGATION_BAR] =
                    Insets.of(0, height - insetsHeight, 0, 0);
        } else {
            lp.providedInternalInsets = Insets.NONE;
            lp.providedInternalInsets[ITYPE_NAVIGATION_BAR] = null;
        }
        lp.token = new Binder();
        lp.accessibilityTitle = mContext.getString(R.string.nav_bar);
+46 −17
Original line number Diff line number Diff line
@@ -1146,8 +1146,13 @@ public class DisplayPolicy {
                mDisplayContent.setInsetProvider(ITYPE_NAVIGATION_BAR, win,
                        (displayFrames, windowContainer, inOutFrame) -> {
                            if (!mNavButtonForcedVisible) {
                                inOutFrame.inset(win.getLayoutingAttrs(
                                        displayFrames.mRotation).providedInternalInsets);
                                final Insets[] providedInternalInsets = win.getLayoutingAttrs(
                                        displayFrames.mRotation).providedInternalInsets;
                                if (providedInternalInsets != null
                                        && providedInternalInsets.length > ITYPE_NAVIGATION_BAR
                                        && providedInternalInsets[ITYPE_NAVIGATION_BAR] != null) {
                                    inOutFrame.inset(providedInternalInsets[ITYPE_NAVIGATION_BAR]);
                                }
                                inOutFrame.inset(win.mGivenContentInsets);
                            }
                        },
@@ -1193,13 +1198,16 @@ public class DisplayPolicy {
                if (attrs.providesInsetsTypes != null) {
                    for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) {
                        final TriConsumer<DisplayFrames, WindowContainer, Rect> imeFrameProvider =
                                !attrs.providedInternalImeInsets.equals(Insets.NONE)
                                        ? (displayFrames, windowContainer, inOutFrame) -> {
                                            inOutFrame.inset(win.getLayoutingAttrs(
                                                    displayFrames.mRotation)
                                                    .providedInternalImeInsets);
                                (displayFrames, windowContainer, inOutFrame) -> {
                                    final Insets[] providedInternalImeInsets =
                                            win.getLayoutingAttrs(displayFrames.mRotation)
                                                    .providedInternalImeInsets;
                                    if (providedInternalImeInsets != null
                                            && providedInternalImeInsets.length > insetsType
                                            && providedInternalImeInsets[insetsType] != null) {
                                        inOutFrame.inset(providedInternalImeInsets[insetsType]);
                                    }
                                        : null;
                                };
                        switch (insetsType) {
                            case ITYPE_STATUS_BAR:
                                mStatusBarAlt = win;
@@ -1220,8 +1228,13 @@ public class DisplayPolicy {
                        }
                        mDisplayContent.setInsetProvider(insetsType, win, (displayFrames,
                                windowContainer, inOutFrame) -> {
                            inOutFrame.inset(win.getLayoutingAttrs(
                                    displayFrames.mRotation).providedInternalInsets);
                            final Insets[] providedInternalInsets = win.getLayoutingAttrs(
                                    displayFrames.mRotation).providedInternalInsets;
                            if (providedInternalInsets != null
                                    && providedInternalInsets.length > insetsType
                                    && providedInternalInsets[insetsType] != null) {
                                inOutFrame.inset(providedInternalInsets[insetsType]);
                            }
                            inOutFrame.inset(win.mGivenContentInsets);
                        }, imeFrameProvider);
                        mInsetsSourceWindowsExceptIme.add(win);
@@ -1941,15 +1954,23 @@ public class DisplayPolicy {
                && lp.paramsForRotation[rotation] != null) {
            lp = lp.paramsForRotation[rotation];
        }
        final Insets providedInternalInsets;
        if (lp.providedInternalInsets != null
                && lp.providedInternalInsets.length > ITYPE_NAVIGATION_BAR
                && lp.providedInternalInsets[ITYPE_NAVIGATION_BAR] != null) {
            providedInternalInsets = lp.providedInternalInsets[ITYPE_NAVIGATION_BAR];
        } else {
            providedInternalInsets = Insets.NONE;
        }
        if (position == NAV_BAR_LEFT) {
            if (lp.width > lp.providedInternalInsets.right) {
                return lp.width - lp.providedInternalInsets.right;
            if (lp.width > providedInternalInsets.right) {
                return lp.width - providedInternalInsets.right;
            } else {
                return 0;
            }
        } else if (position == NAV_BAR_RIGHT) {
            if (lp.width > lp.providedInternalInsets.left) {
                return lp.width - lp.providedInternalInsets.left;
            if (lp.width > providedInternalInsets.left) {
                return lp.width - providedInternalInsets.left;
            } else {
                return 0;
            }
@@ -1998,10 +2019,18 @@ public class DisplayPolicy {
            return 0;
        }
        LayoutParams lp = mNavigationBar.getLayoutingAttrs(rotation);
        if (lp.height < lp.providedInternalInsets.top) {
        final Insets providedInternalInsets;
        if (lp.providedInternalInsets != null
                && lp.providedInternalInsets.length > ITYPE_NAVIGATION_BAR
                && lp.providedInternalInsets[ITYPE_NAVIGATION_BAR] != null) {
            providedInternalInsets = lp.providedInternalInsets[ITYPE_NAVIGATION_BAR];
        } else {
            providedInternalInsets = Insets.NONE;
        }
        if (lp.height < providedInternalInsets.top) {
            return 0;
        }
        return lp.height - lp.providedInternalInsets.top;
        return lp.height - providedInternalInsets.top;
    }

    /**