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

Commit 8a269993 authored by Jorim Jaggi's avatar Jorim Jaggi Committed by Android (Google) Code Review
Browse files

Merge "Dispatch separate navigation bar frame to IME"

parents 3ce294d8 9b4f4207
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -1244,6 +1244,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        return mDisplayRotation;
    }

    void setInsetProvider(@InternalInsetsType int type, WindowState win,
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider){
        setInsetProvider(type, win, frameProvider, null /* imeFrameProvider */);
    }

    /**
     * Marks a window as providing insets for the rest of the windows in the system.
     *
@@ -1251,10 +1256,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
     * @param win The window.
     * @param frameProvider Function to compute the frame, or {@code null} if the just the frame of
     *                      the window should be taken.
     * @param imeFrameProvider Function to compute the frame when dispatching insets to the IME, or
     *                         {@code null} if the normal frame should be taken.
     */
    void setInsetProvider(@InternalInsetsType int type, WindowState win,
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) {
        mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider);
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider,
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) {
        mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider,
                imeFrameProvider);
    }

    InsetsStateController getInsetsStateController() {
@@ -3283,7 +3292,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        }
        computeImeTarget(true /* updateImeTarget */);
        mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win,
                null /* frameProvider */);
                null /* frameProvider */, null /* imeFrameProvider */);
    }

    /**
+6 −1
Original line number Diff line number Diff line
@@ -1026,7 +1026,12 @@ public class DisplayPolicy {
                                        - getNavigationBarHeight(displayFrames.mRotation,
                                                mDisplayContent.getConfiguration().uiMode);
                            }
                        });
                        },

                        // For IME we use regular frame.
                        (displayFrames, windowState, inOutFrame) ->
                                inOutFrame.set(windowState.getFrameLw()));

                mDisplayContent.setInsetProvider(ITYPE_BOTTOM_GESTURES, win,
                        (displayFrames, windowState, inOutFrame) -> {
                            inOutFrame.top -= mBottomGestureAdditionalInset;
+29 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetsType;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;

@@ -61,6 +62,8 @@ class InsetsSourceProvider {

    private @Nullable ControlAdapter mAdapter;
    private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider;
    private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider;
    private final Rect mImeOverrideFrame = new Rect();

    /** The visibility override from the current controlling window. */
    private boolean mClientVisible;
@@ -111,9 +114,12 @@ class InsetsSourceProvider {
     * @param win The window that links to this source.
     * @param frameProvider Based on display frame state and the window, calculates the resulting
     *                      frame that should be reported to clients.
     * @param imeFrameProvider Based on display frame state and the window, calculates the resulting
     *                         frame that should be reported to IME.
     */
    void setWindow(@Nullable WindowState win,
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) {
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider,
            @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) {
        if (mWin != null) {
            if (mControllable) {
                mWin.setControllableInsetProvider(null);
@@ -126,6 +132,7 @@ class InsetsSourceProvider {
        }
        mWin = win;
        mFrameProvider = frameProvider;
        mImeFrameProvider = imeFrameProvider;
        if (win == null) {
            setServerVisible(false);
            mSource.setFrame(new Rect());
@@ -162,6 +169,12 @@ class InsetsSourceProvider {
        }
        mSource.setFrame(mTmpRect);

        if (mImeFrameProvider != null) {
            mImeOverrideFrame.set(mWin.getFrameLw());
            mImeFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin,
                    mImeOverrideFrame);
        }

        if (mWin.mGivenVisibleInsets.left != 0 || mWin.mGivenVisibleInsets.top != 0
                || mWin.mGivenVisibleInsets.right != 0 || mWin.mGivenVisibleInsets.bottom != 0) {
            mTmpRect.set(mWin.getFrameLw());
@@ -303,6 +316,21 @@ class InsetsSourceProvider {
        return sNewInsetsMode == NEW_INSETS_MODE_NONE || mClientVisible;
    }

    /**
     * @return Whether this provider uses a different frame to dispatch to the IME.
     */
    boolean overridesImeFrame() {
        return mImeFrameProvider != null;
    }

    /**
     * @return Rect to dispatch to the IME as frame. Only valid if {@link #overridesImeFrame()}
     *         returns {@code true}.
     */
    Rect getImeOverrideFrame() {
        return mImeOverrideFrame;
    }

    private class ControlAdapter implements AnimationAdapter {

        private SurfaceControl mCapturedLeash;
+14 −0
Original line number Diff line number Diff line
@@ -88,6 +88,20 @@ class InsetsStateController {
            state.removeSource(ITYPE_IME);
            state.removeSource(ITYPE_STATUS_BAR);
        }

        // IME needs different frames for certain cases (e.g. navigation bar in gesture nav).
        if (type == ITYPE_IME) {
            for (int i = mProviders.size() - 1; i >= 0; i--) {
                InsetsSourceProvider otherProvider = mProviders.valueAt(i);
                if (otherProvider.overridesImeFrame()) {
                    InsetsSource override =
                            new InsetsSource(state.getSource(otherProvider.getSource().getType()));
                    override.setFrame(otherProvider.getImeOverrideFrame());
                    state.addSource(override);
                }
            }
        }

        return state;
    }

+8 −8
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        statusBar.mHasSurface = true;
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        mProvider.onPostLayout();
        assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame());
        assertEquals(Insets.of(0, 100, 0, 0),
@@ -74,7 +74,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        ime.getGivenContentInsetsLw().set(0, 0, 0, 60);
        ime.getGivenVisibleInsetsLw().set(0, 0, 0, 75);
        ime.mHasSurface = true;
        mProvider.setWindow(ime, null);
        mProvider.setWindow(ime, null, null);
        mProvider.onPostLayout();
        assertEquals(new Rect(0, 0, 500, 40), mProvider.getSource().getFrame());
        assertEquals(new Rect(0, 0, 500, 25), mProvider.getSource().getVisibleFrame());
@@ -89,7 +89,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
    public void testPostLayout_invisible() {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        mProvider.onPostLayout();
        assertEquals(Insets.NONE, mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500),
                        false /* ignoreVisibility */));
@@ -102,7 +102,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        mProvider.setWindow(statusBar,
                (displayFrames, windowState, rect) -> {
                    rect.set(10, 10, 20, 20);
                });
                }, null);
        mProvider.onPostLayout();
        assertEquals(new Rect(10, 10, 20, 20), mProvider.getSource().getFrame());
    }
@@ -112,7 +112,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        mProvider.updateControlForTarget(target, false /* force */);
        assertNotNull(mProvider.getControl(target));
        mProvider.updateControlForTarget(null, false /* force */);
@@ -124,7 +124,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        mProvider.updateControlForFakeTarget(target);
        assertNotNull(mProvider.getControl(target));
        assertNull(mProvider.getControl(target).getLeash());
@@ -137,7 +137,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        mProvider.updateControlForTarget(target, false /* force */);
        InsetsState state = new InsetsState();
        state.getSource(ITYPE_STATUS_BAR).setVisible(false);
@@ -150,7 +150,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
        final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
        statusBar.getFrameLw().set(0, 0, 500, 100);
        mProvider.setWindow(statusBar, null);
        mProvider.setWindow(statusBar, null, null);
        InsetsState state = new InsetsState();
        state.getSource(ITYPE_STATUS_BAR).setVisible(false);
        mProvider.onInsetsModified(target, state.getSource(ITYPE_STATUS_BAR));
Loading