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
This commit is contained in:
Julia Kawano
2020-09-09 06:16:41 +00:00
parent 28733d0275
commit 1e91e474f7
2 changed files with 17 additions and 3 deletions

View File

@@ -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.");
}

View File

@@ -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<CarUserManager.UserLifecycleListener> userLifecycleListenerArgumentCaptor =