diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index d9b290267c96a..03a7b3da6251a 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1369,7 +1369,7 @@ public class LockPatternUtils { public void registerStrongAuthTracker(final StrongAuthTracker strongAuthTracker) { try { - getLockSettings().registerStrongAuthTracker(strongAuthTracker.mStub); + getLockSettings().registerStrongAuthTracker(strongAuthTracker.getStub()); } catch (RemoteException e) { throw new RuntimeException("Could not register StrongAuthTracker"); } @@ -1377,7 +1377,7 @@ public class LockPatternUtils { public void unregisterStrongAuthTracker(final StrongAuthTracker strongAuthTracker) { try { - getLockSettings().unregisterStrongAuthTracker(strongAuthTracker.mStub); + getLockSettings().unregisterStrongAuthTracker(strongAuthTracker.getStub()); } catch (RemoteException e) { Log.e(TAG, "Could not unregister StrongAuthTracker", e); } @@ -1740,7 +1740,7 @@ public class LockPatternUtils { } } - protected final IStrongAuthTracker.Stub mStub = new IStrongAuthTracker.Stub() { + private final IStrongAuthTracker.Stub mStub = new IStrongAuthTracker.Stub() { @Override public void onStrongAuthRequiredChanged(@StrongAuthFlags int strongAuthFlags, int userId) { @@ -1755,6 +1755,10 @@ public class LockPatternUtils { } }; + public IStrongAuthTracker.Stub getStub() { + return mStub; + } + private class H extends Handler { static final int MSG_ON_STRONG_AUTH_REQUIRED_CHANGED = 1; static final int MSG_ON_IS_NON_STRONG_BIOMETRIC_ALLOWED_CHANGED = 2; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f771cc6796363..0db713e9c2761 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -33,6 +33,7 @@ import static com.android.systemui.DejankUtils.whitelistIpcs; import android.annotation.AnyThread; import android.annotation.MainThread; +import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.AlarmManager; @@ -247,8 +248,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // Battery status private BatteryStatus mBatteryStatus; - @VisibleForTesting - protected StrongAuthTracker mStrongAuthTracker; + private StrongAuthTracker mStrongAuthTracker; private final ArrayList> mCallbacks = Lists.newArrayList(); @@ -1512,6 +1512,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mUserTrustIsUsuallyManaged.delete(userId); } + @VisibleForTesting + protected void setStrongAuthTracker(@NonNull StrongAuthTracker tracker) { + if (mStrongAuthTracker != null) { + mLockPatternUtils.unregisterStrongAuthTracker(mStrongAuthTracker); + } + + mStrongAuthTracker = tracker; + mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker); + } + private void registerRingerTracker() { mRingerModeTracker.getRingerMode().observeForever(mRingerModeObserver); } @@ -1525,7 +1535,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab DumpManager dumpManager, RingerModeTracker ringerModeTracker, @Background Executor backgroundExecutor, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + LockPatternUtils lockPatternUtils) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); @@ -1534,6 +1545,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mBroadcastDispatcher = broadcastDispatcher; mRingerModeTracker = ringerModeTracker; mStatusBarStateController = statusBarStateController; + mLockPatternUtils = lockPatternUtils; dumpManager.registerDumpable(getClass().getName(), this); mHandler = new Handler(mainLooper) { @@ -1702,8 +1714,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mTrustManager = context.getSystemService(TrustManager.class); mTrustManager.registerTrustListener(this); - mLockPatternUtils = new LockPatternUtils(context); - mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker); + + setStrongAuthTracker(mStrongAuthTracker); mDreamManager = IDreamManager.Stub.asInterface( ServiceManager.getService(DreamService.DREAM_SERVICE)); @@ -2847,6 +2859,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mBroadcastDispatcher.unregisterReceiver(mBroadcastAllReceiver); mRingerModeTracker.getRingerMode().removeObserver(mRingerModeObserver); + mLockPatternUtils.unregisterStrongAuthTracker(mStrongAuthTracker); + mTrustManager.unregisterTrustListener(this); + mHandler.removeCallbacksAndMessages(null); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index b5609dde37c73..7bc453ac9aa1b 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -38,6 +38,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.app.admin.DevicePolicyManager; +import android.app.trust.IStrongAuthTracker; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -72,6 +73,8 @@ import androidx.lifecycle.Observer; import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.telephony.TelephonyIntents; +import com.android.internal.widget.ILockSettings; +import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; @@ -120,6 +123,10 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private TrustManager mTrustManager; @Mock + private LockPatternUtils mLockPatternUtils; + @Mock + private ILockSettings mLockSettings; + @Mock private FingerprintManager mFingerprintManager; @Mock private FaceManager mFaceManager; @@ -169,12 +176,13 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true); when(mUserManager.isUserUnlocked(anyInt())).thenReturn(true); when(mUserManager.isPrimaryUser()).thenReturn(true); + when(mStrongAuthTracker.getStub()).thenReturn(mock(IStrongAuthTracker.Stub.class)); when(mStrongAuthTracker .isUnlockingWithBiometricAllowed(anyBoolean() /* isStrongBiometric */)) .thenReturn(true); - when(mTelephonyManager.getServiceStateForSubscriber(anyInt())) .thenReturn(new ServiceState()); + when(mLockPatternUtils.getLockSettings()).thenReturn(mLockSettings); mSpiedContext.addMockSystemService(TrustManager.class, mTrustManager); mSpiedContext.addMockSystemService(FingerprintManager.class, mFingerprintManager); mSpiedContext.addMockSystemService(BiometricManager.class, mBiometricManager); @@ -729,8 +737,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(), mBroadcastDispatcher, mDumpManager, - mRingerModeTracker, mBackgroundExecutor, mStatusBarStateController); - mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker; + mRingerModeTracker, mBackgroundExecutor, + mStatusBarStateController, mLockPatternUtils); + setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); } public boolean hasSimStateJustChanged() { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index ac982dd86d859..1a8de97714512 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -312,7 +312,7 @@ public class LockSettingsService extends ILockSettings.Stub { } void register(LockSettingsStrongAuth strongAuth) { - strongAuth.registerStrongAuthTracker(this.mStub); + strongAuth.registerStrongAuthTracker(getStub()); } }