From 1a4786255957178ea7ebbf2b4356bcf973c761eb Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 4 May 2020 14:21:31 -0400 Subject: [PATCH] Prevent NPE in ControlsListingControllerImpl Move initialization of callbacks list to before the ServiceListing is reloaded. That way, it will always be initialized by the time the listener is called. Fixes: 153448765 Test: atest ControlsListingControllerImpl Change-Id: I67ba7f3d4bd74f38d0e6f69857135864dcf4a573 --- .../management/ControlsListingControllerImpl.kt | 5 ++--- .../ControlsListingControllerImplTest.kt | 17 +++++++++++++++++ 2 files changed, 19 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 3590f1f4fad89..48f191d128018 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt @@ -66,6 +66,8 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( ) private var serviceListing = serviceListingBuilder(context) + // All operations in background thread + private val callbacks = mutableSetOf() companion object { private const val TAG = "ControlsListingControllerImpl" @@ -116,9 +118,6 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( } } - // All operations in background thread - private val callbacks = mutableSetOf() - /** * Adds a callback to this controller. * 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 13a77083255c6..9b40c5e87b791 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 @@ -38,10 +38,12 @@ import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.`when` import org.mockito.Mockito.inOrder +import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import java.util.concurrent.Executor @SmallTest @RunWith(AndroidTestingRunner::class) @@ -103,6 +105,21 @@ class ControlsListingControllerImplTest : SysuiTestCase() { verify(mockSL).reload() } + @Test + fun testImmediateListingReload_doesNotCrash() { + val exec = Executor { it.run() } + val mockServiceListing = mock(ServiceListing::class.java) + var callback: ServiceListing.Callback? = null + `when`(mockServiceListing.addCallback(any())).then { + callback = it.getArgument(0) + Unit + } + `when`(mockServiceListing.reload()).then { + callback?.onServicesReloaded(listOf(serviceInfo)) + } + ControlsListingControllerImpl(mContext, exec, { mockServiceListing }) + } + @Test fun testStartsOnUser() { assertEquals(user, controller.currentUserId)