From 17a46a02809481e89115c920f83193bb1aa03183 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 31 Jan 2022 15:10:59 -0800 Subject: [PATCH] Cache UserManager#isUserSwitcherEnabled This IPC was happening every frame, which is a really bad idea :) Now it's cached, such as it happens when resources change, or the keyguard becomes visible. Bug: 214567637 Test: atest KeyguardStatusBarViewControllerTest Change-Id: I6afe8b794288bc5bce25c993a67f2ecc928d90a1 --- .../phone/KeyguardStatusBarView.java | 16 +++---- .../KeyguardStatusBarViewController.java | 29 +++++++++++- .../KeyguardStatusBarViewControllerTest.java | 44 +++++++++++++++++-- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 00b54e9e042aa..2ec5f250eb48c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.DejankUtils.whitelistIpcs; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; import static com.android.systemui.util.Utils.getStatusBarHeaderHeightKeyguard; @@ -27,7 +26,6 @@ import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.UserManager; import android.util.AttributeSet; import android.util.Pair; import android.util.TypedValue; @@ -47,7 +45,6 @@ import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; -import com.android.systemui.statusbar.window.StatusBarWindowView; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -72,7 +69,6 @@ public class KeyguardStatusBarView extends RelativeLayout { private StatusIconContainer mStatusIconContainer; private boolean mKeyguardUserSwitcherEnabled; - private final UserManager mUserManager; private boolean mIsPrivacyDotEnabled; private int mSystemIconsSwitcherHiddenExpandedMargin; @@ -99,10 +95,10 @@ public class KeyguardStatusBarView extends RelativeLayout { */ private int mTopClipping; private final Rect mClipRect = new Rect(0, 0, 0, 0); + private boolean mIsUserSwitcherEnabled; public KeyguardStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); - mUserManager = UserManager.get(getContext()); } @Override @@ -163,6 +159,10 @@ public class KeyguardStatusBarView extends RelativeLayout { updateKeyguardStatusBarHeight(); } + public void setUserSwitcherEnabled(boolean enabled) { + mIsUserSwitcherEnabled = enabled; + } + private void updateKeyguardStatusBarHeight() { MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams(); lp.height = getStatusBarHeaderHeightKeyguard(mContext); @@ -200,11 +200,7 @@ public class KeyguardStatusBarView extends RelativeLayout { // If we have no keyguard switcher, the screen width is under 600dp. In this case, // we only show the multi-user switch if it's enabled through UserManager as well as // by the user. - // TODO(b/138661450) Move IPC calls to background - boolean isMultiUserEnabled = whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled( - mContext.getResources().getBoolean( - R.bool.qs_show_user_switcher_for_single_user))); - if (isMultiUserEnabled) { + if (mIsUserSwitcherEnabled) { mMultiUserAvatar.setVisibility(View.VISIBLE); } else { mMultiUserAvatar.setVisibility(View.GONE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index 81871634fbaf8..ee97fd6318189 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -23,8 +23,10 @@ import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedul import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.content.res.Configuration; import android.content.res.Resources; import android.hardware.biometrics.BiometricSourceType; +import android.os.UserManager; import android.util.MathUtils; import android.view.View; @@ -92,6 +94,7 @@ public class KeyguardStatusBarViewController extends ViewController mView.updateWindowInsets(windowInsets, mInsetsProvider)); - + updateUserSwitcher(); onThemeChanged(); } @@ -436,6 +453,14 @@ public class KeyguardStatusBarViewController extends ViewController mConfigurationListenerCaptor; + @Captor + private ArgumentCaptor mKeyguardCallbackCaptor; private TestNotificationPanelViewStateProvider mNotificationPanelViewStateProvider; private KeyguardStatusBarView mKeyguardStatusBarView; @@ -101,8 +113,8 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { allowTestableLooperAsMainThread(); TestableLooper.get(this).runWithLooper(() -> { mKeyguardStatusBarView = - (KeyguardStatusBarView) LayoutInflater.from(mContext) - .inflate(R.layout.keyguard_status_bar, null); + spy((KeyguardStatusBarView) LayoutInflater.from(mContext) + .inflate(R.layout.keyguard_status_bar, null)); }); mController = new KeyguardStatusBarViewController( @@ -121,7 +133,8 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mKeyguardUpdateMonitor, mBiometricUnlockController, mStatusBarStateController, - mStatusBarContentInsetsProvider + mStatusBarContentInsetsProvider, + mUserManager ); } @@ -133,6 +146,31 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { verify(mAnimationScheduler).addCallback(any()); verify(mUserInfoController).addCallback(any()); verify(mStatusBarIconController).addIconGroup(any()); + verify(mUserManager).isUserSwitcherEnabled(anyBoolean()); + } + + @Test + public void onConfigurationChanged_updatesUserSwitcherVisibility() { + mController.onViewAttached(); + verify(mConfigurationController).addCallback(mConfigurationListenerCaptor.capture()); + clearInvocations(mUserManager); + clearInvocations(mKeyguardStatusBarView); + + mConfigurationListenerCaptor.getValue().onConfigChanged(null); + verify(mUserManager).isUserSwitcherEnabled(anyBoolean()); + verify(mKeyguardStatusBarView).setUserSwitcherEnabled(anyBoolean()); + } + + @Test + public void onKeyguardVisibilityChanged_updatesUserSwitcherVisibility() { + mController.onViewAttached(); + verify(mKeyguardUpdateMonitor).registerCallback(mKeyguardCallbackCaptor.capture()); + clearInvocations(mUserManager); + clearInvocations(mKeyguardStatusBarView); + + mKeyguardCallbackCaptor.getValue().onKeyguardVisibilityChanged(true); + verify(mUserManager).isUserSwitcherEnabled(anyBoolean()); + verify(mKeyguardStatusBarView).setUserSwitcherEnabled(anyBoolean()); } @Test