From 41568351731cd08105ee6fef0e79c978d68f58c0 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Thu, 3 Feb 2022 15:38:29 -0500 Subject: [PATCH] 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 --- .../userswitcher/StatusBarUserInfoTracker.kt | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt index 2dbc19c653f7b..b0f762994c0f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt @@ -19,12 +19,19 @@ package com.android.systemui.statusbar.phone.userswitcher import android.graphics.drawable.Drawable 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.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.UserInfoController 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 /** @@ -34,8 +41,11 @@ import javax.inject.Inject @SysUISingleton class StatusBarUserInfoTracker @Inject constructor( private val userInfoController: UserInfoController, - private val userManager: UserManager -) : CallbackController { + private val userManager: UserManager, + private val dumpManager: DumpManager, + @Main private val mainExecutor: Executor, + @Background private val backgroundExecutor: Executor +) : CallbackController, Dumpable { var currentUserName: String? = null private set var currentUserAvatar: Drawable? = null @@ -53,7 +63,7 @@ class StatusBarUserInfoTracker @Inject constructor( } init { - startListening() + dumpManager.registerDumpable(TAG, this) } override fun addCallback(listener: CurrentUserChipInfoUpdatedListener) { @@ -96,27 +106,33 @@ class StatusBarUserInfoTracker @Inject constructor( userInfoController.removeCallback(userInfoChangedListener) } - private fun checkUserSwitcherEnabled() { - whitelistIpcs { - userSwitcherEnabled = userManager.isUserSwitcherEnabled - } - } - /** * Force a check to [UserManager.isUserSwitcherEnabled], and update listeners if the value has * changed */ fun checkEnabled() { - val wasEnabled = userSwitcherEnabled - checkUserSwitcherEnabled() + backgroundExecutor.execute { + // Check on a background thread to avoid main thread Binder calls + val wasEnabled = userSwitcherEnabled + userSwitcherEnabled = userManager.isUserSwitcherEnabled - if (wasEnabled != userSwitcherEnabled) { - notifyListenersSettingChanged() + if (wasEnabled != userSwitcherEnabled) { + mainExecutor.execute { + notifyListenersSettingChanged() + } + } } } + + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array) { + pw.println(" userSwitcherEnabled=$userSwitcherEnabled") + pw.println(" listening=$listening") + } } interface CurrentUserChipInfoUpdatedListener { fun onCurrentUserChipInfoUpdated() fun onStatusBarUserSwitcherSettingChanged(enabled: Boolean) {} } + +private const val TAG = "StatusBarUserInfoTracker"