Loading packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +60 −70 Original line number Diff line number Diff line Loading @@ -112,7 +112,6 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; Loading Loading @@ -285,6 +284,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final AuthController mAuthController; private final UiEventLogger mUiEventLogger; private final Set<Integer> mFaceAcquiredInfoIgnoreList; private final PackageManager mPackageManager; private int mStatusBarState; private final StatusBarStateController.StateListener mStatusBarStateControllerListener = new StatusBarStateController.StateListener() { Loading Loading @@ -358,9 +358,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final IDreamManager mDreamManager; private final TelephonyManager mTelephonyManager; @Nullable private FingerprintManager mFpm; private final FingerprintManager mFpm; @Nullable private FaceManager mFaceManager; private final FaceManager mFaceManager; private final LockPatternUtils mLockPatternUtils; private final boolean mWakeOnFingerprintAcquiredStart; Loading Loading @@ -740,7 +740,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * If the device is dreaming, awakens the device */ public void awakenFromDream() { if (mIsDreaming && mDreamManager != null) { if (mIsDreaming) { try { mDreamManager.awaken(); } catch (RemoteException e) { Loading Loading @@ -1121,12 +1121,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // Error is always the end of authentication lifecycle mFaceCancelSignal = null; boolean cameraPrivacyEnabled = false; if (mSensorPrivacyManager != null) { cameraPrivacyEnabled = mSensorPrivacyManager .isSensorPrivacyEnabled(SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE, SensorPrivacyManager.Sensors.CAMERA); } boolean cameraPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled( SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE, SensorPrivacyManager.Sensors.CAMERA); if (msgId == FaceManager.FACE_ERROR_CANCELED && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { Loading Loading @@ -1225,18 +1221,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private boolean isFingerprintDisabled(int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId) return (mDevicePolicyManager.getKeyguardDisabledFeatures(null, userId) & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0 || isSimPinSecure(); } private boolean isFaceDisabled(int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); // TODO(b/140035044) return whitelistIpcs(() -> dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId) return whitelistIpcs(() -> (mDevicePolicyManager.getKeyguardDisabledFeatures(null, userId) & DevicePolicyManager.KEYGUARD_DISABLE_FACE) != 0 || isSimPinSecure()); } Loading Loading @@ -1309,7 +1302,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab Intent intent = new Intent(DevicePolicyManager.ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE) .setPackage(supervisorComponent.getPackageName()); ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(intent, 0); ResolveInfo resolveInfo = mPackageManager.resolveService(intent, 0); if (resolveInfo != null && resolveInfo.serviceInfo != null) { Intent launchIntent = new Intent().setComponent(resolveInfo.serviceInfo.getComponentName()); Loading Loading @@ -1911,9 +1904,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab UiEventLogger uiEventLogger, // This has to be a provider because SessionTracker depends on KeyguardUpdateMonitor :( Provider<SessionTracker> sessionTrackerProvider, PowerManager powerManager) { PowerManager powerManager, TrustManager trustManager, SubscriptionManager subscriptionManager, UserManager userManager, IDreamManager dreamManager, DevicePolicyManager devicePolicyManager, SensorPrivacyManager sensorPrivacyManager, TelephonyManager telephonyManager, PackageManager packageManager, @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager, @Nullable BiometricManager biometricManager) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); mSubscriptionManager = subscriptionManager; mTelephonyListenerManager = telephonyListenerManager; mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged); Loading @@ -1927,12 +1931,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mLockPatternUtils = lockPatternUtils; mAuthController = authController; dumpManager.registerDumpable(getClass().getName(), this); mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class); mSensorPrivacyManager = sensorPrivacyManager; mActiveUnlockConfig = activeUnlockConfiguration; mLogger = logger; mUiEventLogger = uiEventLogger; mSessionTrackerProvider = sessionTrackerProvider; mPowerManager = powerManager; mTrustManager = trustManager; mUserManager = userManager; mDreamManager = dreamManager; mTelephonyManager = telephonyManager; mDevicePolicyManager = devicePolicyManager; mPackageManager = packageManager; mFpm = fingerprintManager; mFaceManager = faceManager; mActiveUnlockConfig.setKeyguardUpdateMonitor(this); mWakeOnFingerprintAcquiredStart = context.getResources() .getBoolean(com.android.internal.R.bool.kg_wake_on_acquire_start); Loading Loading @@ -2077,8 +2089,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // listener now with the service state from the default sub. mBackgroundExecutor.execute(() -> { int subId = SubscriptionManager.getDefaultSubscriptionId(); ServiceState serviceState = mContext.getSystemService(TelephonyManager.class) .getServiceStateForSubscriber(subId); ServiceState serviceState = mTelephonyManager.getServiceStateForSubscriber(subId); mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); }); Loading @@ -2100,25 +2111,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab e.rethrowAsRuntimeException(); } mTrustManager = context.getSystemService(TrustManager.class); mTrustManager.registerTrustListener(this); setStrongAuthTracker(mStrongAuthTracker); mDreamManager = IDreamManager.Stub.asInterface( ServiceManager.getService(DreamService.DREAM_SERVICE)); if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); if (mFpm != null) { mFingerprintSensorProperties = mFpm.getSensorPropertiesInternal(); mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback); } if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { mFaceManager = (FaceManager) context.getSystemService(Context.FACE_SERVICE); if (mFaceManager != null) { mFaceSensorProperties = mFaceManager.getSensorPropertiesInternal(); mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback); } if (mFpm != null || mFaceManager != null) { BiometricManager biometricManager = context.getSystemService(BiometricManager.class); if (biometricManager != null) { biometricManager.registerEnabledOnKeyguardCallback(mBiometricEnabledCallback); } Loading @@ -2137,19 +2143,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } }); updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE, FACE_AUTH_UPDATED_ON_KEYGUARD_INIT); if (mFpm != null) { mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback); } if (mFaceManager != null) { mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback); } TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener); mUserManager = context.getSystemService(UserManager.class); mIsPrimaryUser = mUserManager.isPrimaryUser(); int user = ActivityManager.getCurrentUser(); mUserIsUnlocked.put(user, mUserManager.isUserUnlocked(user)); mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled(); updateSecondaryLockscreenRequirement(user); List<UserInfo> allUsers = mUserManager.getUsers(); Loading @@ -2159,22 +2157,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } updateAirplaneModeState(); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (mTelephonyManager != null) { mTelephonyListenerManager.addActiveDataSubscriptionIdListener(mPhoneStateListener); // Set initial sim states values. for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) { int state = mTelephonyManager.getSimState(slot); int[] subIds = mSubscriptionManager.getSubscriptionIds(slot); if (subIds != null) { for (int subId : subIds) { mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, subId, slot, state) .sendToTarget(); } } } } initializeSimState(); mTimeFormatChangeObserver = new ContentObserver(mHandler) { @Override Loading @@ -2191,6 +2175,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab false, mTimeFormatChangeObserver, UserHandle.USER_ALL); } private void initializeSimState() { // Set initial sim states values. for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) { int state = mTelephonyManager.getSimState(slot); int[] subIds = mSubscriptionManager.getSubscriptionIds(slot); if (subIds != null) { for (int subId : subIds) { mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, subId, slot, state) .sendToTarget(); } } } } private void updateFaceEnrolled(int userId) { mIsFaceEnrolled = whitelistIpcs( () -> mFaceManager != null && mFaceManager.isHardwareDetected() Loading Loading @@ -3190,7 +3188,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return false; } Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivityAsUser(homeIntent, ResolveInfo resolveInfo = mPackageManager.resolveActivityAsUser(homeIntent, 0 /* flags */, getCurrentUser()); if (resolveInfo == null) { Loading Loading @@ -3528,10 +3526,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * @return true if and only if the state has changed for the specified {@code slotId} */ private boolean refreshSimState(int subId, int slotId) { final TelephonyManager tele = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); int state = (tele != null) ? tele.getSimState(slotId) : TelephonyManager.SIM_STATE_UNKNOWN; int state = mTelephonyManager.getSimState(slotId); SimData data = mSimDatas.get(subId); final boolean changed; if (data == null) { Loading Loading @@ -3674,13 +3669,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Unregister all listeners. */ public void destroy() { // TODO: inject these dependencies: TelephonyManager telephony = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); if (telephony != null) { mStatusBarStateController.removeCallback(mStatusBarStateControllerListener); mTelephonyListenerManager.removeActiveDataSubscriptionIdListener(mPhoneStateListener); } mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener); if (mDeviceProvisionedObserver != null) { Loading packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +22 −4 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.content.res.AssetManager; import android.content.res.Resources; import android.hardware.SensorManager; import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricManager; import android.hardware.camera2.CameraManager; import android.hardware.devicestate.DeviceStateManager; import android.hardware.display.AmbientDisplayConfiguration; Loading Loading @@ -237,23 +238,40 @@ public class FrameworkServicesModule { @Singleton static IDreamManager provideIDreamManager() { return IDreamManager.Stub.asInterface( ServiceManager.checkService(DreamService.DREAM_SERVICE)); ServiceManager.getService(DreamService.DREAM_SERVICE)); } @Provides @Singleton @Nullable static FaceManager provideFaceManager(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { return context.getSystemService(FaceManager.class); } return null; } @Provides @Singleton @Nullable static FingerprintManager providesFingerprintManager(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { return context.getSystemService(FingerprintManager.class); } return null; } /** * @return null if both faceManager and fingerprintManager are null. */ @Provides @Singleton @Nullable static BiometricManager providesBiometricManager(Context context, @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager) { return faceManager == null && fingerprintManager == null ? null : context.getSystemService(BiometricManager.class); } @Provides @Singleton Loading packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +21 −25 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; Loading @@ -79,13 +80,13 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.service.dreams.IDreamManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableContext; import android.testing.TestableLooper; import com.android.dx.mockito.inline.extended.ExtendedMockito; Loading Loading @@ -170,6 +171,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private DevicePolicyManager mDevicePolicyManager; @Mock private IDreamManager mDreamManager; @Mock private KeyguardBypassController mKeyguardBypassController; @Mock private SubscriptionManager mSubscriptionManager; Loading @@ -178,6 +181,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private TelephonyManager mTelephonyManager; @Mock private SensorPrivacyManager mSensorPrivacyManager; @Mock private StatusBarStateController mStatusBarStateController; @Mock private AuthController mAuthController; Loading Loading @@ -219,7 +224,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private TestableLooper mTestableLooper; private Handler mHandler; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; private TestableContext mSpiedContext; private MockitoSession mMockitoSession; private StatusBarStateController.StateListener mStatusBarStateListener; private IBiometricEnabledOnKeyguardCallback mBiometricEnabledOnKeyguardCallback; Loading @@ -228,9 +232,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Before public void setup() throws RemoteException { MockitoAnnotations.initMocks(this); mSpiedContext = spy(mContext); when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true); when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); when(mActivityService.getCurrentUser()).thenReturn(mCurrentUserInfo); when(mActivityService.getCurrentUserId()).thenReturn(mCurrentUserId); when(mFaceManager.isHardwareDetected()).thenReturn(true); Loading Loading @@ -279,14 +280,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { .thenReturn(new ServiceState()); when(mLockPatternUtils.getLockSettings()).thenReturn(mLockSettings); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); mSpiedContext.addMockSystemService(TrustManager.class, mTrustManager); mSpiedContext.addMockSystemService(FingerprintManager.class, mFingerprintManager); mSpiedContext.addMockSystemService(BiometricManager.class, mBiometricManager); mSpiedContext.addMockSystemService(FaceManager.class, mFaceManager); mSpiedContext.addMockSystemService(UserManager.class, mUserManager); mSpiedContext.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager); mSpiedContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager); mSpiedContext.addMockSystemService(TelephonyManager.class, mTelephonyManager); mMockitoSession = ExtendedMockito.mockitoSession() .spyStatic(SubscriptionManager.class) Loading @@ -301,7 +294,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); allowTestableLooperAsMainThread(); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); verify(mBiometricManager) .registerEnabledOnKeyguardCallback(mBiometricEnabledCallbackArgCaptor.capture()); Loading Loading @@ -356,7 +349,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(mTelephonyManager.getSimState(anyInt())).thenReturn(state); when(mSubscriptionManager.getSubscriptionIds(anyInt())).thenReturn(new int[]{subId}); KeyguardUpdateMonitor testKUM = new TestableKeyguardUpdateMonitor(mSpiedContext); KeyguardUpdateMonitor testKUM = new TestableKeyguardUpdateMonitor(mContext); mTestableLooper.processAllMessages(); Loading Loading @@ -1202,9 +1195,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void testShouldListenForFace_whenFaceManagerNotAvailable_returnsFalse() { cleanupKeyguardUpdateMonitor(); mSpiedContext.addMockSystemService(FaceManager.class, null); when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE)).thenReturn(false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mFaceManager = null; mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse(); } Loading Loading @@ -1258,7 +1251,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // This disables face auth when(mUserManager.isPrimaryUser()).thenReturn(false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); new TestableKeyguardUpdateMonitor(mContext); // Face auth should run when the following is true. keyguardNotGoingAway(); Loading Loading @@ -1527,15 +1520,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { verify(mHandler, times(1)).removeCallbacks(mKeyguardUpdateMonitor.mFpCancelNotReceived); mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(anyBoolean())).isEqualTo(true); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isEqualTo(true); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(true); } @Test public void testFingerAcquired_wakesUpPowerManager() { cleanupKeyguardUpdateMonitor(); mSpiedContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.kg_wake_on_acquire_start, true); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); fingerprintAcquireStart(); verify(mPowerManager).wakeUp(anyLong(), anyInt(), anyString()); Loading @@ -1544,9 +1538,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void testFingerAcquired_doesNotWakeUpPowerManager() { cleanupKeyguardUpdateMonitor(); mSpiedContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.kg_wake_on_acquire_start, false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); fingerprintAcquireStart(); verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString()); Loading Loading @@ -1716,7 +1710,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mAuthController, mTelephonyListenerManager, mInteractionJankMonitor, mLatencyTracker, mActiveUnlockConfig, mKeyguardUpdateMonitorLogger, mUiEventLogger, () -> mSessionTracker, mPowerManager); mPowerManager, mTrustManager, mSubscriptionManager, mUserManager, mDreamManager, mDevicePolicyManager, mSensorPrivacyManager, mTelephonyManager, mPackageManager, mFaceManager, mFingerprintManager, mBiometricManager); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); } Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +60 −70 Original line number Diff line number Diff line Loading @@ -112,7 +112,6 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; Loading Loading @@ -285,6 +284,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final AuthController mAuthController; private final UiEventLogger mUiEventLogger; private final Set<Integer> mFaceAcquiredInfoIgnoreList; private final PackageManager mPackageManager; private int mStatusBarState; private final StatusBarStateController.StateListener mStatusBarStateControllerListener = new StatusBarStateController.StateListener() { Loading Loading @@ -358,9 +358,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final IDreamManager mDreamManager; private final TelephonyManager mTelephonyManager; @Nullable private FingerprintManager mFpm; private final FingerprintManager mFpm; @Nullable private FaceManager mFaceManager; private final FaceManager mFaceManager; private final LockPatternUtils mLockPatternUtils; private final boolean mWakeOnFingerprintAcquiredStart; Loading Loading @@ -740,7 +740,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * If the device is dreaming, awakens the device */ public void awakenFromDream() { if (mIsDreaming && mDreamManager != null) { if (mIsDreaming) { try { mDreamManager.awaken(); } catch (RemoteException e) { Loading Loading @@ -1121,12 +1121,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // Error is always the end of authentication lifecycle mFaceCancelSignal = null; boolean cameraPrivacyEnabled = false; if (mSensorPrivacyManager != null) { cameraPrivacyEnabled = mSensorPrivacyManager .isSensorPrivacyEnabled(SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE, SensorPrivacyManager.Sensors.CAMERA); } boolean cameraPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled( SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE, SensorPrivacyManager.Sensors.CAMERA); if (msgId == FaceManager.FACE_ERROR_CANCELED && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { Loading Loading @@ -1225,18 +1221,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private boolean isFingerprintDisabled(int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId) return (mDevicePolicyManager.getKeyguardDisabledFeatures(null, userId) & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0 || isSimPinSecure(); } private boolean isFaceDisabled(int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); // TODO(b/140035044) return whitelistIpcs(() -> dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId) return whitelistIpcs(() -> (mDevicePolicyManager.getKeyguardDisabledFeatures(null, userId) & DevicePolicyManager.KEYGUARD_DISABLE_FACE) != 0 || isSimPinSecure()); } Loading Loading @@ -1309,7 +1302,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab Intent intent = new Intent(DevicePolicyManager.ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE) .setPackage(supervisorComponent.getPackageName()); ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(intent, 0); ResolveInfo resolveInfo = mPackageManager.resolveService(intent, 0); if (resolveInfo != null && resolveInfo.serviceInfo != null) { Intent launchIntent = new Intent().setComponent(resolveInfo.serviceInfo.getComponentName()); Loading Loading @@ -1911,9 +1904,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab UiEventLogger uiEventLogger, // This has to be a provider because SessionTracker depends on KeyguardUpdateMonitor :( Provider<SessionTracker> sessionTrackerProvider, PowerManager powerManager) { PowerManager powerManager, TrustManager trustManager, SubscriptionManager subscriptionManager, UserManager userManager, IDreamManager dreamManager, DevicePolicyManager devicePolicyManager, SensorPrivacyManager sensorPrivacyManager, TelephonyManager telephonyManager, PackageManager packageManager, @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager, @Nullable BiometricManager biometricManager) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); mSubscriptionManager = subscriptionManager; mTelephonyListenerManager = telephonyListenerManager; mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged); Loading @@ -1927,12 +1931,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mLockPatternUtils = lockPatternUtils; mAuthController = authController; dumpManager.registerDumpable(getClass().getName(), this); mSensorPrivacyManager = context.getSystemService(SensorPrivacyManager.class); mSensorPrivacyManager = sensorPrivacyManager; mActiveUnlockConfig = activeUnlockConfiguration; mLogger = logger; mUiEventLogger = uiEventLogger; mSessionTrackerProvider = sessionTrackerProvider; mPowerManager = powerManager; mTrustManager = trustManager; mUserManager = userManager; mDreamManager = dreamManager; mTelephonyManager = telephonyManager; mDevicePolicyManager = devicePolicyManager; mPackageManager = packageManager; mFpm = fingerprintManager; mFaceManager = faceManager; mActiveUnlockConfig.setKeyguardUpdateMonitor(this); mWakeOnFingerprintAcquiredStart = context.getResources() .getBoolean(com.android.internal.R.bool.kg_wake_on_acquire_start); Loading Loading @@ -2077,8 +2089,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // listener now with the service state from the default sub. mBackgroundExecutor.execute(() -> { int subId = SubscriptionManager.getDefaultSubscriptionId(); ServiceState serviceState = mContext.getSystemService(TelephonyManager.class) .getServiceStateForSubscriber(subId); ServiceState serviceState = mTelephonyManager.getServiceStateForSubscriber(subId); mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); }); Loading @@ -2100,25 +2111,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab e.rethrowAsRuntimeException(); } mTrustManager = context.getSystemService(TrustManager.class); mTrustManager.registerTrustListener(this); setStrongAuthTracker(mStrongAuthTracker); mDreamManager = IDreamManager.Stub.asInterface( ServiceManager.getService(DreamService.DREAM_SERVICE)); if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); if (mFpm != null) { mFingerprintSensorProperties = mFpm.getSensorPropertiesInternal(); mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback); } if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { mFaceManager = (FaceManager) context.getSystemService(Context.FACE_SERVICE); if (mFaceManager != null) { mFaceSensorProperties = mFaceManager.getSensorPropertiesInternal(); mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback); } if (mFpm != null || mFaceManager != null) { BiometricManager biometricManager = context.getSystemService(BiometricManager.class); if (biometricManager != null) { biometricManager.registerEnabledOnKeyguardCallback(mBiometricEnabledCallback); } Loading @@ -2137,19 +2143,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } }); updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE, FACE_AUTH_UPDATED_ON_KEYGUARD_INIT); if (mFpm != null) { mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback); } if (mFaceManager != null) { mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback); } TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener); mUserManager = context.getSystemService(UserManager.class); mIsPrimaryUser = mUserManager.isPrimaryUser(); int user = ActivityManager.getCurrentUser(); mUserIsUnlocked.put(user, mUserManager.isUserUnlocked(user)); mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled(); updateSecondaryLockscreenRequirement(user); List<UserInfo> allUsers = mUserManager.getUsers(); Loading @@ -2159,22 +2157,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } updateAirplaneModeState(); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (mTelephonyManager != null) { mTelephonyListenerManager.addActiveDataSubscriptionIdListener(mPhoneStateListener); // Set initial sim states values. for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) { int state = mTelephonyManager.getSimState(slot); int[] subIds = mSubscriptionManager.getSubscriptionIds(slot); if (subIds != null) { for (int subId : subIds) { mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, subId, slot, state) .sendToTarget(); } } } } initializeSimState(); mTimeFormatChangeObserver = new ContentObserver(mHandler) { @Override Loading @@ -2191,6 +2175,20 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab false, mTimeFormatChangeObserver, UserHandle.USER_ALL); } private void initializeSimState() { // Set initial sim states values. for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) { int state = mTelephonyManager.getSimState(slot); int[] subIds = mSubscriptionManager.getSubscriptionIds(slot); if (subIds != null) { for (int subId : subIds) { mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, subId, slot, state) .sendToTarget(); } } } } private void updateFaceEnrolled(int userId) { mIsFaceEnrolled = whitelistIpcs( () -> mFaceManager != null && mFaceManager.isHardwareDetected() Loading Loading @@ -3190,7 +3188,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return false; } Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivityAsUser(homeIntent, ResolveInfo resolveInfo = mPackageManager.resolveActivityAsUser(homeIntent, 0 /* flags */, getCurrentUser()); if (resolveInfo == null) { Loading Loading @@ -3528,10 +3526,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * @return true if and only if the state has changed for the specified {@code slotId} */ private boolean refreshSimState(int subId, int slotId) { final TelephonyManager tele = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); int state = (tele != null) ? tele.getSimState(slotId) : TelephonyManager.SIM_STATE_UNKNOWN; int state = mTelephonyManager.getSimState(slotId); SimData data = mSimDatas.get(subId); final boolean changed; if (data == null) { Loading Loading @@ -3674,13 +3669,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * Unregister all listeners. */ public void destroy() { // TODO: inject these dependencies: TelephonyManager telephony = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); if (telephony != null) { mStatusBarStateController.removeCallback(mStatusBarStateControllerListener); mTelephonyListenerManager.removeActiveDataSubscriptionIdListener(mPhoneStateListener); } mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener); if (mDeviceProvisionedObserver != null) { Loading
packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +22 −4 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.content.res.AssetManager; import android.content.res.Resources; import android.hardware.SensorManager; import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricManager; import android.hardware.camera2.CameraManager; import android.hardware.devicestate.DeviceStateManager; import android.hardware.display.AmbientDisplayConfiguration; Loading Loading @@ -237,23 +238,40 @@ public class FrameworkServicesModule { @Singleton static IDreamManager provideIDreamManager() { return IDreamManager.Stub.asInterface( ServiceManager.checkService(DreamService.DREAM_SERVICE)); ServiceManager.getService(DreamService.DREAM_SERVICE)); } @Provides @Singleton @Nullable static FaceManager provideFaceManager(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { return context.getSystemService(FaceManager.class); } return null; } @Provides @Singleton @Nullable static FingerprintManager providesFingerprintManager(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { return context.getSystemService(FingerprintManager.class); } return null; } /** * @return null if both faceManager and fingerprintManager are null. */ @Provides @Singleton @Nullable static BiometricManager providesBiometricManager(Context context, @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager) { return faceManager == null && fingerprintManager == null ? null : context.getSystemService(BiometricManager.class); } @Provides @Singleton Loading
packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +21 −25 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.hardware.SensorPrivacyManager; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; Loading @@ -79,13 +80,13 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.service.dreams.IDreamManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableContext; import android.testing.TestableLooper; import com.android.dx.mockito.inline.extended.ExtendedMockito; Loading Loading @@ -170,6 +171,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private DevicePolicyManager mDevicePolicyManager; @Mock private IDreamManager mDreamManager; @Mock private KeyguardBypassController mKeyguardBypassController; @Mock private SubscriptionManager mSubscriptionManager; Loading @@ -178,6 +181,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private TelephonyManager mTelephonyManager; @Mock private SensorPrivacyManager mSensorPrivacyManager; @Mock private StatusBarStateController mStatusBarStateController; @Mock private AuthController mAuthController; Loading Loading @@ -219,7 +224,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private TestableLooper mTestableLooper; private Handler mHandler; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; private TestableContext mSpiedContext; private MockitoSession mMockitoSession; private StatusBarStateController.StateListener mStatusBarStateListener; private IBiometricEnabledOnKeyguardCallback mBiometricEnabledOnKeyguardCallback; Loading @@ -228,9 +232,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Before public void setup() throws RemoteException { MockitoAnnotations.initMocks(this); mSpiedContext = spy(mContext); when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true); when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); when(mActivityService.getCurrentUser()).thenReturn(mCurrentUserInfo); when(mActivityService.getCurrentUserId()).thenReturn(mCurrentUserId); when(mFaceManager.isHardwareDetected()).thenReturn(true); Loading Loading @@ -279,14 +280,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { .thenReturn(new ServiceState()); when(mLockPatternUtils.getLockSettings()).thenReturn(mLockSettings); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); mSpiedContext.addMockSystemService(TrustManager.class, mTrustManager); mSpiedContext.addMockSystemService(FingerprintManager.class, mFingerprintManager); mSpiedContext.addMockSystemService(BiometricManager.class, mBiometricManager); mSpiedContext.addMockSystemService(FaceManager.class, mFaceManager); mSpiedContext.addMockSystemService(UserManager.class, mUserManager); mSpiedContext.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager); mSpiedContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager); mSpiedContext.addMockSystemService(TelephonyManager.class, mTelephonyManager); mMockitoSession = ExtendedMockito.mockitoSession() .spyStatic(SubscriptionManager.class) Loading @@ -301,7 +294,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); allowTestableLooperAsMainThread(); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); verify(mBiometricManager) .registerEnabledOnKeyguardCallback(mBiometricEnabledCallbackArgCaptor.capture()); Loading Loading @@ -356,7 +349,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(mTelephonyManager.getSimState(anyInt())).thenReturn(state); when(mSubscriptionManager.getSubscriptionIds(anyInt())).thenReturn(new int[]{subId}); KeyguardUpdateMonitor testKUM = new TestableKeyguardUpdateMonitor(mSpiedContext); KeyguardUpdateMonitor testKUM = new TestableKeyguardUpdateMonitor(mContext); mTestableLooper.processAllMessages(); Loading Loading @@ -1202,9 +1195,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void testShouldListenForFace_whenFaceManagerNotAvailable_returnsFalse() { cleanupKeyguardUpdateMonitor(); mSpiedContext.addMockSystemService(FaceManager.class, null); when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE)).thenReturn(false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mFaceManager = null; mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); assertThat(mKeyguardUpdateMonitor.shouldListenForFace()).isFalse(); } Loading Loading @@ -1258,7 +1251,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { // This disables face auth when(mUserManager.isPrimaryUser()).thenReturn(false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); new TestableKeyguardUpdateMonitor(mContext); // Face auth should run when the following is true. keyguardNotGoingAway(); Loading Loading @@ -1527,15 +1520,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { verify(mHandler, times(1)).removeCallbacks(mKeyguardUpdateMonitor.mFpCancelNotReceived); mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(anyBoolean())).isEqualTo(true); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(false)).isEqualTo(true); assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(true); } @Test public void testFingerAcquired_wakesUpPowerManager() { cleanupKeyguardUpdateMonitor(); mSpiedContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.kg_wake_on_acquire_start, true); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); fingerprintAcquireStart(); verify(mPowerManager).wakeUp(anyLong(), anyInt(), anyString()); Loading @@ -1544,9 +1538,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void testFingerAcquired_doesNotWakeUpPowerManager() { cleanupKeyguardUpdateMonitor(); mSpiedContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.kg_wake_on_acquire_start, false); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mContext); fingerprintAcquireStart(); verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString()); Loading Loading @@ -1716,7 +1710,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mAuthController, mTelephonyListenerManager, mInteractionJankMonitor, mLatencyTracker, mActiveUnlockConfig, mKeyguardUpdateMonitorLogger, mUiEventLogger, () -> mSessionTracker, mPowerManager); mPowerManager, mTrustManager, mSubscriptionManager, mUserManager, mDreamManager, mDevicePolicyManager, mSensorPrivacyManager, mTelephonyManager, mPackageManager, mFaceManager, mFingerprintManager, mBiometricManager); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); } Loading