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

Commit 2c9b3b47 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Handle UserHandle.CURRENT in BroadcastDispatcher

This CL makes it so UserHandle.CURRENT is dereferenced to the current
user by BroadcastDispatcher when registering, using the proper actual
user id.

Test: atest BroadcastDispatcher
Test: dumpsys: OPA_ENABLED is properly registered
Fixes: 145817265
Change-Id: I4d730317a50f099785e37e3f154fdf2c3dd40a80
parent 1f664012
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ private const val MSG_ADD_RECEIVER = 0
private const val MSG_REMOVE_RECEIVER = 1
private const val MSG_REMOVE_RECEIVER_FOR_USER = 2
private const val TAG = "BroadcastDispatcher"
private const val DEBUG = false
private const val DEBUG = true

/**
 * SystemUI master Broadcast Dispatcher.
@@ -147,7 +147,13 @@ open class BroadcastDispatcher @Inject constructor (
            when (msg.what) {
                MSG_ADD_RECEIVER -> {
                    val data = msg.obj as ReceiverData
                    val userId = data.user.identifier
                    // If the receiver asked to be registered under the current user, we register
                    // under the actual current user.
                    val userId = if (data.user.identifier == UserHandle.USER_CURRENT) {
                        context.userId
                    } else {
                        data.user.identifier
                    }
                    if (userId < UserHandle.USER_ALL) {
                        if (DEBUG) Log.w(TAG, "Register receiver for invalid user: $userId")
                        return
+18 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ class BroadcastDispatcherTest : SysuiTestCase() {
        // These should be valid filters
        `when`(intentFilter.countActions()).thenReturn(1)
        `when`(intentFilterOther.countActions()).thenReturn(1)
        `when`(mockContext.user).thenReturn(user0)
        setUserMock(mockContext, user0)
    }

    @Test
@@ -140,6 +140,18 @@ class BroadcastDispatcherTest : SysuiTestCase() {
        verify(mockUBRUser1, never()).unregisterReceiver(broadcastReceiver)
    }

    @Test
    fun testRegisterCurrentAsActualUser() {
        setUserMock(mockContext, user1)
        broadcastDispatcher.registerReceiver(broadcastReceiver, intentFilter, mockHandler,
                UserHandle.CURRENT)

        testableLooper.processAllMessages()

        verify(mockUBRUser1).registerReceiver(capture(argumentCaptor))
        assertSame(broadcastReceiver, argumentCaptor.value.receiver)
    }

    @Test(expected = IllegalArgumentException::class)
    fun testFilterMustContainActions() {
        val testFilter = IntentFilter()
@@ -186,6 +198,11 @@ class BroadcastDispatcherTest : SysuiTestCase() {
        broadcastDispatcher.registerReceiver(broadcastReceiver, testFilter)
    }

    private fun setUserMock(mockContext: Context, user: UserHandle) {
        `when`(mockContext.user).thenReturn(user)
        `when`(mockContext.userId).thenReturn(user.identifier)
    }

    private class TestBroadcastDispatcher(
        context: Context,
        mainHandler: Handler,