InsetsSourceProvider: Fix serverVisible update order in onPostLayout

Fixes an issue where serverVisible was only updated after updateFrames, but
updating the frames depends on the server visibility being correct since [1].

Also addresses an issue in the test fixture which prevented this regression
from being caught: the server visibility is now set by onPostLayout, instead
of onSetup, to mirror how the server visibility would be set at runtime.

[1]: Id2c482e112c1d73cf7d5b3ba5e1a2d5775f47298

Fixes: 156226586
Test: atest ScreenDecorWindowTests InsetsSourceProviderTest
Change-Id: Id90e6315e9fe230307929a8d992a76a5dae1107c
This commit is contained in:
Adrian Roos
2020-05-11 17:10:49 +02:00
parent 8fdb8d4f34
commit e05d29e383
2 changed files with 3 additions and 3 deletions

View File

@@ -219,6 +219,8 @@ class InsetsSourceProvider {
return;
}
setServerVisible(mWin.wouldBeVisibleIfPolicyIgnored() && mWin.isVisibleByPolicy()
&& !mWin.mGivenInsetsPending);
updateSourceFrame();
if (mControl != null) {
final Rect frame = mWin.getWindowFrames().mFrame;
@@ -228,8 +230,6 @@ class InsetsSourceProvider {
mStateController.notifyControlChanged(mControlTarget);
}
}
setServerVisible(mWin.wouldBeVisibleIfPolicyIgnored() && mWin.isVisibleByPolicy()
&& !mWin.mGivenInsetsPending);
}
/**

View File

@@ -54,7 +54,6 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
mSource.setVisible(true);
mProvider = new InsetsSourceProvider(mSource,
mDisplayContent.getInsetsStateController(), mDisplayContent);
mProvider.setServerVisible(true);
mImeProvider = new InsetsSourceProvider(mImeSource,
mDisplayContent.getInsetsStateController(), mDisplayContent);
}
@@ -106,6 +105,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase {
public void testPostLayout_frameProvider() {
final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
statusBar.getFrameLw().set(0, 0, 500, 100);
statusBar.mHasSurface = true;
mProvider.setWindow(statusBar,
(displayFrames, windowState, rect) -> {
rect.set(10, 10, 20, 20);