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
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -274,7 +274,7 @@ public class NavigationBarView extends FrameLayout implements
|
||||
};
|
||||
|
||||
private final Consumer<Boolean> 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();
|
||||
|
||||
@@ -180,7 +180,7 @@ public class RotationButtonController {
|
||||
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
|
||||
}
|
||||
|
||||
void addRotationCallback(Consumer<Integer> watcher) {
|
||||
void setRotationCallback(Consumer<Integer> watcher) {
|
||||
mRotWatcherListener = watcher;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user