diff options
| -rw-r--r-- | core/java/android/inputmethodservice/NavigationBarController.java | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java index 7bc95731d627..a6e475aeb813 100644 --- a/core/java/android/inputmethodservice/NavigationBarController.java +++ b/core/java/android/inputmethodservice/NavigationBarController.java @@ -266,34 +266,50 @@ final class NavigationBarController { } final boolean insetChanged = !Objects.equals(systemInsets, mLastInsets); if (zOrderChanged || insetChanged) { - final NavigationBarFrame that = mNavigationBarFrame; - that.post(() -> { - if (!that.isAttachedToWindow()) { - return; - } - final Insets currentSystemInsets = getSystemInsets(); - if (!Objects.equals(currentSystemInsets, mLastInsets)) { - that.setLayoutParams( - new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - currentSystemInsets.bottom, Gravity.BOTTOM)); - mLastInsets = currentSystemInsets; - } - if (decor instanceof ViewGroup) { - ViewGroup decorGroup = (ViewGroup) decor; - final View navbarBackgroundView = - window.getNavigationBarBackgroundView(); - if (navbarBackgroundView != null - && decorGroup.indexOfChild(navbarBackgroundView) - > decorGroup.indexOfChild(that)) { - decorGroup.bringChildToFront(that); - } - } - }); + scheduleRelayout(); } } } + private void scheduleRelayout() { + // Capture the current frame object in case the object is replaced or cleared later. + final NavigationBarFrame frame = mNavigationBarFrame; + frame.post(() -> { + if (mDestroyed) { + return; + } + if (!frame.isAttachedToWindow()) { + return; + } + final Window window = mService.mWindow.getWindow(); + if (window == null) { + return; + } + final View decor = window.peekDecorView(); + if (decor == null) { + return; + } + if (!(decor instanceof ViewGroup)) { + return; + } + final ViewGroup decorGroup = (ViewGroup) decor; + final Insets currentSystemInsets = getSystemInsets(); + if (!Objects.equals(currentSystemInsets, mLastInsets)) { + frame.setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + currentSystemInsets.bottom, Gravity.BOTTOM)); + mLastInsets = currentSystemInsets; + } + final View navbarBackgroundView = + window.getNavigationBarBackgroundView(); + if (navbarBackgroundView != null + && decorGroup.indexOfChild(navbarBackgroundView) + > decorGroup.indexOfChild(frame)) { + decorGroup.bringChildToFront(frame); + } + }); + } + private boolean isGesturalNavigationEnabled() { final Resources resources = mService.getResources(); if (resources == null) { |