From fdf6b5ba35e22e49926404aa758e4f88b28dc0bd Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 1 Sep 2021 20:22:07 -0700 Subject: [PATCH] Fixing a couple nav bar crashes - Reset the rotation button controller callback when detaching the nav bar (the callback can otherwise be called back) - Only touch autohide if the controller is set (RotationButtonController update callback is set when initialized and not unset, so it too can callback into the nav bar view after it's been destroyed) - Add workaround for issue where content provider can still callback the observer after the observer has been unregistered, but the msg has been posted to the handler (filed b/198002034 to track fw fix) Fixes: 194631201 Fixes: 183051107 Fixes: 197946101 Test: atest SystemUITests Change-Id: I520ca261b012d1d7f04ea8f732819e7eb1b4f77f Merged-In: I520ca261b012d1d7f04ea8f732819e7eb1b4f77f --- .../android/systemui/navigationbar/NavigationBar.java | 11 ++++++++++- .../systemui/navigationbar/NavigationBarView.java | 2 +- .../navigationbar/RotationButtonController.java | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index cb11454e44eea..5d37bff192eb9 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -410,6 +410,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange, Uri uri) { + // TODO(b/198002034): Content observers currently can still be called back after being + // unregistered, and in this case we can ignore the change if the nav bar has been + // destroyed already + if (mNavigationBarView == null) { + return; + } updateAssistantEntrypoints(); } }; @@ -651,7 +657,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, if (mIsOnDefaultDisplay) { final RotationButtonController rotationButtonController = mNavigationBarView.getRotationButtonController(); - rotationButtonController.addRotationCallback(mRotationWatcher); + rotationButtonController.setRotationCallback(mRotationWatcher); // Reset user rotation pref to match that of the WindowManager if starting in locked // mode. This will automatically happen when switching from auto-rotate to locked mode. @@ -690,6 +696,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, @Override public void onViewDetachedFromWindow(View v) { + final RotationButtonController rotationButtonController = + mNavigationBarView.getRotationButtonController(); + rotationButtonController.setRotationCallback(null); mNavigationBarView.getBarTransitions().destroy(); mNavigationBarView.getLightTransitionsController().destroy(mContext); mOverviewProxyService.removeCallback(mOverviewProxyListener); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 61e803312b554..0433247e1707c 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -274,7 +274,7 @@ public class NavigationBarView extends FrameLayout implements }; private final Consumer mRotationButtonListener = (visible) -> { - if (visible) { + if (visible && mAutoHideController != null) { // If the button will actually become visible and the navbar is about to hide, // tell the statusbar to keep it around for longer mAutoHideController.touchAutoHide(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java index 649ac875b4c22..8ea9ae3c21c54 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java @@ -180,7 +180,7 @@ public class RotationButtonController { TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener); } - void addRotationCallback(Consumer watcher) { + void setRotationCallback(Consumer watcher) { mRotWatcherListener = watcher; }