Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e91e474 authored by Julia Kawano's avatar Julia Kawano
Browse files

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
parent 28733d02
Loading
Loading
Loading
Loading
+10 −3
Original line number Original line Diff line number Diff line
@@ -59,6 +59,8 @@ public class UserNameViewController {
        }
        }
    };
    };


    private boolean mUserLifecycleListenerRegistered = false;

    private final CarUserManager.UserLifecycleListener mUserLifecycleListener =
    private final CarUserManager.UserLifecycleListener mUserLifecycleListener =
            new CarUserManager.UserLifecycleListener() {
            new CarUserManager.UserLifecycleListener() {
                @Override
                @Override
@@ -100,10 +102,14 @@ public class UserNameViewController {
     * Clean up the controller and unregister receiver.
     * Clean up the controller and unregister receiver.
     */
     */
    public void removeAll() {
    public void removeAll() {
        mUserNameView = null;
        if (mUserLifecycleListenerRegistered) {
            mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver);
            mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver);
            if (mCarUserManager != null) {
            if (mCarUserManager != null) {
                mCarUserManager.removeListener(mUserLifecycleListener);
                mCarUserManager.removeListener(mUserLifecycleListener);
            }
            }
            mUserLifecycleListenerRegistered = false;
        }
    }
    }


    private void registerForUserChangeEvents() {
    private void registerForUserChangeEvents() {
@@ -112,6 +118,7 @@ public class UserNameViewController {
            mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
            mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
            if (mCarUserManager != null) {
            if (mCarUserManager != null) {
                mCarUserManager.addListener(Runnable::run, mUserLifecycleListener);
                mCarUserManager.addListener(Runnable::run, mUserLifecycleListener);
                mUserLifecycleListenerRegistered = true;
            } else {
            } else {
                Log.e(TAG, "CarUserManager could not be obtained.");
                Log.e(TAG, "CarUserManager could not be obtained.");
            }
            }
+7 −0
Original line number Original line Diff line number Diff line
@@ -108,6 +108,13 @@ public class UserNameViewControllerTest extends SysuiTestCase {
        verifyZeroInteractions(mUserManager);
        verifyZeroInteractions(mUserManager);
    }
    }


    @Test
    public void removeAll_withNoRegisteredListener_doesNotUnregister() {
        mUserNameViewController.removeAll();

        verifyZeroInteractions(mCarUserManager);
    }

    @Test
    @Test
    public void userLifecycleListener_onUserSwitchLifecycleEvent_updatesUserNameView() {
    public void userLifecycleListener_onUserSwitchLifecycleEvent_updatesUserNameView() {
        ArgumentCaptor<CarUserManager.UserLifecycleListener> userLifecycleListenerArgumentCaptor =
        ArgumentCaptor<CarUserManager.UserLifecycleListener> userLifecycleListenerArgumentCaptor =