diff options
9 files changed, 28 insertions, 153 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index aeea99be40dd..a2f5a30a20ff 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -193,8 +193,6 @@ public class UdfpsControllerTest extends SysuiTestCase { @Mock private UdfpsOverlayInteractor mUdfpsOverlayInteractor; @Mock - private UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate; - @Mock private SelectedUserInteractor mSelectedUserInteractor; // Capture listeners so that they can be used to send events @@ -321,7 +319,6 @@ public class UdfpsControllerTest extends SysuiTestCase { mAlternateBouncerInteractor, mInputManager, mock(DeviceEntryFaceAuthInteractor.class), - mUdfpsKeyguardAccessibilityDelegate, mSelectedUserInteractor, mKeyguardTransitionInteractor, mDeviceEntryUdfpsTouchOverlayViewModel, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegateTest.kt deleted file mode 100644 index 921ff098753e..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegateTest.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.biometrics - -import android.testing.TestableLooper -import android.view.View -import android.view.accessibility.AccessibilityNodeInfo -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager -import com.android.systemui.util.mockito.argumentCaptor -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.anyBoolean -import org.mockito.Mock -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations - -@RunWith(AndroidJUnit4::class) -@SmallTest -@TestableLooper.RunWithLooper -class UdfpsKeyguardAccessibilityDelegateTest : SysuiTestCase() { - - @Mock private lateinit var keyguardViewManager: StatusBarKeyguardViewManager - @Mock private lateinit var hostView: View - private lateinit var underTest: UdfpsKeyguardAccessibilityDelegate - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - underTest = - UdfpsKeyguardAccessibilityDelegate( - context.resources, - keyguardViewManager, - ) - } - - @Test - fun onInitializeAccessibilityNodeInfo_clickActionAdded() { - // WHEN node is initialized - val mockedNodeInfo = mock(AccessibilityNodeInfo::class.java) - underTest.onInitializeAccessibilityNodeInfo(hostView, mockedNodeInfo) - - // THEN a11y action is added - val argumentCaptor = argumentCaptor<AccessibilityNodeInfo.AccessibilityAction>() - verify(mockedNodeInfo).addAction(argumentCaptor.capture()) - - // AND the a11y action is a click action - assertEquals( - AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.id, - argumentCaptor.value.id - ) - } - - @Test - fun performAccessibilityAction_actionClick_showsPrimaryBouncer() { - // WHEN click action is performed - val mockedNodeInfo = mock(AccessibilityNodeInfo::class.java) - underTest.performAccessibilityAction( - hostView, - AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.id, - null - ) - - // THEN primary bouncer shows - verify(keyguardViewManager).showPrimaryBouncer(anyBoolean()) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 88694ae6db51..dfe8eb28b2a6 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -179,7 +179,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull private final PowerInteractor mPowerInteractor; @NonNull private final CoroutineScope mScope; @NonNull private final InputManager mInputManager; - @NonNull private final UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate; @NonNull private final SelectedUserInteractor mSelectedUserInteractor; private final boolean mIgnoreRefreshRate; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; @@ -292,7 +291,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { mActivityTransitionAnimator, mPrimaryBouncerInteractor, mAlternateBouncerInteractor, - mUdfpsKeyguardAccessibilityDelegate, mKeyguardTransitionInteractor, mSelectedUserInteractor, mDeviceEntryUdfpsTouchOverlayViewModel, @@ -691,7 +689,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { @NonNull AlternateBouncerInteractor alternateBouncerInteractor, @NonNull InputManager inputManager, @NonNull DeviceEntryFaceAuthInteractor deviceEntryFaceAuthInteractor, - @NonNull UdfpsKeyguardAccessibilityDelegate udfpsKeyguardAccessibilityDelegate, @NonNull SelectedUserInteractor selectedUserInteractor, @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor, Lazy<DeviceEntryUdfpsTouchOverlayViewModel> deviceEntryUdfpsTouchOverlayViewModel, @@ -742,7 +739,6 @@ public class UdfpsController implements DozeReceiver, Dumpable { mPowerInteractor = powerInteractor; mScope = scope; mInputManager = inputManager; - mUdfpsKeyguardAccessibilityDelegate = udfpsKeyguardAccessibilityDelegate; mSelectedUserInteractor = selectedUserInteractor; mKeyguardTransitionInteractor = keyguardTransitionInteractor; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt index 702f23718ee8..bdf58275effa 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt @@ -107,7 +107,6 @@ constructor( private val primaryBouncerInteractor: PrimaryBouncerInteractor, private val alternateBouncerInteractor: AlternateBouncerInteractor, private val isDebuggable: Boolean = Build.IS_DEBUGGABLE, - private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate, private val transitionInteractor: KeyguardTransitionInteractor, private val selectedUserInteractor: SelectedUserInteractor, private val deviceEntryUdfpsTouchOverlayViewModel: Lazy<DeviceEntryUdfpsTouchOverlayViewModel>, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegate.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegate.kt deleted file mode 100644 index 99da660d1fda..000000000000 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardAccessibilityDelegate.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.biometrics - -import android.content.res.Resources -import android.os.Bundle -import android.view.View -import android.view.accessibility.AccessibilityNodeInfo -import com.android.systemui.res.R -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager -import javax.inject.Inject - -@SysUISingleton -class UdfpsKeyguardAccessibilityDelegate -@Inject -constructor( - @Main private val resources: Resources, - private val keyguardViewManager: StatusBarKeyguardViewManager, -) : View.AccessibilityDelegate() { - override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) { - super.onInitializeAccessibilityNodeInfo(host, info) - val clickAction = - AccessibilityNodeInfo.AccessibilityAction( - AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.id, - resources.getString(R.string.accessibility_bouncer) - ) - info.addAction(clickAction) - } - - override fun performAccessibilityAction(host: View, action: Int, args: Bundle?): Boolean { - // when an a11y service is enabled, double tapping on the fingerprint sensor should - // show the primary bouncer - return if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.id) { - keyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) - true - } else super.performAccessibilityAction(host, action, args) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt index 0b587ae1f58e..c031b53ab87d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt @@ -38,9 +38,15 @@ object AlternateBouncerUdfpsViewBinder { view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { view.alpha = 0f + launch("$TAG#viewModel.accessibilityDelegateHint") { viewModel.accessibilityDelegateHint.collect { hint -> view.accessibilityHintType = hint + if (hint != DeviceEntryIconView.AccessibilityHintType.NONE) { + view.setOnClickListener { viewModel.onTapped() } + } else { + view.setOnClickListener(null) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt index acd381ec3280..9038922466df 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.viewmodel import android.content.Context import com.android.settingslib.Utils +import com.android.systemui.accessibility.domain.interactor.AccessibilityInteractor import com.android.systemui.biometrics.domain.interactor.FingerprintPropertyInteractor import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor @@ -26,6 +27,7 @@ import com.android.systemui.keyguard.ui.view.DeviceEntryIconView import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shared.recents.utilities.Utilities.clamp +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -46,6 +48,8 @@ constructor( fingerprintPropertyInteractor: FingerprintPropertyInteractor, udfpsOverlayInteractor: UdfpsOverlayInteractor, alternateBouncerViewModel: AlternateBouncerViewModel, + private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager, + private val accessibilityInteractor: AccessibilityInteractor, ) { private val isSupported: Flow<Boolean> = deviceEntryUdfpsInteractor.isUdfpsSupported val alpha: Flow<Float> = @@ -74,7 +78,15 @@ constructor( } } val accessibilityDelegateHint: Flow<DeviceEntryIconView.AccessibilityHintType> = - flowOf(DeviceEntryIconView.AccessibilityHintType.ENTER) + accessibilityInteractor.isEnabled.flatMapLatest { touchExplorationEnabled -> + flowOf( + if (touchExplorationEnabled) { + DeviceEntryIconView.AccessibilityHintType.BOUNCER + } else { + DeviceEntryIconView.AccessibilityHintType.NONE + } + ) + } private val fgIconColor: Flow<Int> = configurationInteractor.onAnyConfigurationChange @@ -93,6 +105,10 @@ constructor( ) } + fun onTapped() { + statusBarKeyguardViewManager.showPrimaryBouncer(/* scrimmed */ true) + } + val bgColor: Flow<Int> = deviceEntryBackgroundViewModel.color val bgAlpha: Flow<Float> = flowOf(1f) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt index 5249620dbdd0..a1d038ad8554 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt @@ -120,9 +120,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { private lateinit var deviceEntryUdfpsTouchOverlayViewModel: DeviceEntryUdfpsTouchOverlayViewModel @Mock private lateinit var defaultUdfpsTouchOverlayViewModel: DefaultUdfpsTouchOverlayViewModel - @Mock - private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate - private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository + @Mock private lateinit var keyguardTransitionRepository: FakeKeyguardTransitionRepository private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock private lateinit var shadeInteractor: ShadeInteractor @Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams> @@ -185,7 +183,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() { primaryBouncerInteractor, alternateBouncerInteractor, isDebuggable, - udfpsKeyguardAccessibilityDelegate, keyguardTransitionInteractor, mSelectedUserInteractor, { deviceEntryUdfpsTouchOverlayViewModel }, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt index 697e7b9476ca..3f3c3c0d478a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderKosmos.kt @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.binder import android.content.applicationContext import android.view.mockedLayoutInflater import android.view.windowManager +import com.android.systemui.accessibility.domain.interactor.accessibilityInteractor import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor import com.android.systemui.biometrics.domain.interactor.udfpsOverlayInteractor import com.android.systemui.common.ui.domain.interactor.configurationInteractor @@ -37,6 +38,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.log.logcatLogBuffer import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.statusbar.gesture.TapGestureDetector +import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager import com.android.systemui.util.mockito.mock val Kosmos.alternateBouncerViewBinder by @@ -76,5 +78,7 @@ private val Kosmos.alternateBouncerUdfpsIconViewModel by fingerprintPropertyInteractor = fingerprintPropertyInteractor, udfpsOverlayInteractor = udfpsOverlayInteractor, alternateBouncerViewModel = alternateBouncerViewModel, + statusBarKeyguardViewManager = statusBarKeyguardViewManager, + accessibilityInteractor = accessibilityInteractor, ) } |