From 1e91e474f7e0d3cc8e57b702e6bb21563a00ca98 Mon Sep 17 00:00:00 2001 From: Julia Kawano Date: Wed, 9 Sep 2020 06:16:41 +0000 Subject: [PATCH] Fix crash from UserNameViewController.removeAll() The UserNamveViewController was calling removeListener() before the listener had been registered. Added a boolean mRegistered to check if the listener has been registered before removing it and added a test that calls removeAll() before a listener is registered. Bug: 168065924 Test: atest UserNameViewControllerTest Change-Id: If24374e51a61c943142ba3a8794aca548dd241cc --- .../car/statusbar/UserNameViewController.java | 13 ++++++++++--- .../car/statusbar/UserNameViewControllerTest.java | 7 +++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java index 5ef8aa19b1829..1b1a118d6ba14 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java @@ -59,6 +59,8 @@ public class UserNameViewController { } }; + private boolean mUserLifecycleListenerRegistered = false; + private final CarUserManager.UserLifecycleListener mUserLifecycleListener = new CarUserManager.UserLifecycleListener() { @Override @@ -100,9 +102,13 @@ public class UserNameViewController { * Clean up the controller and unregister receiver. */ public void removeAll() { - mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver); - if (mCarUserManager != null) { - mCarUserManager.removeListener(mUserLifecycleListener); + mUserNameView = null; + if (mUserLifecycleListenerRegistered) { + mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver); + if (mCarUserManager != null) { + mCarUserManager.removeListener(mUserLifecycleListener); + } + mUserLifecycleListenerRegistered = false; } } @@ -112,6 +118,7 @@ public class UserNameViewController { mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE); if (mCarUserManager != null) { mCarUserManager.addListener(Runnable::run, mUserLifecycleListener); + mUserLifecycleListenerRegistered = true; } else { Log.e(TAG, "CarUserManager could not be obtained."); } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java index 8f9e56edf4198..ac7edd32c14c1 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/statusbar/UserNameViewControllerTest.java @@ -108,6 +108,13 @@ public class UserNameViewControllerTest extends SysuiTestCase { verifyZeroInteractions(mUserManager); } + @Test + public void removeAll_withNoRegisteredListener_doesNotUnregister() { + mUserNameViewController.removeAll(); + + verifyZeroInteractions(mCarUserManager); + } + @Test public void userLifecycleListener_onUserSwitchLifecycleEvent_updatesUserNameView() { ArgumentCaptor userLifecycleListenerArgumentCaptor =