From 3cdfdeb15ec9bf2f26394dedd52211355fd1b447 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 8 May 2020 11:09:51 -0400 Subject: Controls UI - Do not clear callbacks on user change Listeners would get into an invalid state when changing users. Fixes: 155990179 Test: atest ControlsListingControllerImplTest Change-Id: I9c48c767a7da47eca029a27f9c223e92c2359412 --- .../management/ControlsListingControllerImpl.kt | 10 ++++++-- .../ControlsListingControllerImplTest.kt | 29 +++++++++++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt index 48f191d12801..a2adcf953cc4 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt @@ -106,9 +106,15 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( override fun changeUser(newUser: UserHandle) { backgroundExecutor.execute { - callbacks.clear() - availableServices = emptyList() serviceListing.setListening(false) + + // Notify all callbacks in order to clear their existing state prior to attaching + // a new listener + availableServices = emptyList() + callbacks.forEach { + it.onServicesUpdated(emptyList()) + } + currentUserId = newUser.identifier val contextForUser = context.createContextAsUser(newUser, 0) serviceListing = serviceListingBuilder(contextForUser) diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt index 9b40c5e87b79..128a7e856ec5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt @@ -177,4 +177,31 @@ class ControlsListingControllerImplTest : SysuiTestCase() { inOrder.verify(mockSL).setListening(true) inOrder.verify(mockSL).reload() } -} \ No newline at end of file + + @Test + fun testChangeUserResetsExistingCallbackServices() { + val list = listOf(serviceInfo) + controller.addCallback(mockCallback) + + @Suppress("unchecked_cast") + val captor: ArgumentCaptor> = + ArgumentCaptor.forClass(List::class.java) + as ArgumentCaptor> + executor.runAllReady() + reset(mockCallback) + + serviceListingCallbackCaptor.value.onServicesReloaded(list) + + executor.runAllReady() + verify(mockCallback).onServicesUpdated(capture(captor)) + assertEquals(1, captor.value.size) + + reset(mockCallback) + controller.changeUser(UserHandle.of(otherUser)) + executor.runAllReady() + assertEquals(otherUser, controller.currentUserId) + + verify(mockCallback).onServicesUpdated(capture(captor)) + assertEquals(0, captor.value.size) + } +} -- cgit v1.2.3-59-g8ed1b