From 2e05ec3235150a93a3459cd260be45f02dadbe84 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 30 Sep 2013 15:57:43 -0700 Subject: [PATCH] Reset insets when inset computer is removed. When an inset computer is registered with the view tree observer, we report content insets to the window manager. When an inset computer is subsequently unregistered, we must take care to clear these insets. This patch remembers whether the previously computed insets were non-empty so that it can force insets to be reset when needed. Bug: 10840662 Change-Id: I4cce5ba64cc5234b98363b025ac4bb42e64349f1 --- core/java/android/view/View.java | 5 +++++ core/java/android/view/ViewRootImpl.java | 7 ++++++- core/java/android/view/ViewTreeObserver.java | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) 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();