diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 2d17b6d2ae229..7335bfcbe7da1 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -567,11 +567,15 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private void updateState(InsetsState newState) { mState.setDisplayFrame(newState.getDisplayFrame()); for (int i = newState.getSourcesCount() - 1; i >= 0; i--) { - InsetsSource source = newState.sourceAt(i); - getSourceConsumer(source.getType()).updateSource(source); + final InsetsSource source = newState.sourceAt(i); + final int type = source.getType(); + final InsetsSourceConsumer consumer = getSourceConsumer(type); + consumer.updateSource(source); + mHost.updateCompatSysUiVisibility(type, source.isVisible(), + consumer.getControl() != null); } for (int i = mState.getSourcesCount() - 1; i >= 0; i--) { - InsetsSource source = mState.sourceAt(i); + final InsetsSource source = mState.sourceAt(i); if (newState.peekSource(source.getType()) == null) { mState.removeSource(source.getType()); } @@ -1005,14 +1009,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation updateRequestedState(); } - /** - * @see ViewRootImpl#updateCompatSysUiVisibility(int, boolean, boolean) - */ - public void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible, - boolean hasControl) { - mHost.updateCompatSysUiVisibility(type, visible, hasControl); - } - /** * Called when current window gains focus. */ diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index 2dcfd899adf40..a0cdcfeefe3fc 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -200,20 +200,12 @@ public class InsetsSourceConsumer { } boolean applyLocalVisibilityOverride() { - InsetsSource source = mState.peekSource(mType); - final boolean isVisible = source != null && source.isVisible(); - final boolean hasControl = mSourceControl != null; - - // We still need to let the legacy app know the visibility change even if we don't have the - // control. - mController.updateCompatSysUiVisibility( - mType, hasControl ? mRequestedVisible : isVisible, hasControl); // If we don't have control, we are not able to change the visibility. - if (!hasControl) { + if (mSourceControl == null) { return false; } - if (isVisible == mRequestedVisible) { + if (mState.getSource(mType).isVisible() == mRequestedVisible) { return false; } mState.getSource(mType).setVisible(mRequestedVisible); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index d36a2381f159b..d928356d8600e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1976,6 +1976,10 @@ public final class ViewRootImpl implements ViewParent, mCompatibleVisibilityInfo.globalVisibility = (mCompatibleVisibilityInfo.globalVisibility & ~View.SYSTEM_UI_FLAG_LOW_PROFILE) | (mAttachInfo.mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE); + if (mDispatchedSystemUiVisibility != mCompatibleVisibilityInfo.globalVisibility) { + mHandler.sendMessage(mHandler.obtainMessage( + MSG_DISPATCH_SYSTEM_UI_VISIBILITY, mCompatibleVisibilityInfo)); + } if (mAttachInfo.mKeepScreenOn != oldScreenOn || mAttachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility || mAttachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) { @@ -2029,7 +2033,7 @@ public final class ViewRootImpl implements ViewParent, info.globalVisibility |= systemUiFlag; } if (mDispatchedSystemUiVisibility != info.globalVisibility) { - scheduleTraversals(); + mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, info)); } } @@ -2477,9 +2481,6 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mForceReportNewAttributes = false; params = lp; } - if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { - handleDispatchSystemUiVisibilityChanged(mCompatibleVisibilityInfo); - } if (mFirst || mAttachInfo.mViewVisibilityChanged) { mAttachInfo.mViewVisibilityChanged = false; diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index 5f12bf04d931b..8eca650398bf2 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -26,11 +26,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -98,8 +95,6 @@ public class InsetsAnimationControlImplTest { @Before public void setup() { MockitoAnnotations.initMocks(this); - doNothing().when(mMockController).updateCompatSysUiVisibility( - anyInt(), anyBoolean(), anyBoolean()); mTopLeash = new SurfaceControl.Builder(mSession) .setName("testSurface") .build(); diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 785ca908b7033..34998a0256639 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -50,7 +50,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.TypedValue; import android.view.Display; -import android.view.InsetsState; +import android.view.InsetsSource; import android.view.MagnificationSpec; import android.view.Surface; import android.view.Surface.OutOfResourcesException; @@ -80,6 +80,7 @@ final class AccessibilityController { private final WindowManagerService mService; + private static final Rect EMPTY_RECT = new Rect(); private static final float[] sTempFloats = new float[9]; public AccessibilityController(WindowManagerService service) { @@ -1166,9 +1167,9 @@ final class AccessibilityController { } static Rect getNavBarInsets(DisplayContent displayContent) { - final InsetsState insetsState = - displayContent.getInsetsStateController().getRawInsetsState(); - return insetsState.getSource(ITYPE_NAVIGATION_BAR).getFrame(); + final InsetsSource source = displayContent.getInsetsStateController().getRawInsetsState() + .peekSource(ITYPE_NAVIGATION_BAR); + return source != null ? source.getFrame() : EMPTY_RECT; } /** diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index a26d3fb90ade9..2e18fbf30d460 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2032,9 +2032,13 @@ public class DisplayPolicy { final Rect dfu = displayFrames.mUnrestricted; Insets insets = Insets.of(0, 0, 0, 0); for (int i = types.size() - 1; i >= 0; i--) { - insets = Insets.max(insets, mDisplayContent.getInsetsPolicy() - .getInsetsForDispatch(win).getSource(types.valueAt(i)) - .calculateInsets(dfu, attrs.isFitInsetsIgnoringVisibility())); + final InsetsSource source = mDisplayContent.getInsetsPolicy() + .getInsetsForDispatch(win).peekSource(types.valueAt(i)); + if (source == null) { + continue; + } + insets = Insets.max(insets, source.calculateInsets( + dfu, attrs.isFitInsetsIgnoringVisibility())); } final int left = (sidesToFit & Side.LEFT) != 0 ? insets.left : 0; final int top = (sidesToFit & Side.TOP) != 0 ? insets.top : 0;