Merge "Prevent lock icon a11y when unlocking." into udc-dev

This commit is contained in:
Treehugger Robot
2023-07-06 04:16:11 +00:00
committed by Android (Google) Code Review
3 changed files with 89 additions and 3 deletions

View File

@@ -62,6 +62,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.keyguard.shared.model.TransitionStep;
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;
@@ -112,6 +113,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@NonNull private final VibratorHelper mVibrator; @NonNull private final VibratorHelper mVibrator;
@Nullable private final AuthRippleController mAuthRippleController; @Nullable private final AuthRippleController mAuthRippleController;
@NonNull private final FeatureFlags mFeatureFlags; @NonNull private final FeatureFlags mFeatureFlags;
@NonNull private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
@NonNull private final KeyguardTransitionInteractor mTransitionInteractor; @NonNull private final KeyguardTransitionInteractor mTransitionInteractor;
@NonNull private final KeyguardInteractor mKeyguardInteractor; @NonNull private final KeyguardInteractor mKeyguardInteractor;
@@ -180,7 +182,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@NonNull @Main Resources resources, @NonNull @Main Resources resources,
@NonNull KeyguardTransitionInteractor transitionInteractor, @NonNull KeyguardTransitionInteractor transitionInteractor,
@NonNull KeyguardInteractor keyguardInteractor, @NonNull KeyguardInteractor keyguardInteractor,
@NonNull FeatureFlags featureFlags @NonNull FeatureFlags featureFlags,
PrimaryBouncerInteractor primaryBouncerInteractor
) { ) {
super(view); super(view);
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
@@ -197,6 +200,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mTransitionInteractor = transitionInteractor; mTransitionInteractor = transitionInteractor;
mKeyguardInteractor = keyguardInteractor; mKeyguardInteractor = keyguardInteractor;
mFeatureFlags = featureFlags; mFeatureFlags = featureFlags;
mPrimaryBouncerInteractor = primaryBouncerInteractor;
mMaxBurnInOffsetX = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x); mMaxBurnInOffsetX = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
mMaxBurnInOffsetY = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y); mMaxBurnInOffsetY = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
@@ -325,8 +329,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mView.setContentDescription(null); mView.setContentDescription(null);
} }
boolean accessibilityEnabled =
!mPrimaryBouncerInteractor.isAnimatingAway() && mView.isVisibleToUser();
mView.setImportantForAccessibility(
accessibilityEnabled ? View.IMPORTANT_FOR_ACCESSIBILITY_YES
: View.IMPORTANT_FOR_ACCESSIBILITY_NO);
if (!Objects.equals(prevContentDescription, mView.getContentDescription()) if (!Objects.equals(prevContentDescription, mView.getContentDescription())
&& mView.getContentDescription() != null && mView.isVisibleToUser()) { && mView.getContentDescription() != null && accessibilityEnabled) {
mView.announceForAccessibility(mView.getContentDescription()); mView.announceForAccessibility(mView.getContentDescription());
} }
} }

View File

@@ -48,6 +48,7 @@ import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository; import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor;
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.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
@@ -95,6 +96,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase {
protected @Mock KeyguardTransitionRepository mTransitionRepository; protected @Mock KeyguardTransitionRepository mTransitionRepository;
protected @Mock CommandQueue mCommandQueue; protected @Mock CommandQueue mCommandQueue;
protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock()); protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock());
protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor;
protected LockIconViewController mUnderTest; protected LockIconViewController mUnderTest;
@@ -167,7 +170,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase {
mFeatureFlags, mFeatureFlags,
new FakeKeyguardBouncerRepository() new FakeKeyguardBouncerRepository()
), ),
mFeatureFlags mFeatureFlags,
mPrimaryBouncerInteractor
); );
} }

View File

@@ -33,6 +33,7 @@ import android.hardware.biometrics.BiometricSourceType;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.util.Pair; import android.util.Pair;
import android.view.View;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -267,4 +268,75 @@ public class LockIconViewControllerTest extends LockIconViewControllerBaseTest {
// THEN the lock icon is shown // THEN the lock icon is shown
verify(mLockIconView).setContentDescription(LOCKED_LABEL); verify(mLockIconView).setContentDescription(LOCKED_LABEL);
} }
@Test
public void lockIconAccessibility_notVisibleToUser() {
// GIVEN lock icon controller is initialized and view is attached
init(/* useMigrationFlag= */false);
captureKeyguardStateCallback();
captureKeyguardUpdateMonitorCallback();
// GIVEN user has unlocked with a biometric auth (ie: face auth)
// and biometric running state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
BiometricSourceType.FACE);
reset(mLockIconView);
when(mLockIconView.isVisibleToUser()).thenReturn(false);
// WHEN the unlocked state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
mKeyguardStateCallback.onUnlockedChanged();
// THEN the lock icon is shown
verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
}
@Test
public void lockIconAccessibility_bouncerAnimatingAway() {
// GIVEN lock icon controller is initialized and view is attached
init(/* useMigrationFlag= */false);
captureKeyguardStateCallback();
captureKeyguardUpdateMonitorCallback();
// GIVEN user has unlocked with a biometric auth (ie: face auth)
// and biometric running state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
BiometricSourceType.FACE);
reset(mLockIconView);
when(mLockIconView.isVisibleToUser()).thenReturn(true);
when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(true);
// WHEN the unlocked state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
mKeyguardStateCallback.onUnlockedChanged();
// THEN the lock icon is shown
verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
}
@Test
public void lockIconAccessibility_bouncerNotAnimatingAway_viewVisible() {
// GIVEN lock icon controller is initialized and view is attached
init(/* useMigrationFlag= */false);
captureKeyguardStateCallback();
captureKeyguardUpdateMonitorCallback();
// GIVEN user has unlocked with a biometric auth (ie: face auth)
// and biometric running state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
BiometricSourceType.FACE);
reset(mLockIconView);
when(mLockIconView.isVisibleToUser()).thenReturn(true);
when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(false);
// WHEN the unlocked state changes
when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
mKeyguardStateCallback.onUnlockedChanged();
// THEN the lock icon is shown
verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
} }