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

Commit 41568351 authored by Evan Laird's avatar Evan Laird
Browse files

Move binder calls off of the main thread

StatusBarUserInfoTracker was calling UserManager#isUserSwitcherEnabled()
on the main thread to maintain consistency with KeyguardStatusBarView,
but that's not strictly necessary.

Test: atest SystemUITests
Bug: 217250837
Change-Id: Icc945182aeed4f2113156db7576fe3b71278b8b7
parent 549ffa2e
Loading
Loading
Loading
Loading
+30 −14
Original line number Original line Diff line number Diff line
@@ -19,12 +19,19 @@ package com.android.systemui.statusbar.phone.userswitcher
import android.graphics.drawable.Drawable
import android.graphics.drawable.Drawable
import android.os.UserManager
import android.os.UserManager


import com.android.systemui.DejankUtils.whitelistIpcs
import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener


import java.io.FileDescriptor
import java.io.PrintWriter
import java.util.concurrent.Executor

import javax.inject.Inject
import javax.inject.Inject


/**
/**
@@ -34,8 +41,11 @@ import javax.inject.Inject
@SysUISingleton
@SysUISingleton
class StatusBarUserInfoTracker @Inject constructor(
class StatusBarUserInfoTracker @Inject constructor(
    private val userInfoController: UserInfoController,
    private val userInfoController: UserInfoController,
    private val userManager: UserManager
    private val userManager: UserManager,
) : CallbackController<CurrentUserChipInfoUpdatedListener> {
    private val dumpManager: DumpManager,
    @Main private val mainExecutor: Executor,
    @Background private val backgroundExecutor: Executor
) : CallbackController<CurrentUserChipInfoUpdatedListener>, Dumpable {
    var currentUserName: String? = null
    var currentUserName: String? = null
        private set
        private set
    var currentUserAvatar: Drawable? = null
    var currentUserAvatar: Drawable? = null
@@ -53,7 +63,7 @@ class StatusBarUserInfoTracker @Inject constructor(
    }
    }


    init {
    init {
        startListening()
        dumpManager.registerDumpable(TAG, this)
    }
    }


    override fun addCallback(listener: CurrentUserChipInfoUpdatedListener) {
    override fun addCallback(listener: CurrentUserChipInfoUpdatedListener) {
@@ -96,27 +106,33 @@ class StatusBarUserInfoTracker @Inject constructor(
        userInfoController.removeCallback(userInfoChangedListener)
        userInfoController.removeCallback(userInfoChangedListener)
    }
    }


    private fun checkUserSwitcherEnabled() {
        whitelistIpcs {
            userSwitcherEnabled = userManager.isUserSwitcherEnabled
        }
    }

    /**
    /**
     * Force a check to [UserManager.isUserSwitcherEnabled], and update listeners if the value has
     * Force a check to [UserManager.isUserSwitcherEnabled], and update listeners if the value has
     * changed
     * changed
     */
     */
    fun checkEnabled() {
    fun checkEnabled() {
        backgroundExecutor.execute {
            // Check on a background thread to avoid main thread Binder calls
            val wasEnabled = userSwitcherEnabled
            val wasEnabled = userSwitcherEnabled
        checkUserSwitcherEnabled()
            userSwitcherEnabled = userManager.isUserSwitcherEnabled


            if (wasEnabled != userSwitcherEnabled) {
            if (wasEnabled != userSwitcherEnabled) {
                mainExecutor.execute {
                    notifyListenersSettingChanged()
                    notifyListenersSettingChanged()
                }
                }
            }
            }
        }
        }
    }

    override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
        pw.println("  userSwitcherEnabled=$userSwitcherEnabled")
        pw.println("  listening=$listening")
    }
}


interface CurrentUserChipInfoUpdatedListener {
interface CurrentUserChipInfoUpdatedListener {
    fun onCurrentUserChipInfoUpdated()
    fun onCurrentUserChipInfoUpdated()
    fun onStatusBarUserSwitcherSettingChanged(enabled: Boolean) {}
    fun onStatusBarUserSwitcherSettingChanged(enabled: Boolean) {}
}
}

private const val TAG = "StatusBarUserInfoTracker"