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
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<KeyguardStat
|
||||
private final BiometricUnlockController mBiometricUnlockController;
|
||||
private final SysuiStatusBarStateController mStatusBarStateController;
|
||||
private final StatusBarContentInsetsProvider mInsetsProvider;
|
||||
private final UserManager mUserManager;
|
||||
|
||||
private final ConfigurationController.ConfigurationListener mConfigurationListener =
|
||||
new ConfigurationController.ConfigurationListener() {
|
||||
@@ -105,6 +108,11 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
mView.onOverlayChanged();
|
||||
KeyguardStatusBarViewController.this.onThemeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigChanged(Configuration newConfig) {
|
||||
updateUserSwitcher();
|
||||
}
|
||||
};
|
||||
|
||||
private final SystemStatusAnimationCallback mAnimationCallback =
|
||||
@@ -158,6 +166,13 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyguardVisibilityChanged(boolean showing) {
|
||||
if (showing) {
|
||||
updateUserSwitcher();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBiometricRunningStateChanged(
|
||||
boolean running,
|
||||
@@ -230,7 +245,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
KeyguardUpdateMonitor keyguardUpdateMonitor,
|
||||
BiometricUnlockController biometricUnlockController,
|
||||
SysuiStatusBarStateController statusBarStateController,
|
||||
StatusBarContentInsetsProvider statusBarContentInsetsProvider
|
||||
StatusBarContentInsetsProvider statusBarContentInsetsProvider,
|
||||
UserManager userManager
|
||||
) {
|
||||
super(view);
|
||||
mCarrierTextController = carrierTextController;
|
||||
@@ -248,6 +264,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
mBiometricUnlockController = biometricUnlockController;
|
||||
mStatusBarStateController = statusBarStateController;
|
||||
mInsetsProvider = statusBarContentInsetsProvider;
|
||||
mUserManager = userManager;
|
||||
|
||||
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
|
||||
mKeyguardStateController.addCallback(
|
||||
@@ -293,7 +310,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
}
|
||||
mView.setOnApplyWindowInsetsListener(
|
||||
(view, windowInsets) -> mView.updateWindowInsets(windowInsets, mInsetsProvider));
|
||||
|
||||
updateUserSwitcher();
|
||||
onThemeChanged();
|
||||
}
|
||||
|
||||
@@ -436,6 +453,14 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
|
||||
return alpha;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates visibility of the user switcher button based on {@link android.os.UserManager} state.
|
||||
*/
|
||||
private void updateUserSwitcher() {
|
||||
mView.setUserSwitcherEnabled(mUserManager.isUserSwitcherEnabled(getResources().getBoolean(
|
||||
R.bool.qs_show_user_switcher_for_single_user)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update {@link KeyguardStatusBarView}'s visibility based on whether keyguard is showing and
|
||||
* whether heads up is visible.
|
||||
|
||||
@@ -23,9 +23,13 @@ import static com.android.systemui.statusbar.StatusBarState.SHADE;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.os.UserManager;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -45,6 +49,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.UserInfoController;
|
||||
|
||||
@@ -52,6 +57,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@@ -87,6 +93,12 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
|
||||
private SysuiStatusBarStateController mStatusBarStateController;
|
||||
@Mock
|
||||
private StatusBarContentInsetsProvider mStatusBarContentInsetsProvider;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
@Captor
|
||||
private ArgumentCaptor<ConfigurationListener> mConfigurationListenerCaptor;
|
||||
@Captor
|
||||
private ArgumentCaptor<KeyguardUpdateMonitorCallback> 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
|
||||
|
||||
Reference in New Issue
Block a user