summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/inputmethodservice/NavigationBarController.java64
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) {