Merge "Ensure unlock icon animates" into sc-v2-dev am: b0e7bac136
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16018876 Change-Id: I4f94aebb5e37999b8a7258f432683a0faff92ae9
This commit is contained in:
@@ -265,7 +265,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
boolean wasShowingUnlockIcon = mShowUnlockIcon;
|
boolean wasShowingUnlockIcon = mShowUnlockIcon;
|
||||||
mShowLockIcon = !mCanDismissLockScreen && !mUserUnlockedWithBiometric && isLockScreen()
|
mShowLockIcon = !mCanDismissLockScreen && !mUserUnlockedWithBiometric && isLockScreen()
|
||||||
&& (!mUdfpsEnrolled || !mRunningFPS);
|
&& (!mUdfpsEnrolled || !mRunningFPS);
|
||||||
mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
|
mShowUnlockIcon = (mCanDismissLockScreen || mUserUnlockedWithBiometric) && isLockScreen();
|
||||||
mShowAODFpIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS;
|
mShowAODFpIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS;
|
||||||
|
|
||||||
final CharSequence prevContentDescription = mView.getContentDescription();
|
final CharSequence prevContentDescription = mView.getContentDescription();
|
||||||
@@ -477,13 +477,15 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
@Override
|
@Override
|
||||||
public void onBiometricRunningStateChanged(boolean running,
|
public void onBiometricRunningStateChanged(boolean running,
|
||||||
BiometricSourceType biometricSourceType) {
|
BiometricSourceType biometricSourceType) {
|
||||||
|
final boolean wasRunningFps = mRunningFPS;
|
||||||
|
final boolean wasUserUnlockedWithBiometric = mUserUnlockedWithBiometric;
|
||||||
mUserUnlockedWithBiometric =
|
mUserUnlockedWithBiometric =
|
||||||
mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(
|
mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(
|
||||||
KeyguardUpdateMonitor.getCurrentUser());
|
KeyguardUpdateMonitor.getCurrentUser());
|
||||||
|
|
||||||
if (biometricSourceType == FINGERPRINT) {
|
if (biometricSourceType == FINGERPRINT) {
|
||||||
mRunningFPS = running;
|
mRunningFPS = running;
|
||||||
if (!mRunningFPS) {
|
if (wasRunningFps && !mRunningFPS) {
|
||||||
if (mCancelDelayedUpdateVisibilityRunnable != null) {
|
if (mCancelDelayedUpdateVisibilityRunnable != null) {
|
||||||
mCancelDelayedUpdateVisibilityRunnable.run();
|
mCancelDelayedUpdateVisibilityRunnable.run();
|
||||||
}
|
}
|
||||||
@@ -493,10 +495,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
// button in this case, so we delay updating the visibility by 50ms.
|
// button in this case, so we delay updating the visibility by 50ms.
|
||||||
mCancelDelayedUpdateVisibilityRunnable =
|
mCancelDelayedUpdateVisibilityRunnable =
|
||||||
mExecutor.executeDelayed(() -> updateVisibility(), 50);
|
mExecutor.executeDelayed(() -> updateVisibility(), 50);
|
||||||
} else {
|
return;
|
||||||
updateVisibility();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wasUserUnlockedWithBiometric != mUserUnlockedWithBiometric
|
||||||
|
|| wasRunningFps != mRunningFPS) {
|
||||||
|
updateVisibility();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,18 @@ package com.android.systemui.keyguard;
|
|||||||
|
|
||||||
import static junit.framework.Assert.assertEquals;
|
import static junit.framework.Assert.assertEquals;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.anyObject;
|
||||||
import static org.mockito.Mockito.anyInt;
|
import static org.mockito.Mockito.anyInt;
|
||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
|
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||||
|
import android.hardware.biometrics.BiometricSourceType;
|
||||||
import android.hardware.biometrics.SensorLocationInternal;
|
import android.hardware.biometrics.SensorLocationInternal;
|
||||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||||
import android.os.Vibrator;
|
import android.os.Vibrator;
|
||||||
@@ -39,15 +43,18 @@ import android.view.accessibility.AccessibilityManager;
|
|||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||||
|
import com.android.keyguard.KeyguardUpdateMonitorCallback;
|
||||||
import com.android.keyguard.KeyguardViewController;
|
import com.android.keyguard.KeyguardViewController;
|
||||||
import com.android.keyguard.LockIconView;
|
import com.android.keyguard.LockIconView;
|
||||||
import com.android.keyguard.LockIconViewController;
|
import com.android.keyguard.LockIconViewController;
|
||||||
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.biometrics.AuthController;
|
import com.android.systemui.biometrics.AuthController;
|
||||||
import com.android.systemui.biometrics.AuthRippleController;
|
import com.android.systemui.biometrics.AuthRippleController;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
|
import com.android.systemui.statusbar.StatusBarState;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
import com.android.systemui.util.concurrency.DelayableExecutor;
|
import com.android.systemui.util.concurrency.DelayableExecutor;
|
||||||
@@ -69,7 +76,10 @@ import java.util.List;
|
|||||||
@RunWith(AndroidTestingRunner.class)
|
@RunWith(AndroidTestingRunner.class)
|
||||||
@TestableLooper.RunWithLooper
|
@TestableLooper.RunWithLooper
|
||||||
public class LockIconViewControllerTest extends SysuiTestCase {
|
public class LockIconViewControllerTest extends SysuiTestCase {
|
||||||
|
private static final String UNLOCKED_LABEL = "unlocked";
|
||||||
|
|
||||||
private @Mock LockIconView mLockIconView;
|
private @Mock LockIconView mLockIconView;
|
||||||
|
private @Mock AnimatedVectorDrawable mIconDrawable;
|
||||||
private @Mock Context mContext;
|
private @Mock Context mContext;
|
||||||
private @Mock Resources mResources;
|
private @Mock Resources mResources;
|
||||||
private @Mock DisplayMetrics mDisplayMetrics;
|
private @Mock DisplayMetrics mDisplayMetrics;
|
||||||
@@ -97,6 +107,11 @@ public class LockIconViewControllerTest extends SysuiTestCase {
|
|||||||
@Captor private ArgumentCaptor<AuthController.Callback> mAuthControllerCallbackCaptor;
|
@Captor private ArgumentCaptor<AuthController.Callback> mAuthControllerCallbackCaptor;
|
||||||
private AuthController.Callback mAuthControllerCallback;
|
private AuthController.Callback mAuthControllerCallback;
|
||||||
|
|
||||||
|
@Captor private ArgumentCaptor<KeyguardUpdateMonitorCallback>
|
||||||
|
mKeyguardUpdateMonitorCallbackCaptor =
|
||||||
|
ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
|
||||||
|
private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
|
||||||
|
|
||||||
@Captor private ArgumentCaptor<PointF> mPointCaptor;
|
@Captor private ArgumentCaptor<PointF> mPointCaptor;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -108,6 +123,13 @@ public class LockIconViewControllerTest extends SysuiTestCase {
|
|||||||
when(mContext.getResources()).thenReturn(mResources);
|
when(mContext.getResources()).thenReturn(mResources);
|
||||||
when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
|
when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
|
||||||
when(mLockIconView.findViewById(anyInt())).thenReturn(mAodFp);
|
when(mLockIconView.findViewById(anyInt())).thenReturn(mAodFp);
|
||||||
|
when(mResources.getString(R.string.accessibility_unlock_button)).thenReturn(UNLOCKED_LABEL);
|
||||||
|
when(mResources.getDrawable(anyInt(), anyObject())).thenReturn(mIconDrawable);
|
||||||
|
|
||||||
|
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
||||||
|
when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
|
||||||
|
when(mStatusBarStateController.isDozing()).thenReturn(false);
|
||||||
|
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
|
||||||
|
|
||||||
mLockIconViewController = new LockIconViewController(
|
mLockIconViewController = new LockIconViewController(
|
||||||
mLockIconView,
|
mLockIconView,
|
||||||
@@ -192,6 +214,29 @@ public class LockIconViewControllerTest extends SysuiTestCase {
|
|||||||
verify(mLockIconView).setUseBackground(false);
|
verify(mLockIconView).setUseBackground(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnlockIconShows_biometricUnlockedTrue() {
|
||||||
|
// GIVEN UDFPS sensor location is available
|
||||||
|
setupUdfps();
|
||||||
|
|
||||||
|
// GIVEN lock icon controller is initialized and view is attached
|
||||||
|
mLockIconViewController.init();
|
||||||
|
captureAttachListener();
|
||||||
|
mAttachListener.onViewAttachedToWindow(mLockIconView);
|
||||||
|
captureKeyguardUpdateMonitorCallback();
|
||||||
|
|
||||||
|
// GIVEN user has unlocked with a biometric auth (ie: face auth)
|
||||||
|
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
|
||||||
|
reset(mLockIconView);
|
||||||
|
|
||||||
|
// WHEN face auth's biometric running state changes
|
||||||
|
mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
|
||||||
|
BiometricSourceType.FACE);
|
||||||
|
|
||||||
|
// THEN the unlock icon is shown
|
||||||
|
verify(mLockIconView).setContentDescription(UNLOCKED_LABEL);
|
||||||
|
}
|
||||||
|
|
||||||
private Pair<Integer, PointF> setupUdfps() {
|
private Pair<Integer, PointF> setupUdfps() {
|
||||||
final PointF udfpsLocation = new PointF(50, 75);
|
final PointF udfpsLocation = new PointF(50, 75);
|
||||||
final int radius = 33;
|
final int radius = 33;
|
||||||
@@ -220,4 +265,10 @@ public class LockIconViewControllerTest extends SysuiTestCase {
|
|||||||
verify(mLockIconView).addOnAttachStateChangeListener(mAttachCaptor.capture());
|
verify(mLockIconView).addOnAttachStateChangeListener(mAttachCaptor.capture());
|
||||||
mAttachListener = mAttachCaptor.getValue();
|
mAttachListener = mAttachCaptor.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void captureKeyguardUpdateMonitorCallback() {
|
||||||
|
verify(mKeyguardUpdateMonitor).registerCallback(
|
||||||
|
mKeyguardUpdateMonitorCallbackCaptor.capture());
|
||||||
|
mKeyguardUpdateMonitorCallback = mKeyguardUpdateMonitorCallbackCaptor.getValue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user