From a7c9bec46ce5cdc924afde58bf85fa0edf40a220 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) Bug: 194631201 Bug: 183051107 Bug: 197946101 Test: atest SystemUITests Change-Id: 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 4a67e94425106..7de0a1293f8c6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -422,6 +422,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(); } }; @@ -648,7 +654,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. @@ -687,6 +693,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 0f888cbd14a86..2de40262f42dd 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -279,7 +279,7 @@ public class NavigationBarView extends FrameLayout implements new RotationButtonUpdatesCallback() { @Override public void onVisibilityChanged(boolean 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 196625b3630e6..0f5c03a2a5961 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java @@ -183,7 +183,7 @@ public class RotationButtonController { TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener); } - void addRotationCallback(Consumer watcher) { + void setRotationCallback(Consumer watcher) { mRotWatcherListener = watcher; }