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

Commit 3f644f0f authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Stop listening to ACTION_USER_SWITCHED in BD

We just need the current user, that can be handled with UserTracker

Test: atest BroadcastDispatcherTest
Bug: 163579262
Change-Id: I2ae918126b21e7c0511b613b7b047bfe85c9c367
parent 8fd2efb0
Loading
Loading
Loading
Loading
+5 −25
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.broadcast

import android.app.ActivityManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
@@ -33,6 +32,7 @@ import com.android.internal.util.IndentingPrintWriter
import com.android.systemui.Dumpable
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import com.android.systemui.dump.DumpManager
import com.android.systemui.settings.UserTracker
import java.io.FileDescriptor
import java.io.PrintWriter
import java.util.concurrent.Executor
@@ -47,8 +47,6 @@ data class ReceiverData(
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 MSG_USER_SWITCH = 3
private const val MSG_SET_STARTING_USER = 99
private const val TAG = "BroadcastDispatcher"
private const val DEBUG = true

@@ -68,23 +66,15 @@ open class BroadcastDispatcher constructor (
    private val bgLooper: Looper,
    private val bgExecutor: Executor,
    private val dumpManager: DumpManager,
    private val logger: BroadcastDispatcherLogger
) : Dumpable, BroadcastReceiver() {
    private val logger: BroadcastDispatcherLogger,
    private val userTracker: UserTracker
) : Dumpable {

    // Only modify in BG thread
    private val receiversByUser = SparseArray<UserBroadcastDispatcher>(20)

    fun initialize() {
        dumpManager.registerDumpable(javaClass.name, this)
        handler.sendEmptyMessage(MSG_SET_STARTING_USER)
        registerReceiver(this, IntentFilter(Intent.ACTION_USER_SWITCHED), null, UserHandle.ALL)
    }

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_USER_SWITCHED) {
            val user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL)
            handler.obtainMessage(MSG_USER_SWITCH, user, 0).sendToTarget()
        }
    }

    /**
@@ -181,7 +171,6 @@ open class BroadcastDispatcher constructor (
        pw.println("Broadcast dispatcher:")
        val ipw = IndentingPrintWriter(pw, "  ")
        ipw.increaseIndent()
        ipw.println("Current user: ${handler.currentUser}")
        for (index in 0 until receiversByUser.size()) {
            ipw.println("User ${receiversByUser.keyAt(index)}")
            receiversByUser.valueAt(index).dump(fd, ipw, args)
@@ -190,7 +179,6 @@ open class BroadcastDispatcher constructor (
    }

    private val handler = object : Handler(bgLooper) {
        var currentUser = UserHandle.USER_SYSTEM

        override fun handleMessage(msg: Message) {
            when (msg.what) {
@@ -199,7 +187,7 @@ open class BroadcastDispatcher constructor (
                    // 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) {
                        currentUser
                        userTracker.userId
                    } else {
                        data.user.identifier
                    }
@@ -221,14 +209,6 @@ open class BroadcastDispatcher constructor (
                MSG_REMOVE_RECEIVER_FOR_USER -> {
                    receiversByUser.get(msg.arg1)?.unregisterReceiver(msg.obj as BroadcastReceiver)
                }

                MSG_USER_SWITCH -> {
                    currentUser = msg.arg1
                }
                MSG_SET_STARTING_USER -> {
                    currentUser = ActivityManager.getCurrentUser()
                }

                else -> super.handleMessage(msg)
            }
        }
+4 −2
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import com.android.systemui.plugins.PluginInitializerImpl;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.shared.plugins.PluginManagerImpl;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -269,10 +270,11 @@ public class DependencyProvider {
            @Background Looper backgroundLooper,
            @Background Executor backgroundExecutor,
            DumpManager dumpManager,
            BroadcastDispatcherLogger logger
            BroadcastDispatcherLogger logger,
            UserTracker userTracker
    ) {
        BroadcastDispatcher bD = new BroadcastDispatcher(context, backgroundLooper,
                backgroundExecutor, dumpManager, logger);
                backgroundExecutor, dumpManager, logger, userTracker);
        bD.initialize();
        return bD;
    }
+2 −1
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;

@@ -78,7 +79,7 @@ public abstract class SysuiTestCase {
        Dependency.setInstance(mDependency);
        mFakeBroadcastDispatcher = new FakeBroadcastDispatcher(mContext, mock(Looper.class),
                mock(Executor.class), mock(DumpManager.class),
                mock(BroadcastDispatcherLogger.class));
                mock(BroadcastDispatcherLogger.class), mock(UserTracker.class));

        mRealInstrumentation = InstrumentationRegistry.getInstrumentation();
        Instrumentation inst = spy(mRealInstrumentation);
+7 −7
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.broadcast

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Handler
import android.os.Looper
@@ -30,6 +29,7 @@ import android.testing.TestableLooper
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import com.android.systemui.dump.DumpManager
import com.android.systemui.settings.UserTracker
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
import junit.framework.Assert.assertSame
@@ -80,6 +80,8 @@ class BroadcastDispatcherTest : SysuiTestCase() {
    private lateinit var mockHandler: Handler
    @Mock
    private lateinit var logger: BroadcastDispatcherLogger
    @Mock
    private lateinit var userTracker: UserTracker

    private lateinit var executor: Executor

@@ -101,6 +103,7 @@ class BroadcastDispatcherTest : SysuiTestCase() {
                mock(Executor::class.java),
                mock(DumpManager::class.java),
                logger,
                userTracker,
                mapOf(0 to mockUBRUser0, 1 to mockUBRUser1))

        // These should be valid filters
@@ -178,11 +181,7 @@ class BroadcastDispatcherTest : SysuiTestCase() {

    @Test
    fun testRegisterCurrentAsActualUser() {
        val intent = Intent(Intent.ACTION_USER_SWITCHED).apply {
            putExtra(Intent.EXTRA_USER_HANDLE, user1.identifier)
        }
        broadcastDispatcher.onReceive(mockContext, intent)
        testableLooper.processAllMessages()
        `when`(userTracker.userId).thenReturn(user1.identifier)

        broadcastDispatcher.registerReceiverWithHandler(broadcastReceiver, intentFilter,
                mockHandler, UserHandle.CURRENT)
@@ -250,8 +249,9 @@ class BroadcastDispatcherTest : SysuiTestCase() {
        executor: Executor,
        dumpManager: DumpManager,
        logger: BroadcastDispatcherLogger,
        userTracker: UserTracker,
        var mockUBRMap: Map<Int, UserBroadcastDispatcher>
    ) : BroadcastDispatcher(context, bgLooper, executor, dumpManager, logger) {
    ) : BroadcastDispatcher(context, bgLooper, executor, dumpManager, logger, userTracker) {
        override fun createUBRForUser(userId: Int): UserBroadcastDispatcher {
            return mockUBRMap.getOrDefault(userId, mock(UserBroadcastDispatcher::class.java))
        }
+4 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.util.Log
import com.android.systemui.SysuiTestableContext
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger
import com.android.systemui.dump.DumpManager
import com.android.systemui.settings.UserTracker
import java.util.concurrent.Executor

class FakeBroadcastDispatcher(
@@ -33,8 +34,9 @@ class FakeBroadcastDispatcher(
    looper: Looper,
    executor: Executor,
    dumpManager: DumpManager,
    logger: BroadcastDispatcherLogger
) : BroadcastDispatcher(context, looper, executor, dumpManager, logger) {
    logger: BroadcastDispatcherLogger,
    userTracker: UserTracker
) : BroadcastDispatcher(context, looper, executor, dumpManager, logger, userTracker) {

    private val registeredReceivers = ArraySet<BroadcastReceiver>()