Loading packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +5 −1 Original line number Diff line number Diff line Loading @@ -718,7 +718,11 @@ private fun AuthContainerView.hasBiometricPrompt() = (findViewById<ScrollView>(R.id.biometric_scrollview)?.childCount ?: 0) > 0 private fun AuthContainerView.hasCredentialView() = if (Flags.bpFallbackOptions()) { (findViewById<View>(R.id.credential_view)?.visibility ?: View.GONE) == View.VISIBLE } else { hasCredentialPatternView() || hasCredentialPasswordView() } private fun AuthContainerView.hasCredentialPatternView() = findViewById<View>(R.id.lockPattern) != null Loading packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml +10 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,16 @@ app:layout_constraintTop_toTopOf="@+id/topGuideline" app:layout_constraintVertical_bias="1.0" /> <FrameLayout android:id="@+id/credential_view" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" app:layout_constraintTop_toTopOf="@id/panel" app:layout_constraintBottom_toBottomOf="@id/panel" app:layout_constraintStart_toStartOf="@id/panel" app:layout_constraintEnd_toEndOf="@id/panel" /> <com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay android:id="@+id/biometric_prompt_udfps_accessibility_overlay" android:layout_width="0dp" Loading packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml +10 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,16 @@ android:layout_height="match_parent"> app:layout_constraintTop_toTopOf="@+id/topGuideline" app:layout_constraintVertical_bias="1.0" /> <FrameLayout android:id="@+id/credential_view" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" app:layout_constraintTop_toTopOf="@id/panel" app:layout_constraintBottom_toBottomOf="@id/panel" app:layout_constraintStart_toStartOf="@id/panel" app:layout_constraintEnd_toEndOf="@id/panel" /> <com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay android:id="@+id/biometric_prompt_udfps_accessibility_overlay" android:layout_width="0dp" Loading packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +26 −17 Original line number Diff line number Diff line Loading @@ -221,9 +221,9 @@ public class AuthContainerView extends LinearLayout @Override public void onUseDeviceCredential() { mConfig.mCallback.onDeviceCredentialPressed(getRequestId()); addCredentialView(false /* animatePanel */, true /* animateContents */); if (!Flags.bpFallbackOptions()) { addCredentialView(false /* animatePanel */, true /* animateContents */); // TODO(b/313469218): Remove Config mConfig.mPromptInfo.setAuthenticators( BiometricManager.Authenticators.DEVICE_CREDENTIAL); Loading Loading @@ -265,7 +265,6 @@ public class AuthContainerView extends LinearLayout animateAway(BiometricPrompt.DISMISSED_REASON_CREDENTIAL_CONFIRMED); } else if (Flags.bpFallbackOptions()) { mPromptSelectorInteractorProvider.get().onSwitchToAuth(); removeCredentialView(); mConfig.mCallback.onResumeAuthentication(getRequestId()); } } Loading Loading @@ -357,7 +356,7 @@ public class AuthContainerView extends LinearLayout final LayoutInflater layoutInflater = LayoutInflater.from(mContext); final PromptKind kind = mPromptViewModel.getPromptKind().getValue(); if (kind.isBiometric()) { if (kind.isBiometric() || Flags.bpFallbackOptions()) { if (kind.isTwoPaneLandscapeBiometric()) { mLayout = (ConstraintLayout) layoutInflater.inflate( R.layout.biometric_prompt_two_pane_layout, this, false /* attachToRoot */); Loading Loading @@ -396,7 +395,10 @@ public class AuthContainerView extends LinearLayout private void showPrompt(@NonNull PromptViewModel viewModel, @NonNull VibratorHelper vibratorHelper) { if (mPromptViewModel.getPromptKind().getValue().isBiometric()) { if (Flags.bpFallbackOptions()) { addBiometricView(viewModel, vibratorHelper); addCredentialView(false, false); } else if (mPromptViewModel.getPromptKind().getValue().isBiometric()) { addBiometricView(viewModel, vibratorHelper); } else if (mPromptViewModel.getPromptKind().getValue().isCredential()) { addCredentialView(true, false); Loading Loading @@ -452,8 +454,15 @@ public class AuthContainerView extends LinearLayout } // TODO(b/288175645): Once AuthContainerView is removed, set 0dp in credential view xml // files with the corresponding left/right or top/bottom constraints being set to "parent". if (Flags.bpFallbackOptions()) { final FrameLayout credentialView = mLayout.findViewById(R.id.credential_view); mCredentialView = factory.inflate(layoutResourceId, credentialView, false); final CredentialViewModel vm = mCredentialViewModelProvider.get(); ((CredentialView) mCredentialView).init(vm, this, mPanelController, false, mBiometricCallback, mAuthContextPlugins); credentialView.addView(mCredentialView); } else { mCredentialView = factory.inflate(layoutResourceId, mLayout, false); // The background is used for detecting taps / cancelling authentication. Since the // credential view is full-screen and should not be canceled from background taps, // disable it. Loading @@ -463,9 +472,9 @@ public class AuthContainerView extends LinearLayout vm.setAnimateContents(animateContents); ((CredentialView) mCredentialView).init(vm, this, mPanelController, animatePanel, mBiometricCallback, mAuthContextPlugins); mLayout.addView(mCredentialView); } } /** Removes the credential view from the biometric prompt */ private void removeCredentialView() { Loading packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt +39 −22 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import androidx.core.view.doOnLayout import androidx.lifecycle.lifecycleScope import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.domain.interactor.BiometricPromptView import com.android.systemui.biometrics.ui.viewmodel.PromptPosition import com.android.systemui.biometrics.ui.viewmodel.PromptSize import com.android.systemui.biometrics.ui.viewmodel.PromptViewModel Loading Loading @@ -103,7 +104,7 @@ object BiometricViewSizeBinder { var currentSize: PromptSize? = null var currentPosition: PromptPosition = PromptPosition.Bottom var fallbackCurrentlyShowing: Boolean = false var currentView: BiometricPromptView? = null panelView.outlineProvider = object : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { Loading Loading @@ -152,6 +153,11 @@ object BiometricViewSizeBinder { largeConstraintSet.constrainMaxWidth(R.id.panel, 0) largeConstraintSet.setGuidelineBegin(R.id.leftGuideline, 0) largeConstraintSet.setGuidelineEnd(R.id.rightGuideline, 0) if (Flags.bpFallbackOptions()) { largeConstraintSet.setVisibility(R.id.auth_screen, View.GONE) largeConstraintSet.setVisibility(R.id.credential_view, View.VISIBLE) largeConstraintSet.setVisibility(R.id.fallback_view, View.GONE) } // TODO: Investigate better way to handle 180 rotations val flipConstraintSet = ConstraintSet() Loading Loading @@ -350,21 +356,23 @@ object BiometricViewSizeBinder { combine( viewModel.position, viewModel.size, viewModel.fallbackShowing, viewModel.currentView, viewModel.hideSensorIcon, ::Quad, ) .collect { (position, size, fallbackShowing, hideSensor) -> .collect { (position, size, activeView, hideSensor) -> if (Flags.bpFallbackOptions()) { setVisibilities(hideSensor, size) if (fallbackShowing) { when (activeView) { BiometricPromptView.FALLBACK -> { mediumConstraintSet.setVisibility(R.id.auth_screen, View.GONE) mediumConstraintSet.setVisibility(iconHolderView.id, View.GONE) mediumConstraintSet.setVisibility( R.id.fallback_view, View.VISIBLE, ) } else { } BiometricPromptView.BIOMETRIC -> { mediumConstraintSet.setVisibility( R.id.auth_screen, View.VISIBLE, Loading @@ -375,6 +383,15 @@ object BiometricViewSizeBinder { ) mediumConstraintSet.setVisibility(R.id.fallback_view, View.GONE) } BiometricPromptView.CREDENTIAL -> { mediumConstraintSet.setVisibility(R.id.auth_screen, View.GONE) mediumConstraintSet.setVisibility(iconHolderView.id, View.GONE) mediumConstraintSet.setVisibility( R.id.fallback_view, View.GONE, ) } } } if (position.isLeft) { Loading Loading @@ -455,7 +472,7 @@ object BiometricViewSizeBinder { } // Animate between auth and fallback screen if we just changed if (fallbackCurrentlyShowing != fallbackShowing) { if (currentView != activeView) { val autoTransition = AutoTransition() autoTransition.setDuration( ANIMATE_SMALL_TO_MEDIUM_DURATION_MS.toLong() Loading Loading @@ -483,7 +500,7 @@ object BiometricViewSizeBinder { currentSize = size currentPosition = position fallbackCurrentlyShowing = fallbackShowing currentView = activeView notifyAccessibilityChanged() panelView.invalidateOutline() Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +5 −1 Original line number Diff line number Diff line Loading @@ -718,7 +718,11 @@ private fun AuthContainerView.hasBiometricPrompt() = (findViewById<ScrollView>(R.id.biometric_scrollview)?.childCount ?: 0) > 0 private fun AuthContainerView.hasCredentialView() = if (Flags.bpFallbackOptions()) { (findViewById<View>(R.id.credential_view)?.visibility ?: View.GONE) == View.VISIBLE } else { hasCredentialPatternView() || hasCredentialPasswordView() } private fun AuthContainerView.hasCredentialPatternView() = findViewById<View>(R.id.lockPattern) != null Loading
packages/SystemUI/res/layout/biometric_prompt_one_pane_layout.xml +10 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,16 @@ app:layout_constraintTop_toTopOf="@+id/topGuideline" app:layout_constraintVertical_bias="1.0" /> <FrameLayout android:id="@+id/credential_view" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" app:layout_constraintTop_toTopOf="@id/panel" app:layout_constraintBottom_toBottomOf="@id/panel" app:layout_constraintStart_toStartOf="@id/panel" app:layout_constraintEnd_toEndOf="@id/panel" /> <com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay android:id="@+id/biometric_prompt_udfps_accessibility_overlay" android:layout_width="0dp" Loading
packages/SystemUI/res/layout/biometric_prompt_two_pane_layout.xml +10 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,16 @@ android:layout_height="match_parent"> app:layout_constraintTop_toTopOf="@+id/topGuideline" app:layout_constraintVertical_bias="1.0" /> <FrameLayout android:id="@+id/credential_view" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" app:layout_constraintTop_toTopOf="@id/panel" app:layout_constraintBottom_toBottomOf="@id/panel" app:layout_constraintStart_toStartOf="@id/panel" app:layout_constraintEnd_toEndOf="@id/panel" /> <com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay android:id="@+id/biometric_prompt_udfps_accessibility_overlay" android:layout_width="0dp" Loading
packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +26 −17 Original line number Diff line number Diff line Loading @@ -221,9 +221,9 @@ public class AuthContainerView extends LinearLayout @Override public void onUseDeviceCredential() { mConfig.mCallback.onDeviceCredentialPressed(getRequestId()); addCredentialView(false /* animatePanel */, true /* animateContents */); if (!Flags.bpFallbackOptions()) { addCredentialView(false /* animatePanel */, true /* animateContents */); // TODO(b/313469218): Remove Config mConfig.mPromptInfo.setAuthenticators( BiometricManager.Authenticators.DEVICE_CREDENTIAL); Loading Loading @@ -265,7 +265,6 @@ public class AuthContainerView extends LinearLayout animateAway(BiometricPrompt.DISMISSED_REASON_CREDENTIAL_CONFIRMED); } else if (Flags.bpFallbackOptions()) { mPromptSelectorInteractorProvider.get().onSwitchToAuth(); removeCredentialView(); mConfig.mCallback.onResumeAuthentication(getRequestId()); } } Loading Loading @@ -357,7 +356,7 @@ public class AuthContainerView extends LinearLayout final LayoutInflater layoutInflater = LayoutInflater.from(mContext); final PromptKind kind = mPromptViewModel.getPromptKind().getValue(); if (kind.isBiometric()) { if (kind.isBiometric() || Flags.bpFallbackOptions()) { if (kind.isTwoPaneLandscapeBiometric()) { mLayout = (ConstraintLayout) layoutInflater.inflate( R.layout.biometric_prompt_two_pane_layout, this, false /* attachToRoot */); Loading Loading @@ -396,7 +395,10 @@ public class AuthContainerView extends LinearLayout private void showPrompt(@NonNull PromptViewModel viewModel, @NonNull VibratorHelper vibratorHelper) { if (mPromptViewModel.getPromptKind().getValue().isBiometric()) { if (Flags.bpFallbackOptions()) { addBiometricView(viewModel, vibratorHelper); addCredentialView(false, false); } else if (mPromptViewModel.getPromptKind().getValue().isBiometric()) { addBiometricView(viewModel, vibratorHelper); } else if (mPromptViewModel.getPromptKind().getValue().isCredential()) { addCredentialView(true, false); Loading Loading @@ -452,8 +454,15 @@ public class AuthContainerView extends LinearLayout } // TODO(b/288175645): Once AuthContainerView is removed, set 0dp in credential view xml // files with the corresponding left/right or top/bottom constraints being set to "parent". if (Flags.bpFallbackOptions()) { final FrameLayout credentialView = mLayout.findViewById(R.id.credential_view); mCredentialView = factory.inflate(layoutResourceId, credentialView, false); final CredentialViewModel vm = mCredentialViewModelProvider.get(); ((CredentialView) mCredentialView).init(vm, this, mPanelController, false, mBiometricCallback, mAuthContextPlugins); credentialView.addView(mCredentialView); } else { mCredentialView = factory.inflate(layoutResourceId, mLayout, false); // The background is used for detecting taps / cancelling authentication. Since the // credential view is full-screen and should not be canceled from background taps, // disable it. Loading @@ -463,9 +472,9 @@ public class AuthContainerView extends LinearLayout vm.setAnimateContents(animateContents); ((CredentialView) mCredentialView).init(vm, this, mPanelController, animatePanel, mBiometricCallback, mAuthContextPlugins); mLayout.addView(mCredentialView); } } /** Removes the credential view from the biometric prompt */ private void removeCredentialView() { Loading
packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt +39 −22 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import androidx.core.view.doOnLayout import androidx.lifecycle.lifecycleScope import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.biometrics.Utils import com.android.systemui.biometrics.domain.interactor.BiometricPromptView import com.android.systemui.biometrics.ui.viewmodel.PromptPosition import com.android.systemui.biometrics.ui.viewmodel.PromptSize import com.android.systemui.biometrics.ui.viewmodel.PromptViewModel Loading Loading @@ -103,7 +104,7 @@ object BiometricViewSizeBinder { var currentSize: PromptSize? = null var currentPosition: PromptPosition = PromptPosition.Bottom var fallbackCurrentlyShowing: Boolean = false var currentView: BiometricPromptView? = null panelView.outlineProvider = object : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { Loading Loading @@ -152,6 +153,11 @@ object BiometricViewSizeBinder { largeConstraintSet.constrainMaxWidth(R.id.panel, 0) largeConstraintSet.setGuidelineBegin(R.id.leftGuideline, 0) largeConstraintSet.setGuidelineEnd(R.id.rightGuideline, 0) if (Flags.bpFallbackOptions()) { largeConstraintSet.setVisibility(R.id.auth_screen, View.GONE) largeConstraintSet.setVisibility(R.id.credential_view, View.VISIBLE) largeConstraintSet.setVisibility(R.id.fallback_view, View.GONE) } // TODO: Investigate better way to handle 180 rotations val flipConstraintSet = ConstraintSet() Loading Loading @@ -350,21 +356,23 @@ object BiometricViewSizeBinder { combine( viewModel.position, viewModel.size, viewModel.fallbackShowing, viewModel.currentView, viewModel.hideSensorIcon, ::Quad, ) .collect { (position, size, fallbackShowing, hideSensor) -> .collect { (position, size, activeView, hideSensor) -> if (Flags.bpFallbackOptions()) { setVisibilities(hideSensor, size) if (fallbackShowing) { when (activeView) { BiometricPromptView.FALLBACK -> { mediumConstraintSet.setVisibility(R.id.auth_screen, View.GONE) mediumConstraintSet.setVisibility(iconHolderView.id, View.GONE) mediumConstraintSet.setVisibility( R.id.fallback_view, View.VISIBLE, ) } else { } BiometricPromptView.BIOMETRIC -> { mediumConstraintSet.setVisibility( R.id.auth_screen, View.VISIBLE, Loading @@ -375,6 +383,15 @@ object BiometricViewSizeBinder { ) mediumConstraintSet.setVisibility(R.id.fallback_view, View.GONE) } BiometricPromptView.CREDENTIAL -> { mediumConstraintSet.setVisibility(R.id.auth_screen, View.GONE) mediumConstraintSet.setVisibility(iconHolderView.id, View.GONE) mediumConstraintSet.setVisibility( R.id.fallback_view, View.GONE, ) } } } if (position.isLeft) { Loading Loading @@ -455,7 +472,7 @@ object BiometricViewSizeBinder { } // Animate between auth and fallback screen if we just changed if (fallbackCurrentlyShowing != fallbackShowing) { if (currentView != activeView) { val autoTransition = AutoTransition() autoTransition.setDuration( ANIMATE_SMALL_TO_MEDIUM_DURATION_MS.toLong() Loading Loading @@ -483,7 +500,7 @@ object BiometricViewSizeBinder { currentSize = size currentPosition = position fallbackCurrentlyShowing = fallbackShowing currentView = activeView notifyAccessibilityChanged() panelView.invalidateOutline() Loading