diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index c67e0366d251c..48f0f9e3b924a 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -18724,6 +18724,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final ViewTreeObserver.InternalInsetsInfo mGivenInternalInsets = new ViewTreeObserver.InternalInsetsInfo(); + /** + * Set to true when mGivenInternalInsets is non-empty. + */ + boolean mHasNonEmptyGivenInternalInsets; + /** * All views in the window's hierarchy that serve as scroll containers, * used to determine if the window can be resized or must be panned diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 28f7480300cae..76ebb6fe2ea40 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1348,8 +1348,12 @@ public final class ViewRootImpl implements ViewParent, || (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT && frame.height() < desiredWindowHeight && frame.height() != mHeight)); + // Determine whether to compute insets. + // If there are no inset listeners remaining then we may still need to compute + // insets in case the old insets were non-empty and must be reset. final boolean computesInternalInsets = - attachInfo.mTreeObserver.hasComputeInternalInsetsListeners(); + attachInfo.mTreeObserver.hasComputeInternalInsetsListeners() + || attachInfo.mHasNonEmptyGivenInternalInsets; boolean insetsPending = false; int relayoutResult = 0; @@ -1764,6 +1768,7 @@ public final class ViewRootImpl implements ViewParent, // Compute new insets in place. attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets); + attachInfo.mHasNonEmptyGivenInternalInsets = !insets.isEmpty(); // Tell the window manager. if (insetsPending || !mLastGivenInsets.equals(insets)) { diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index f9298ea1ed234..a9444b44760ad 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -241,6 +241,13 @@ public final class ViewTreeObserver { mTouchableInsets = TOUCHABLE_INSETS_FRAME; } + boolean isEmpty() { + return contentInsets.isEmpty() + && visibleInsets.isEmpty() + && touchableRegion.isEmpty() + && mTouchableInsets == TOUCHABLE_INSETS_FRAME; + } + @Override public int hashCode() { int result = contentInsets.hashCode();