Merge "Move device management resource retrieval calls to bg thread" into tm-dev

This commit is contained in:
Kholoud Mohamed
2022-04-13 08:29:32 +00:00
committed by Android (Google) Code Review
7 changed files with 97 additions and 54 deletions

View File

@@ -56,7 +56,9 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.util.concurrency.DelayableExecutor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -110,6 +112,8 @@ public class AuthContainerView extends LinearLayout
@ContainerState private int mContainerState = STATE_UNKNOWN;
private final Set<Integer> mFailedModalities = new HashSet<Integer>();
private final @Background DelayableExecutor mBackgroundExecutor;
// Non-null only if the dialog is in the act of dismissing and has not sent the reason yet.
@Nullable @AuthDialogCallback.DismissedReason private Integer mPendingCallbackReason;
// HAT received from LockSettingsService when credential is verified.
@@ -192,7 +196,7 @@ public class AuthContainerView extends LinearLayout
return this;
}
public AuthContainerView build(int[] sensorIds,
public AuthContainerView build(@Background DelayableExecutor bgExecutor, int[] sensorIds,
@Nullable List<FingerprintSensorPropertiesInternal> fpProps,
@Nullable List<FaceSensorPropertiesInternal> faceProps,
@NonNull WakefulnessLifecycle wakefulnessLifecycle,
@@ -200,7 +204,7 @@ public class AuthContainerView extends LinearLayout
@NonNull LockPatternUtils lockPatternUtils) {
mConfig.mSensorIds = sensorIds;
return new AuthContainerView(mConfig, fpProps, faceProps, wakefulnessLifecycle,
userManager, lockPatternUtils, new Handler(Looper.getMainLooper()));
userManager, lockPatternUtils, new Handler(Looper.getMainLooper()), bgExecutor);
}
}
@@ -253,7 +257,8 @@ public class AuthContainerView extends LinearLayout
@NonNull WakefulnessLifecycle wakefulnessLifecycle,
@NonNull UserManager userManager,
@NonNull LockPatternUtils lockPatternUtils,
@NonNull Handler mainHandler) {
@NonNull Handler mainHandler,
@NonNull @Background DelayableExecutor bgExecutor) {
super(config.mContext);
mConfig = config;
@@ -277,6 +282,7 @@ public class AuthContainerView extends LinearLayout
mBackgroundView = mFrameLayout.findViewById(R.id.background);
mPanelView = mFrameLayout.findViewById(R.id.panel);
mPanelController = new AuthPanelController(mContext, mPanelView);
mBackgroundExecutor = bgExecutor;
// Inflate biometric view only if necessary.
if (Utils.isBiometricAllowed(mConfig.mPromptInfo)) {
@@ -384,6 +390,7 @@ public class AuthContainerView extends LinearLayout
mCredentialView.setPromptInfo(mConfig.mPromptInfo);
mCredentialView.setPanelController(mPanelController, animatePanel);
mCredentialView.setShouldAnimateContents(animateContents);
mCredentialView.setBackgroundExecutor(mBackgroundExecutor);
mFrameLayout.addView(mCredentialView);
}

View File

@@ -64,11 +64,13 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.CoreStartable;
import com.android.systemui.assist.ui.DisplayUtils;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.Execution;
import java.util.ArrayList;
@@ -139,6 +141,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
private boolean mAllAuthenticatorsRegistered;
@NonNull private final UserManager mUserManager;
@NonNull private final LockPatternUtils mLockPatternUtils;
private final @Background DelayableExecutor mBackgroundExecutor;
@VisibleForTesting
final TaskStackListener mTaskStackListener = new TaskStackListener() {
@@ -507,13 +510,15 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
@NonNull UserManager userManager,
@NonNull LockPatternUtils lockPatternUtils,
@NonNull StatusBarStateController statusBarStateController,
@Main Handler handler) {
@Main Handler handler,
@Background DelayableExecutor bgExecutor) {
super(context);
mExecution = execution;
mWakefulnessLifecycle = wakefulnessLifecycle;
mUserManager = userManager;
mLockPatternUtils = lockPatternUtils;
mHandler = handler;
mBackgroundExecutor = bgExecutor;
mCommandQueue = commandQueue;
mActivityTaskManager = activityTaskManager;
mFingerprintManager = fingerprintManager;
@@ -839,6 +844,7 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
// Create a new dialog but do not replace the current one yet.
final AuthDialog newDialog = buildDialog(
mBackgroundExecutor,
promptInfo,
requireConfirmation,
userId,
@@ -934,9 +940,9 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
}
}
protected AuthDialog buildDialog(PromptInfo promptInfo, boolean requireConfirmation,
int userId, int[] sensorIds, String opPackageName,
boolean skipIntro, long operationId, long requestId,
protected AuthDialog buildDialog(@Background DelayableExecutor bgExecutor,
PromptInfo promptInfo, boolean requireConfirmation, int userId, int[] sensorIds,
String opPackageName, boolean skipIntro, long operationId, long requestId,
@BiometricMultiSensorMode int multiSensorConfig,
@NonNull WakefulnessLifecycle wakefulnessLifecycle,
@NonNull UserManager userManager,
@@ -951,8 +957,8 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
.setOperationId(operationId)
.setRequestId(requestId)
.setMultiSensorConfig(multiSensorConfig)
.build(sensorIds, mFpProps, mFaceProps, wakefulnessLifecycle, userManager,
lockPatternUtils);
.build(bgExecutor, sensorIds, mFpProps, mFaceProps, wakefulnessLifecycle,
userManager, lockPatternUtils);
}
/**

View File

@@ -53,6 +53,8 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.util.concurrency.DelayableExecutor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -99,6 +101,8 @@ public abstract class AuthCredentialView extends LinearLayout {
protected int mEffectiveUserId;
protected ErrorTimer mErrorTimer;
protected @Background DelayableExecutor mBackgroundExecutor;
interface Callback {
void onCredentialMatched(byte[] attestation);
}
@@ -217,6 +221,10 @@ public abstract class AuthCredentialView extends LinearLayout {
mContainerView = containerView;
}
void setBackgroundExecutor(@Background DelayableExecutor bgExecutor) {
mBackgroundExecutor = bgExecutor;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
@@ -377,27 +385,33 @@ public abstract class AuthCredentialView extends LinearLayout {
}
private void showLastAttemptBeforeWipeDialog() {
final AlertDialog alertDialog = new AlertDialog.Builder(mContext)
.setTitle(R.string.biometric_dialog_last_attempt_before_wipe_dialog_title)
.setMessage(
getLastAttemptBeforeWipeMessage(getUserTypeForWipe(), mCredentialType))
.setPositiveButton(android.R.string.ok, null)
.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
alertDialog.show();
mBackgroundExecutor.execute(() -> {
final AlertDialog alertDialog = new AlertDialog.Builder(mContext)
.setTitle(R.string.biometric_dialog_last_attempt_before_wipe_dialog_title)
.setMessage(
getLastAttemptBeforeWipeMessage(getUserTypeForWipe(), mCredentialType))
.setPositiveButton(android.R.string.ok, null)
.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
mHandler.post(alertDialog::show);
});
}
private void showNowWipingDialog() {
final AlertDialog alertDialog = new AlertDialog.Builder(mContext)
.setMessage(getNowWipingMessage(getUserTypeForWipe()))
.setPositiveButton(
com.android.settingslib.R.string.failed_attempts_now_wiping_dialog_dismiss,
null /* OnClickListener */)
.setOnDismissListener(
dialog -> mContainerView.animateAway(AuthDialogCallback.DISMISSED_ERROR))
.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
alertDialog.show();
mBackgroundExecutor.execute(() -> {
String nowWipingMessage = getNowWipingMessage(getUserTypeForWipe());
final AlertDialog alertDialog = new AlertDialog.Builder(mContext)
.setMessage(nowWipingMessage)
.setPositiveButton(
com.android.settingslib.R.string.failed_attempts_now_wiping_dialog_dismiss,
null /* OnClickListener */)
.setOnDismissListener(
dialog -> mContainerView.animateAway(
AuthDialogCallback.DISMISSED_ERROR))
.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
mHandler.post(alertDialog::show);
});
}
private @UserType int getUserTypeForWipe() {
@@ -412,6 +426,7 @@ public abstract class AuthCredentialView extends LinearLayout {
}
}
// This should not be called on the main thread to avoid making an IPC.
private String getLastAttemptBeforeWipeMessage(
@UserType int userType, @Utils.CredentialType int credentialType) {
switch (userType) {
@@ -442,6 +457,7 @@ public abstract class AuthCredentialView extends LinearLayout {
}
}
// This should not be called on the main thread to avoid making an IPC.
private String getLastAttemptBeforeWipeProfileMessage(
@Utils.CredentialType int credentialType) {
return mDevicePolicyManager.getResources().getString(

View File

@@ -143,9 +143,10 @@ class QSSecurityFooter extends ViewController<View>
@Inject
QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView,
UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter,
SecurityController securityController, DialogLaunchAnimator dialogLaunchAnimator,
@Background Looper bgLooper, BroadcastDispatcher broadcastDispatcher) {
UserTracker userTracker, @Main Handler mainHandler,
ActivityStarter activityStarter, SecurityController securityController,
DialogLaunchAnimator dialogLaunchAnimator, @Background Looper bgLooper,
BroadcastDispatcher broadcastDispatcher) {
super(rootView);
mFooterText = mView.findViewById(R.id.footer_text);
mPrimaryFooterIcon = mView.findViewById(R.id.primary_footer_icon);
@@ -493,21 +494,23 @@ class QSSecurityFooter extends ViewController<View>
private void createDialog() {
mShouldUseSettingsButton.set(false);
final View view = createDialogView();
mMainHandler.post(() -> {
mDialog = new SystemUIDialog(mContext, 0); // Use mContext theme
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
mShouldUseSettingsButton.get() ? getSettingsButton() : getNegativeButton(),
this);
mHandler.post(() -> {
String settingsButtonText = getSettingsButton();
final View view = createDialogView();
mMainHandler.post(() -> {
mDialog = new SystemUIDialog(mContext, 0); // Use mContext theme
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, mShouldUseSettingsButton.get()
? settingsButtonText : getNegativeButton(), this);
mDialog.setView(view);
if (mView.isAggregatedVisible()) {
mDialogLaunchAnimator.showFromView(mDialog, mView);
} else {
mDialog.show();
}
mDialog.setView(view);
if (mView.isAggregatedVisible()) {
mDialogLaunchAnimator.showFromView(mDialog, mView);
} else {
mDialog.show();
}
});
});
}
@@ -650,6 +653,7 @@ class QSSecurityFooter extends ViewController<View>
}
}
// This should not be called on the main thread to avoid making an IPC.
@VisibleForTesting
String getSettingsButton() {
return mDpm.getResources().getString(

View File

@@ -292,9 +292,7 @@ public class PhoneStatusBarPolicy
mIconController.setIconVisibility(mSlotHotspot, mHotspot.isHotspotEnabled());
// managed profile
mIconController.setIcon(mSlotManagedProfile, R.drawable.stat_sys_managed_profile_status,
getManagedProfileAccessibilityString());
mIconController.setIconVisibility(mSlotManagedProfile, mManagedProfileIconVisible);
updateManagedProfile();
// data saver
mIconController.setIcon(mSlotDataSaver, R.drawable.stat_sys_data_saver,
@@ -521,7 +519,7 @@ public class PhoneStatusBarPolicy
}
private void updateManagedProfile() {
// getLastResumedActivityUserId needds to acquire the AM lock, which may be contended in
// getLastResumedActivityUserId needs to acquire the AM lock, which may be contended in
// some cases. Since it doesn't really matter here whether it's updated in this frame
// or in the next one, we call this method from our UI offload thread.
mUiBgExecutor.execute(() -> {
@@ -529,6 +527,7 @@ public class PhoneStatusBarPolicy
try {
userId = ActivityTaskManager.getService().getLastResumedActivityUserId();
boolean isManagedProfile = mUserManager.isManagedProfile(userId);
String accessibilityString = getManagedProfileAccessibilityString();
mHandler.post(() -> {
final boolean showIcon;
if (isManagedProfile && (!mKeyguardStateController.isShowing()
@@ -536,7 +535,7 @@ public class PhoneStatusBarPolicy
showIcon = true;
mIconController.setIcon(mSlotManagedProfile,
R.drawable.stat_sys_managed_profile_status,
getManagedProfileAccessibilityString());
accessibilityString);
} else {
showIcon = false;
}

View File

@@ -40,6 +40,9 @@ import com.android.internal.widget.LockPatternUtils
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Rule
@@ -314,7 +317,8 @@ class AuthContainerViewTest : SysuiTestCase() {
wakefulnessLifecycle,
userManager,
lockPatternUtils,
Handler(TestableLooper.get(this).looper)
Handler(TestableLooper.get(this).looper),
FakeExecutor(FakeSystemClock())
)
if (addToView) {
@@ -331,10 +335,11 @@ class AuthContainerViewTest : SysuiTestCase() {
wakefulnessLifecycle: WakefulnessLifecycle,
userManager: UserManager,
lockPatternUtils: LockPatternUtils,
mainHandler: Handler
mainHandler: Handler,
bgExecutor: DelayableExecutor
) : AuthContainerView(
config, fpProps, faceProps,
wakefulnessLifecycle, userManager, lockPatternUtils, mainHandler
wakefulnessLifecycle, userManager, lockPatternUtils, mainHandler, bgExecutor
) {
override fun postOnAnimation(runnable: Runnable) {
runnable.run()

View File

@@ -80,8 +80,11 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.Execution;
import com.android.systemui.util.concurrency.FakeExecution;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
import org.junit.Rule;
@@ -156,6 +159,7 @@ public class AuthControllerTest extends SysuiTestCase {
private Execution mExecution;
private TestableLooper mTestableLooper;
private Handler mHandler;
private DelayableExecutor mBackgroundExecutor;
private TestableAuthController mAuthController;
@Before
@@ -164,6 +168,7 @@ public class AuthControllerTest extends SysuiTestCase {
mExecution = new FakeExecution();
mTestableLooper = TestableLooper.get(this);
mHandler = new Handler(mTestableLooper.getLooper());
mBackgroundExecutor = new FakeExecutor(new FakeSystemClock());
when(mContextSpy.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE))
@@ -759,11 +764,12 @@ public class AuthControllerTest extends SysuiTestCase {
super(context, execution, commandQueue, activityTaskManager, windowManager,
fingerprintManager, faceManager, udfpsControllerFactory,
sidefpsControllerFactory, mDisplayManager, mWakefulnessLifecycle,
mUserManager, mLockPatternUtils, statusBarStateController, mHandler);
mUserManager, mLockPatternUtils, statusBarStateController, mHandler,
mBackgroundExecutor);
}
@Override
protected AuthDialog buildDialog(PromptInfo promptInfo,
protected AuthDialog buildDialog(DelayableExecutor bgExecutor, PromptInfo promptInfo,
boolean requireConfirmation, int userId, int[] sensorIds,
String opPackageName, boolean skipIntro, long operationId, long requestId,
@BiometricManager.BiometricMultiSensorMode int multiSensorConfig,