Support given content insets for non-IME windows

This will let the task bar and all other windows provide an insets frame
smaller than the window's frame. This is a regression caused by the
flexible insets change.

If the window provides both internal insets and the content insets, both
of them will be deducted. A comment is added to the
provideInternalInsets to avoid the mis-use. There's a long term plan to
change the functionality of the provideInternalInsets. Will have it in
the follow-up patches.

Bug: 212221722
Test: atest DisplayPolicyTests
Change-Id: Ib9e414627992b46b1a1d0afa314ea180dfdbc4d6
This commit is contained in:
Yunfan Chen
2022-01-12 17:55:09 +09:00
parent 189f69261f
commit 98cc29d15d
3 changed files with 31 additions and 4 deletions

View File

@@ -3581,7 +3581,8 @@ public interface WindowManager extends ViewManager {
/**
* If specified, the insets provided by this window will be our window frame minus the
* insets specified by providedInternalInsets.
* insets specified by providedInternalInsets. This should not be used together with
* {@link WindowState#mGivenContentInsets}. If both of them are set, both will be applied.
*
* @hide
*/

View File

@@ -1122,6 +1122,7 @@ public class DisplayPolicy {
if (!mNavButtonForcedVisible) {
inOutFrame.inset(windowState.getLayoutingAttrs(
displayFrames.mRotation).providedInternalInsets);
inOutFrame.inset(win.mGivenContentInsets);
}
},
@@ -1190,9 +1191,12 @@ public class DisplayPolicy {
break;
}
mDisplayContent.setInsetProvider(insetsType, win, (displayFrames,
windowState, inOutFrame) -> inOutFrame.inset(
windowState.getLayoutingAttrs(displayFrames.mRotation)
.providedInternalInsets), imeFrameProvider);
windowState, inOutFrame) -> {
inOutFrame.inset(
windowState.getLayoutingAttrs(displayFrames.mRotation)
.providedInternalInsets);
inOutFrame.inset(win.mGivenContentInsets);
}, imeFrameProvider);
mInsetsSourceWindowsExceptIme.add(win);
}
}

View File

@@ -322,4 +322,26 @@ public class DisplayPolicyTests extends WindowTestsBase {
assertFalse(navBarSource.getFrame().isEmpty());
assertTrue(imeSource.getFrame().contains(navBarSource.getFrame()));
}
@UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
@Test
public void testInsetsGivenContentFrame() {
final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
final DisplayInfo displayInfo = new DisplayInfo();
displayInfo.logicalWidth = 1000;
displayInfo.logicalHeight = 2000;
displayInfo.rotation = ROTATION_0;
WindowManager.LayoutParams attrs = mNavBarWindow.mAttrs;
displayPolicy.addWindowLw(mNavBarWindow, attrs);
mNavBarWindow.setRequestedSize(attrs.width, attrs.height);
mNavBarWindow.getControllableInsetProvider().setServerVisible(true);
mNavBarWindow.mGivenContentInsets.set(0, 10, 0, 0);
displayPolicy.layoutWindowLw(mNavBarWindow, null, mDisplayContent.mDisplayFrames);
final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState();
final InsetsSource navBarSource = state.peekSource(ITYPE_NAVIGATION_BAR);
assertEquals(attrs.height - 10, navBarSource.getFrame().height());
}
}