diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-09 13:06:52 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-09 13:06:52 +0000 |
commit | 5c8d1d9774e465bb40d45096b2bc5eba77b261d6 (patch) | |
tree | 9fb86852b4f25ccdfa914f00dc3f49f9a98b08ef | |
parent | 7c8d5d55b2bc14c7f8d36fddf32b118a29b215d6 (diff) | |
parent | 15b49fb590904181a72163ee6686f2b858e9f7b7 (diff) | |
download | base-android13-qpr3-s14-release.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/22381002', 'googleplex-android-review.googlesource.com/23661867', 'googleplex-android-review.googlesource.com/24219663', 'googleplex-android-review.googlesource.com/24296993', 'googleplex-android-review.googlesource.com/24211905', 'googleplex-android-review.googlesource.com/23590276'] into sparse-10316531-L04200000962983271.android-13.0.0_r83android13-qpr3-s14-release
SPARSE_CHANGE: I7b3dcd06e7483fde745a1d56dfee7c4efc262ed7
SPARSE_CHANGE: Ifcdac241bfe33f44f5f03f1a6db682c57f0cd388
SPARSE_CHANGE: Idaa7280ed23076b3282c987a249259e0c38b6630
SPARSE_CHANGE: Ie914f97925d8defb8c57818e5e7ffe958936336c
SPARSE_CHANGE: Ic3d97e05d99148e71b9dd64f8f56c20fc68193c9
SPARSE_CHANGE: Iee55ce04e15eb86a12f6d80bb277e20e708876b7
Change-Id: I5fd9857bf65e10183449a2d406405610fb610114
13 files changed, 207 insertions, 44 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index b4a30583f492..2cd822ab8fb3 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -104,7 +104,7 @@ object Flags { // TODO(b/260335638): Tracking Bug @JvmField val NOTIFICATION_INLINE_REPLY_ANIMATION = - releasedFlag(174148361, "notification_inline_reply_animation") + unreleasedFlag(174148361, "notification_inline_reply_animation") val FILTER_UNSEEN_NOTIFS_ON_KEYGUARD = releasedFlag(254647461, "filter_unseen_notifs_on_keyguard", teamfood = true) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 4d40db0a0cfd..f1a8c95469f6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -260,22 +260,20 @@ public class KeyguardService extends Service { ); } - public void mergeAnimation(IBinder transition, TransitionInfo info, - SurfaceControl.Transaction t, IBinder mergeTarget, - IRemoteTransitionFinishedCallback finishCallback) { + public void mergeAnimation(IBinder candidateTransition, TransitionInfo candidateInfo, + SurfaceControl.Transaction candidateT, IBinder currentTransition, + IRemoteTransitionFinishedCallback candidateFinishCallback) { try { - final IRemoteTransitionFinishedCallback origFinishCB; + final IRemoteTransitionFinishedCallback currentFinishCB; synchronized (mFinishCallbacks) { - origFinishCB = mFinishCallbacks.remove(transition); + currentFinishCB = mFinishCallbacks.remove(currentTransition); } - info.releaseAllSurfaces(); - t.close(); - if (origFinishCB == null) { - // already finished (or not started yet), so do nothing. + if (currentFinishCB == null) { + Slog.e(TAG, "Called mergeAnimation, but finish callback is missing"); return; } runner.onAnimationCancelled(false /* isKeyguardOccluded */); - origFinishCB.onTransitionFinished(null /* wct */, null /* t */); + currentFinishCB.onTransitionFinished(null /* wct */, null /* t */); } catch (RemoteException e) { // nothing, we'll just let it finish on its own I guess. } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 82189763def6..58ed3aae233e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -958,14 +958,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void onAnimationCancelled(boolean isKeyguardOccluded) { - if (mOccludeByDreamAnimator != null) { - mOccludeByDreamAnimator.cancel(); - } - setOccluded(isKeyguardOccluded /* isOccluded */, false /* animate */); - if (DEBUG) { - Log.d(TAG, "Occlude by Dream animation cancelled. Occluded state is now: " - + mOccluded); - } + mContext.getMainExecutor().execute(() -> { + if (mOccludeByDreamAnimator != null) { + mOccludeByDreamAnimator.cancel(); + } + }); + Log.d(TAG, "Occlude by Dream animation cancelled."); } @Override @@ -1071,10 +1069,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } }); - setOccluded(isKeyguardOccluded /* isOccluded */, false /* animate */); - Log.d(TAG, "Unocclude animation cancelled. Occluded state is now: " - + mOccluded); - + Log.d(TAG, "Unocclude animation cancelled."); mInteractionJankMonitor.cancel(CUJ_LOCKSCREEN_OCCLUSION); } @@ -3441,10 +3436,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, public void onAnimationCancelled(boolean isKeyguardOccluded) throws RemoteException { super.onAnimationCancelled(isKeyguardOccluded); - Log.d(TAG, "Occlude animation cancelled by WM. " - + "Setting occluded state to: " + isKeyguardOccluded); - setOccluded(isKeyguardOccluded /* occluded */, false /* animate */); - + Log.d(TAG, "Occlude animation cancelled by WM."); mInteractionJankMonitor.cancel(CUJ_LOCKSCREEN_OCCLUSION); } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQuickSettingsContainer.java index f73dde632051..f6d98977744f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQuickSettingsContainer.java @@ -54,6 +54,7 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout private Consumer<QS> mQSFragmentAttachedListener = qs -> {}; private QS mQs; private View mQSContainer; + private int mLastQSPaddingBottom; @Nullable private Consumer<Configuration> mConfigurationChangedListener; @@ -75,6 +76,10 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout mQs = (QS) fragment; mQSFragmentAttachedListener.accept(mQs); mQSContainer = mQs.getView().findViewById(R.id.quick_settings_container); + // We need to restore the bottom padding as the fragment may have been recreated due to + // some special Configuration change, so we apply the last known padding (this will be + // correct even if it has changed while the fragment was destroyed and re-created). + setQSContainerPaddingBottom(mLastQSPaddingBottom); } @Override @@ -101,6 +106,7 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout } public void setQSContainerPaddingBottom(int paddingBottom) { + mLastQSPaddingBottom = paddingBottom; if (mQSContainer != null) { mQSContainer.setPadding( mQSContainer.getPaddingLeft(), diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 1cfcf8cbbdcb..7f1deb5e3009 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -414,6 +414,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, @Override public void destroy() { + Log.d(TAG, "destroy() called"); mController.removeCallback(mControllerCallbackH); mHandler.removeCallbacksAndMessages(null); mConfigurationController.removeCallback(this); @@ -488,6 +489,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, } private void initDialog(int lockTaskModeState) { + Log.d(TAG, "initDialog: called!"); mDialog = new CustomDialog(mContext); initDimens(); @@ -1281,7 +1283,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, } protected void tryToRemoveCaptionsTooltip() { - if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) { + if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null && mDialog != null) { ViewGroup container = mDialog.findViewById(R.id.volume_dialog_container); container.removeView(mODICaptionsTooltipView); mODICaptionsTooltipView = null; @@ -1471,8 +1473,16 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, mHandler.removeMessages(H.DISMISS); mHandler.removeMessages(H.SHOW); - if (mIsAnimatingDismiss) { - Log.d(TAG, "dismissH: isAnimatingDismiss"); + + boolean showingStateInconsistent = !mShowing && mDialog != null && mDialog.isShowing(); + // If incorrectly assuming dialog is not showing, continue and make the state consistent. + if (showingStateInconsistent) { + Log.d(TAG, "dismissH: volume dialog possible in inconsistent state:" + + "mShowing=" + mShowing + ", mDialog==null?" + (mDialog == null)); + } + if (mIsAnimatingDismiss && !showingStateInconsistent) { + Log.d(TAG, "dismissH: skipping dismiss because isAnimatingDismiss is true" + + " and showingStateInconsistent is false"); Trace.endSection(); return; } @@ -1490,8 +1500,12 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, .setDuration(mDialogHideAnimationDurationMs) .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator()) .withEndAction(() -> mHandler.postDelayed(() -> { - mController.notifyVisible(false); - mDialog.dismiss(); + if (mController != null) { + mController.notifyVisible(false); + } + if (mDialog != null) { + mDialog.dismiss(); + } tryToRemoveCaptionsTooltip(); mIsAnimatingDismiss = false; diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQuickSettingsContainerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQuickSettingsContainerTest.kt new file mode 100644 index 000000000000..8bb8f6247e25 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQuickSettingsContainerTest.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shade + +import android.testing.AndroidTestingRunner +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.qs.QSFragment +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class NotificationsQuickSettingsContainerTest : SysuiTestCase() { + + @Mock private lateinit var qsFrame: View + @Mock private lateinit var stackScroller: View + @Mock private lateinit var keyguardStatusBar: View + @Mock private lateinit var qsFragment: QSFragment + + private lateinit var qsView: ViewGroup + private lateinit var qsContainer: View + + private lateinit var underTest: NotificationsQuickSettingsContainer + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + underTest = NotificationsQuickSettingsContainer(context, null) + + setUpViews() + underTest.onFinishInflate() + underTest.onFragmentViewCreated("QS", qsFragment) + } + + @Test + fun qsContainerPaddingSetAgainAfterQsRecreated() { + val padding = 100 + underTest.setQSContainerPaddingBottom(padding) + + assertThat(qsContainer.paddingBottom).isEqualTo(padding) + + // We reset the padding before "creating" a new QSFragment + qsContainer.setPadding(0, 0, 0, 0) + underTest.onFragmentViewCreated("QS", qsFragment) + + assertThat(qsContainer.paddingBottom).isEqualTo(padding) + } + + private fun setUpViews() { + qsView = FrameLayout(context) + qsContainer = View(context) + qsContainer.id = R.id.quick_settings_container + qsView.addView(qsContainer) + + whenever(qsFrame.findViewById<View>(R.id.qs_frame)).thenReturn(qsFrame) + whenever(stackScroller.findViewById<View>(R.id.notification_stack_scroller)) + .thenReturn(stackScroller) + whenever(keyguardStatusBar.findViewById<View>(R.id.keyguard_header)) + .thenReturn(keyguardStatusBar) + whenever(qsFragment.view).thenReturn(qsView) + + val layoutParams = ConstraintLayout.LayoutParams(0, 0) + whenever(qsFrame.layoutParams).thenReturn(layoutParams) + whenever(stackScroller.layoutParams).thenReturn(layoutParams) + whenever(keyguardStatusBar.layoutParams).thenReturn(layoutParams) + + underTest.addView(qsFrame) + underTest.addView(stackScroller) + underTest.addView(keyguardStatusBar) + } +} diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f064f83393c0..6e5421782261 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2134,10 +2134,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mWindowManagerInternal.registerAppTransitionListener(new AppTransitionListener() { + private boolean mOccludeChangingInTransition = false; + @Override public int onAppTransitionStartingLocked(boolean keyguardGoingAway, boolean keyguardOccluding, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { + mOccludeChangingInTransition = keyguardGoingAway || keyguardOccluding; + // When remote animation is enabled for KEYGUARD_GOING_AWAY transition, SysUI // receives IRemoteAnimationRunner#onAnimationStart to start animation, so we don't // need to call IKeyguardService#keyguardGoingAway here. @@ -2153,6 +2157,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { 0 /* duration */); synchronized (mLock) { + if (mOccludeChangingInTransition) { + mKeyguardOccludedChanged = true; + mOccludeChangingInTransition = false; + } + applyKeyguardOcclusionChange(false); mLockAfterAppTransitionFinished = false; } } @@ -2160,12 +2169,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void onAppTransitionFinishedLocked(IBinder token) { synchronized (mLock) { + if (mOccludeChangingInTransition) { + mKeyguardOccludedChanged = true; + mOccludeChangingInTransition = false; + } + applyKeyguardOcclusionChange(false /* transitionStarted */); if (!mLockAfterAppTransitionFinished) { return; } mLockAfterAppTransitionFinished = false; } - lockNow(null); } }); @@ -3355,7 +3368,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mKeyguardOccludedChanged) { if (DEBUG_KEYGUARD) Slog.d(TAG, "transition/occluded changed occluded=" + mPendingKeyguardOccluded); - if (setKeyguardOccludedLw(mPendingKeyguardOccluded, false /* force */, + if (setKeyguardOccludedLw(mPendingKeyguardOccluded, true /* force */, transitionStarted)) { return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_WALLPAPER; } @@ -3616,6 +3629,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean setKeyguardOccludedLw(boolean isOccluded, boolean force, boolean transitionStarted) { if (DEBUG_KEYGUARD) Slog.d(TAG, "setKeyguardOccluded occluded=" + isOccluded); + mPendingKeyguardOccluded = isOccluded; mKeyguardOccludedChanged = false; if (isKeyguardOccluded() == isOccluded && !force) { return false; diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 988e98f28d10..4113ffb97626 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2005,6 +2005,9 @@ public class DisplayPolicy { */ final Rect mConfigFrame = new Rect(); + /** The count of insets sources when calculating this info. */ + int mLastInsetsSourceCount; + private boolean mNeedUpdate = true; void update(DisplayContent dc, int rotation, int w, int h) { @@ -2026,6 +2029,7 @@ public class DisplayPolicy { mNonDecorFrame.inset(mNonDecorInsets); mConfigFrame.set(displayFrame); mConfigFrame.inset(mConfigInsets); + mLastInsetsSourceCount = dc.getDisplayPolicy().mInsetsSourceWindowsExceptIme.size(); mNeedUpdate = false; } @@ -2034,6 +2038,7 @@ public class DisplayPolicy { mConfigInsets.set(other.mConfigInsets); mNonDecorFrame.set(other.mNonDecorFrame); mConfigFrame.set(other.mConfigFrame); + mLastInsetsSourceCount = other.mLastInsetsSourceCount; mNeedUpdate = false; } @@ -2049,6 +2054,12 @@ public class DisplayPolicy { static final int DECOR_TYPES = Type.displayCutout() | Type.navigationBars(); + /** + * The types that may affect display configuration. This excludes cutout because it is + * known from display info. + */ + static final int CONFIG_TYPES = Type.statusBars() | Type.navigationBars(); + private final DisplayContent mDisplayContent; private final Info[] mInfoForRotation = new Info[4]; final Info mTmpInfo = new Info(); @@ -2088,7 +2099,20 @@ public class DisplayPolicy { final DecorInsets.Info newInfo = mDecorInsets.mTmpInfo; newInfo.update(mDisplayContent, rotation, dw, dh); final DecorInsets.Info currentInfo = getDecorInsetsInfo(rotation, dw, dh); - if (newInfo.mNonDecorFrame.equals(currentInfo.mNonDecorFrame)) { + if (newInfo.mConfigFrame.equals(currentInfo.mConfigFrame)) { + // Even if the config frame is not changed in current rotation, it may change the + // insets in other rotations if the source count is changed. + if (newInfo.mLastInsetsSourceCount != currentInfo.mLastInsetsSourceCount) { + for (int i = mDecorInsets.mInfoForRotation.length - 1; i >= 0; i--) { + if (i != rotation) { + final boolean flipSize = (i + rotation) % 2 == 1; + final int w = flipSize ? dh : dw; + final int h = flipSize ? dw : dh; + mDecorInsets.mInfoForRotation[i].update(mDisplayContent, i, w, h); + } + } + mDecorInsets.mInfoForRotation[rotation].set(newInfo); + } return false; } mDecorInsets.invalidate(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 78ed43658dd5..706989069e4b 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1885,7 +1885,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean needToSendNewConfiguration = win.isVisibleRequestedOrAdding() && displayContent.updateOrientation(); - if (win.providesNonDecorInsets()) { + if (win.providesDisplayDecorInsets()) { needToSendNewConfiguration |= displayPolicy.updateDecorInsetsInfo(); } if (needToSendNewConfiguration) { @@ -2358,7 +2358,7 @@ public class WindowManagerService extends IWindowManager.Stub & WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED) != 0) { win.mLayoutNeeded = true; } - if (layoutChanged && win.providesNonDecorInsets()) { + if (layoutChanged && win.providesDisplayDecorInsets()) { configChanged = displayPolicy.updateDecorInsetsInfo(); } if (win.mActivityRecord != null && ((flagChanges & FLAG_SHOW_WHEN_LOCKED) != 0 diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 95fea0ee22f5..24619ca6a874 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1897,13 +1897,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return (mPolicyVisibility & POLICY_VISIBILITY_ALL) == POLICY_VISIBILITY_ALL; } - boolean providesNonDecorInsets() { + boolean providesDisplayDecorInsets() { if (mProvidedInsetsSources == null) { return false; } for (int i = mProvidedInsetsSources.size() - 1; i >= 0; i--) { final int type = mProvidedInsetsSources.keyAt(i); - if ((InsetsState.toPublicType(type) & WindowInsets.Type.navigationBars()) != 0) { + if ((InsetsState.toPublicType(type) & DisplayPolicy.DecorInsets.CONFIG_TYPES) != 0) { return true; } } @@ -2631,13 +2631,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } // Check if window provides non decor insets before clearing its provided insets. - final boolean windowProvidesNonDecorInsets = providesNonDecorInsets(); + final boolean windowProvidesDisplayDecorInsets = providesDisplayDecorInsets(); removeImmediately(); // Removing a visible window may affect the display orientation so just update it if // needed. Also recompute configuration if it provides screen decor insets. boolean needToSendNewConfiguration = wasVisible && displayContent.updateOrientation(); - if (windowProvidesNonDecorInsets) { + if (windowProvidesDisplayDecorInsets) { needToSendNewConfiguration |= displayContent.getDisplayPolicy().updateDecorInsetsInfo(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index c91822279e7c..04c020285832 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -3117,7 +3117,7 @@ public class ActivityRecordTests extends WindowTestsBase { .setSystemDecorations(true).build(); // Add a decor insets provider window. final WindowState navbar = createNavBarWithProvidedInsets(squareDisplay); - assertTrue(navbar.providesNonDecorInsets() + assertTrue(navbar.providesDisplayDecorInsets() && squareDisplay.getDisplayPolicy().updateDecorInsetsInfo()); squareDisplay.sendNewConfiguration(); final Task task = new TaskBuilder(mSupervisor).setDisplay(squareDisplay).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index ac8dd465adbe..5da3c36fbef8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -48,6 +48,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -301,20 +302,27 @@ public class DisplayPolicyTests extends WindowTestsBase { @Test public void testUpdateDisplayConfigurationByDecor() { + doReturn(NO_CUTOUT).when(mDisplayContent).calculateDisplayCutoutForRotation(anyInt()); final WindowState navbar = createNavBarWithProvidedInsets(mDisplayContent); final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); final DisplayInfo di = mDisplayContent.getDisplayInfo(); final int prevScreenHeightDp = mDisplayContent.getConfiguration().screenHeightDp; - assertTrue(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); + assertTrue(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertEquals(NAV_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mConfigInsets.bottom); mDisplayContent.sendNewConfiguration(); assertNotEquals(prevScreenHeightDp, mDisplayContent.getConfiguration().screenHeightDp); - assertFalse(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); + assertFalse(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); navbar.removeIfPossible(); assertEquals(0, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mNonDecorInsets.bottom); + + final WindowState statusBar = createStatusBarWithProvidedInsets(mDisplayContent); + assertTrue(statusBar.providesDisplayDecorInsets() + && displayPolicy.updateDecorInsetsInfo()); + assertEquals(STATUS_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, + di.logicalWidth, di.logicalHeight).mConfigInsets.top); } @UseTestDisplay(addWindows = { W_NAVIGATION_BAR, W_INPUT_METHOD }) diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 57e7afd9f85a..d762651f511e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -438,6 +438,16 @@ class WindowTestsBase extends SystemServiceTestsBase { return navbar; } + WindowState createStatusBarWithProvidedInsets(DisplayContent dc) { + final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, dc, "statusBar"); + statusBar.mAttrs.width = WindowManager.LayoutParams.MATCH_PARENT; + statusBar.mAttrs.height = STATUS_BAR_HEIGHT; + statusBar.mAttrs.gravity = Gravity.TOP; + statusBar.mAttrs.setFitInsetsTypes(0); + dc.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs); + return statusBar; + } + WindowState createAppWindow(Task task, int type, String name) { final ActivityRecord activity = createNonAttachedActivityRecord(task.getDisplayContent()); task.addChild(activity, 0); |