Simulate extra navigation bar for fixed rotation

The change is to consider extra navigation bar and all other windows
providing insets when simulate display for fixed rotation.

This change introduced a potential behavior divergence between flexible
insets and the legacy one. For the legacy usage, the extra navigation
bar will be layout during the simulated layout process for the display
frame calculation, and all the insets without a window, insets of status
bar, navigation bar and extra navigation bar will be included in the
result. For the new flexible insets implementation, all the windows
providing insets will be simulated. Currently, there's no actual
difference, but the behavior will be different if there're more window
providing insets during fixed rotation.

Bug: 199472694
Test: Check fixed rotation behavior with taskbar.
Test: Check result of DisplayPolicy#simulateLayoutDisplay().
Change-Id: I5db1cb78dee50e593d229922d39c8898d5d4eef7
This commit is contained in:
Yunfan Chen
2021-09-15 18:38:03 +09:00
parent 2496d18f31
commit 2641933558

View File

@@ -1531,31 +1531,51 @@ public class DisplayPolicy {
* some temporal states, but doesn't change the window frames used to show on screen.
*/
void simulateLayoutDisplay(DisplayFrames displayFrames, SparseArray<Rect> barContentFrames) {
if (mNavigationBar != null) {
final WindowFrames simulatedWindowFrames = new WindowFrames();
if (INSETS_LAYOUT_GENERALIZATION) {
simulateLayoutDecorWindow(mNavigationBar, displayFrames, simulatedWindowFrames,
if (INSETS_LAYOUT_GENERALIZATION) {
final InsetsStateController insetsStateController =
mDisplayContent.getInsetsStateController();
for (int type = 0; type < InsetsState.SIZE; type++) {
final InsetsSourceProvider provider =
insetsStateController.peekSourceProvider(type);
if (provider == null || !provider.hasWindow()
|| provider.mWin.getControllableInsetProvider() != provider) {
continue;
}
final WindowFrames simulatedWindowFrames = new WindowFrames();
simulateLayoutDecorWindow(provider.mWin, displayFrames, simulatedWindowFrames,
barContentFrames,
contentFrame -> simulateLayoutForContentFrame(displayFrames,
mNavigationBar, contentFrame));
} else {
provider.mWin, contentFrame));
}
} else {
if (mNavigationBar != null) {
final WindowFrames simulatedWindowFrames = new WindowFrames();
simulateLayoutDecorWindow(mNavigationBar, displayFrames, simulatedWindowFrames,
barContentFrames, contentFrame -> layoutNavigationBar(displayFrames,
contentFrame));
}
}
if (mStatusBar != null) {
final WindowFrames simulatedWindowFrames = new WindowFrames();
if (INSETS_LAYOUT_GENERALIZATION) {
simulateLayoutDecorWindow(mStatusBar, displayFrames, simulatedWindowFrames,
barContentFrames,
contentFrame -> simulateLayoutForContentFrame(displayFrames,
mStatusBar, contentFrame));
} else {
if (mStatusBar != null) {
final WindowFrames simulatedWindowFrames = new WindowFrames();
simulateLayoutDecorWindow(mStatusBar, displayFrames, simulatedWindowFrames,
barContentFrames,
contentFrame -> layoutStatusBar(displayFrames, contentFrame));
}
if (mExtraNavBarAlt != null) {
// There's no pre-defined behavior for the extra navigation bar, we need to use the
// new flexible insets logic anyway.
final WindowFrames simulatedWindowFrames = new WindowFrames();
simulateLayoutDecorWindow(mExtraNavBarAlt, displayFrames, simulatedWindowFrames,
barContentFrames,
contentFrame -> simulateLayoutForContentFrame(displayFrames,
mExtraNavBarAlt, contentFrame));
}
if (mClimateBarAlt != null) {
final WindowFrames simulatedWindowFrames = new WindowFrames();
simulateLayoutDecorWindow(mClimateBarAlt, displayFrames, simulatedWindowFrames,
barContentFrames,
contentFrame -> simulateLayoutForContentFrame(displayFrames,
mClimateBarAlt, contentFrame));
}
}
}