Merge "Notify fixed rotation transformed insets state" into rvc-dev am: 6a9cd11871 am: be8815d519 am: 21197c1dc4

Change-Id: I30570dbe2efe9f21a0674642d6c3d6f84aac5d3a
This commit is contained in:
Automerger Merge Worker
2020-03-02 05:09:21 +00:00
6 changed files with 76 additions and 73 deletions

View File

@@ -1032,7 +1032,9 @@ public class DisplayPolicy {
// In Gesture Nav, navigation bar frame is larger than frame to
// calculate inset.
if (mNavigationBarPosition == NAV_BAR_BOTTOM) {
if (navigationBarPosition(displayFrames.mDisplayWidth,
displayFrames.mDisplayHeight,
displayFrames.mRotation) == NAV_BAR_BOTTOM) {
sTmpRect.set(displayFrames.mUnrestricted);
sTmpRect.intersectUnchecked(displayFrames.mDisplayCutoutSafe);
inOutFrame.top = sTmpRect.bottom
@@ -1234,10 +1236,7 @@ public class DisplayPolicy {
* most recent layout, so they are not guaranteed to be correct.
*
* @param attrs The LayoutParams of the window.
* @param taskBounds The bounds of the task this window is on or {@code null} if no task is
* associated with the window.
* @param displayFrames display frames.
* @param floatingStack Whether the window's stack is floating.
* @param windowToken The token of the window.
* @param outFrame The frame of the window.
* @param outContentInsets The areas covered by system windows, expressed as positive insets.
* @param outStableInsets The areas covered by stable system windows irrespective of their
@@ -1246,8 +1245,7 @@ public class DisplayPolicy {
* @return Whether to always consume the system bars.
* See {@link #areSystemBarsForcedShownLw(WindowState)}.
*/
public boolean getLayoutHintLw(LayoutParams attrs, Rect taskBounds,
DisplayFrames displayFrames, boolean floatingStack, Rect outFrame,
boolean getLayoutHint(LayoutParams attrs, WindowToken windowToken, Rect outFrame,
Rect outContentInsets, Rect outStableInsets,
DisplayCutout.ParcelableWrapper outDisplayCutout) {
final int fl = PolicyControl.getWindowFlags(null, attrs);
@@ -1260,6 +1258,18 @@ public class DisplayPolicy {
&& (fl & FLAG_LAYOUT_INSET_DECOR) != 0;
final boolean screenDecor = (pfl & PRIVATE_FLAG_IS_SCREEN_DECOR) != 0;
final boolean isFixedRotationTransforming =
windowToken != null && windowToken.isFixedRotationTransforming();
final ActivityRecord activity = windowToken != null ? windowToken.asActivityRecord() : null;
final Task task = activity != null ? activity.getTask() : null;
final Rect taskBounds = isFixedRotationTransforming
// Use token (activity) bounds if it is rotated because its task is not rotated.
? windowToken.getBounds()
: (task != null ? task.getBounds() : null);
final DisplayFrames displayFrames = isFixedRotationTransforming
? windowToken.getFixedRotationTransformDisplayFrames()
: mDisplayContent.mDisplayFrames;
if (layoutInScreenAndInsetDecor && !screenDecor) {
if ((sysUiVis & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0
|| (attrs.getFitInsetsTypes() & Type.navigationBars()) == 0) {
@@ -1268,15 +1278,10 @@ public class DisplayPolicy {
outFrame.set(displayFrames.mRestricted);
}
final Rect sf;
if (floatingStack) {
sf = null;
} else {
sf = displayFrames.mStable;
}
final boolean isFloatingTask = task != null && task.isFloating();
final Rect sf = isFloatingTask ? null : displayFrames.mStable;
final Rect cf;
if (floatingStack) {
if (isFloatingTask) {
cf = null;
} else if ((sysUiVis & View.SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) {
if ((fl & FLAG_FULLSCREEN) != 0) {
@@ -1425,6 +1430,7 @@ public class DisplayPolicy {
*/
void simulateLayoutDisplay(DisplayFrames displayFrames, InsetsState insetsState, int uiMode) {
displayFrames.onBeginLayout();
insetsState.setDisplayFrame(displayFrames.mUnrestricted);
final WindowFrames simulatedWindowFrames = new WindowFrames();
if (mNavigationBar != null) {
simulateLayoutDecorWindow(

View File

@@ -190,7 +190,10 @@ class InsetsSourceProvider {
/** @return A new source computed by the specified window frame in the given display frames. */
InsetsSource createSimulatedSource(DisplayFrames displayFrames, WindowFrames windowFrames) {
final InsetsSource source = new InsetsSource(mSource);
// Don't copy visible frame because it might not be calculated in the provided display
// frames and it is not significant for this usage.
final InsetsSource source = new InsetsSource(mSource.getType());
source.setVisible(mSource.isVisible());
mTmpRect.set(windowFrames.mFrame);
if (mFrameProvider != null) {
mFrameProvider.accept(displayFrames, mWin, mTmpRect);

View File

@@ -1645,23 +1645,8 @@ public class WindowManagerService extends IWindowManager.Stub
prepareNoneTransitionForRelaunching(activity);
}
final DisplayFrames displayFrames = displayContent.mDisplayFrames;
// TODO: Not sure if onDisplayInfoUpdated() call is needed.
final DisplayInfo displayInfo = displayContent.getDisplayInfo();
displayFrames.onDisplayInfoUpdated(displayInfo,
displayContent.calculateDisplayCutoutForRotation(displayInfo.rotation));
final Rect taskBounds;
final boolean floatingStack;
if (activity != null && activity.getTask() != null) {
taskBounds = mTmpRect;
tokenActivity.getTask().getBounds(mTmpRect);
floatingStack = activity.getTask().isFloating();
} else {
taskBounds = null;
floatingStack = false;
}
if (displayPolicy.getLayoutHintLw(win.mAttrs, taskBounds, displayFrames, floatingStack,
outFrame, outContentInsets, outStableInsets, outDisplayCutout)) {
if (displayPolicy.getLayoutHint(win.mAttrs, token, outFrame, outContentInsets,
outStableInsets, outDisplayCutout)) {
res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_SYSTEM_BARS;
}
outInsetsState.set(win.getInsetsState(),
@@ -8036,27 +8021,8 @@ public class WindowManagerService extends IWindowManager.Stub
+ "could not be found!");
}
final WindowToken windowToken = dc.getWindowToken(attrs.token);
final ActivityRecord activity;
if (windowToken != null && windowToken.asActivityRecord() != null) {
activity = windowToken.asActivityRecord();
} else {
activity = null;
}
final Rect taskBounds;
final boolean floatingStack;
if (activity != null && activity.getTask() != null) {
final Task task = activity.getTask();
taskBounds = new Rect();
task.getBounds(taskBounds);
floatingStack = task.isFloating();
} else {
taskBounds = null;
floatingStack = false;
}
final DisplayFrames displayFrames = dc.mDisplayFrames;
final DisplayPolicy policy = dc.getDisplayPolicy();
policy.getLayoutHintLw(attrs, taskBounds, displayFrames, floatingStack,
new Rect(), outContentInsets, outStableInsets, displayCutout);
dc.getDisplayPolicy().getLayoutHint(attrs, windowToken, mTmpRect /* outFrame */,
outContentInsets, outStableInsets, displayCutout);
}
} finally {
Binder.restoreCallingIdentity(origId);

View File

@@ -1448,6 +1448,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
/** @return The display frames in use by this window. */
DisplayFrames getDisplayFrames(DisplayFrames originalFrames) {
final DisplayFrames diplayFrames = mToken.getFixedRotationTransformDisplayFrames();
if (diplayFrames != null) {
@@ -3495,8 +3496,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
void notifyInsetsChanged() {
try {
mClient.insetsChanged(
getDisplayContent().getInsetsPolicy().getInsetsForDispatch(this));
mClient.insetsChanged(getInsetsState());
} catch (RemoteException e) {
Slog.w(TAG, "Failed to deliver inset state change w=" + this, e);
}
@@ -3506,9 +3506,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
public void notifyInsetsControlChanged() {
final InsetsStateController stateController =
getDisplayContent().getInsetsStateController();
final InsetsPolicy policy = getDisplayContent().getInsetsPolicy();
try {
mClient.insetsControlChanged(policy.getInsetsForDispatch(this),
mClient.insetsControlChanged(getInsetsState(),
stateController.getControlsForDispatch(this));
} catch (RemoteException e) {
Slog.w(TAG, "Failed to deliver inset state change", e);

View File

@@ -50,6 +50,7 @@ import static org.junit.Assume.assumeTrue;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import android.app.WindowConfiguration;
import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -855,9 +856,8 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
final DisplayCutout.ParcelableWrapper outDisplayCutout =
new DisplayCutout.ParcelableWrapper();
mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, null, mFrames,
false /* floatingStack */, outFrame, outContentInsets, outStableInsets,
outDisplayCutout);
mDisplayPolicy.getLayoutHint(mWindow.mAttrs, null /* windowToken */, outFrame,
outContentInsets, outStableInsets, outDisplayCutout);
assertThat(outFrame, is(mFrames.mUnrestricted));
assertThat(outContentInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT)));
@@ -874,6 +874,9 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */);
final Rect taskBounds = new Rect(100, 100, 200, 200);
final Task task = mWindow.getTask();
// Force the bounds because the task may resolve different bounds from Task#setBounds.
task.getWindowConfiguration().setBounds(taskBounds);
final Rect outFrame = new Rect();
final Rect outContentInsets = new Rect();
@@ -881,9 +884,8 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
final DisplayCutout.ParcelableWrapper outDisplayCutout =
new DisplayCutout.ParcelableWrapper();
mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames,
false /* floatingStack */, outFrame, outContentInsets, outStableInsets,
outDisplayCutout);
mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame,
outContentInsets, outStableInsets, outDisplayCutout);
assertThat(outFrame, is(taskBounds));
assertThat(outContentInsets, is(new Rect()));
@@ -904,15 +906,20 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
final Rect taskBounds = new Rect(100, mFrames.mContent.bottom + 1,
200, mFrames.mContent.bottom + 10);
final Task task = mWindow.getTask();
// Make the task floating.
task.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
// Force the bounds because the task may resolve different bounds from Task#setBounds.
task.getWindowConfiguration().setBounds(taskBounds);
final Rect outFrame = new Rect();
final Rect outContentInsets = new Rect();
final Rect outStableInsets = new Rect();
final DisplayCutout.ParcelableWrapper outDisplayCutout =
new DisplayCutout.ParcelableWrapper();
mDisplayPolicy.getLayoutHintLw(mWindow.mAttrs, taskBounds, mFrames,
true /* floatingStack */, outFrame, outContentInsets, outStableInsets,
outDisplayCutout);
mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame, outContentInsets,
outStableInsets, outDisplayCutout);
assertThat(outFrame, is(taskBounds));
assertThat(outContentInsets, is(new Rect()));
@@ -939,6 +946,8 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
final InsetsState simulatedInsetsState = new InsetsState();
final DisplayFrames simulatedDisplayFrames = createDisplayFrames();
mDisplayPolicy.beginLayoutLw(mFrames, uiMode);
// Force the display bounds because it is not synced with display frames in policy test.
mDisplayContent.getWindowConfiguration().setBounds(mFrames.mUnrestricted);
mDisplayContent.getInsetsStateController().onPostLayout();
mDisplayPolicy.simulateLayoutDisplay(simulatedDisplayFrames, simulatedInsetsState, uiMode);
@@ -947,20 +956,18 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase {
final StringWriter simulatedFramesDump = new StringWriter();
simulatedDisplayFrames.dump(prefix, new PrintWriter(simulatedFramesDump));
assertEquals(realFramesDump.toString(), simulatedFramesDump.toString());
assertEquals(new ToStringComparatorWrapper<>(realFramesDump),
new ToStringComparatorWrapper<>(simulatedFramesDump));
final StringWriter realInsetsDump = new StringWriter();
final InsetsState realInsetsState = new InsetsState(
mDisplayContent.getInsetsStateController().getRawInsetsState());
// Exclude comparing IME insets because currently the simulated layout only focuses on the
// insets from status bar and navigation bar.
realInsetsState.removeSource(InsetsState.ITYPE_IME);
realInsetsState.removeSource(InsetsState.ITYPE_CAPTION_BAR);
realInsetsState.dump(prefix, new PrintWriter(realInsetsDump));
final StringWriter simulatedInsetsDump = new StringWriter();
simulatedInsetsState.dump(prefix, new PrintWriter(simulatedInsetsDump));
assertEquals(realInsetsDump.toString(), simulatedInsetsDump.toString());
assertEquals(new ToStringComparatorWrapper<>(realInsetsState),
new ToStringComparatorWrapper<>(simulatedInsetsState));
}
@Test

View File

@@ -60,4 +60,26 @@ class SystemServiceTestsBase {
<T> T awaitInWmLock(Callable<T> callable) {
return mLockRule.waitForLocked(callable);
}
/**
* Utility class to compare the output of T#toString. It is convenient to have readable output
* of assertion if the string content can represent the expected states.
*/
static class ToStringComparatorWrapper<T> {
final T mObject;
ToStringComparatorWrapper(T object) {
mObject = object;
}
@Override
public boolean equals(Object obj) {
return mObject.toString().equals(obj.toString());
}
@Override
public String toString() {
return mObject.toString();
}
}
}