diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 2f3d875ba36..0d54cf437f3 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -161,6 +161,7 @@ 12dp 12dp 0dp + 20dp 0 diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 9b1b30a782a..835e15dc504 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -63,6 +63,7 @@ import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; @@ -328,6 +329,23 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { final ViewGroup.LayoutParams containerLp = portraitLayoutContainer.getLayoutParams(); containerLp.height = 0; + + // In the portrait mode, the title and lottie animation view may + // overlap when title needs three lines, so adding some paddings + // between them, and adjusting the fp progress view here accordingly. + final int layoutLottieAnimationPadding = (int) getResources() + .getDimension(R.dimen.udfps_lottie_padding_top); + portraitLayoutContainer.setPadding(0, + layoutLottieAnimationPadding, 0, 0); + final ImageView progressView = udfpsEnrollView.findViewById( + R.id.udfps_enroll_animation_fp_progress_view); + progressView.setPadding(0, -(layoutLottieAnimationPadding), + 0, layoutLottieAnimationPadding); + final ImageView fingerprintView = udfpsEnrollView.findViewById( + R.id.udfps_enroll_animation_fp_view); + fingerprintView.setPadding(0, -layoutLottieAnimationPadding, + 0, layoutLottieAnimationPadding); + portraitLayoutContainer.addView(udfpsEnrollView); setOnHoverListener(false, defaultLayout, udfpsEnrollView); } else if (rotation == Surface.ROTATION_270) { diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index 2886194cff2..2232960cc27 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -43,6 +43,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; +import android.graphics.Rect; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintManager; @@ -58,6 +59,7 @@ import android.view.Surface; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.TextView; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; @@ -81,6 +83,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; @RunWith(RobolectricTestRunner.class) public class FingerprintEnrollEnrollingTest { @@ -245,6 +248,78 @@ public class FingerprintEnrollEnrollingTest { .isEqualTo(progressColor); } + @Test + public void fingerprintUdfpsOverlayEnrollment_checkViewOverlapPortrait() { + FeatureFlagUtils.setEnabled(mContext, + FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, true); + when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_90); + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + final GlifLayout defaultLayout = mActivity.findViewById(R.id.setup_wizard_layout); + final TextView headerTextView = defaultLayout.getHeaderTextView(); + final TextView descriptionTextView = defaultLayout.getDescriptionTextView(); + final FrameLayout lottieAnimationContainer = mActivity.findViewById(R.id.layout_container); + final UdfpsEnrollView udfpsEnrollView = + defaultLayout.findViewById(R.id.udfps_animation_view); + + final int[] headerTextViewPosition = new int[2]; + final int[] descriptionTextViewPosition = new int[2]; + final int[] lottieAnimationPosition = new int[2]; + final int[] udfpsEnrollViewPosition = new int[2]; + final AtomicReference rectHeaderTextView = new AtomicReference<>( + new Rect(0, 0, 0, 0)); + final AtomicReference rectDescriptionTextView = + new AtomicReference<>(new Rect(0, 0, 0, 0)); + final AtomicReference rectLottieAnimationView = new AtomicReference<>( + new Rect(0, 0, 0, 0)); + final AtomicReference rectUdfpsEnrollView = new AtomicReference<>( + new Rect(0, 0, 0, 0)); + + headerTextView.getViewTreeObserver().addOnDrawListener(() -> { + headerTextView.getLocationOnScreen(headerTextViewPosition); + rectHeaderTextView.set(new Rect(headerTextViewPosition[0], headerTextViewPosition[1], + headerTextViewPosition[0] + headerTextView.getWidth(), + headerTextViewPosition[1] + headerTextView.getHeight())); + }); + + descriptionTextView.getViewTreeObserver().addOnDrawListener(() -> { + descriptionTextView.getLocationOnScreen(descriptionTextViewPosition); + rectDescriptionTextView.set(new Rect(descriptionTextViewPosition[0], + descriptionTextViewPosition[1], descriptionTextViewPosition[0] + + descriptionTextView.getWidth(), descriptionTextViewPosition[1] + + descriptionTextView.getHeight())); + + }); + + udfpsEnrollView.getViewTreeObserver().addOnDrawListener(() -> { + udfpsEnrollView.getLocationOnScreen(udfpsEnrollViewPosition); + rectUdfpsEnrollView.set(new Rect(udfpsEnrollViewPosition[0], + udfpsEnrollViewPosition[1], udfpsEnrollViewPosition[0] + + udfpsEnrollView.getWidth(), udfpsEnrollViewPosition[1] + + udfpsEnrollView.getHeight())); + }); + + lottieAnimationContainer.getViewTreeObserver().addOnDrawListener(() -> { + lottieAnimationContainer.getLocationOnScreen(lottieAnimationPosition); + rectLottieAnimationView.set(new Rect(lottieAnimationPosition[0], + lottieAnimationPosition[1], lottieAnimationPosition[0] + + lottieAnimationContainer.getWidth(), lottieAnimationPosition[1] + + lottieAnimationContainer.getHeight())); + }); + + // Check if the HeaderTextView and DescriptionTextView overlapped + assertThat(rectHeaderTextView.get() + .intersect(rectDescriptionTextView.get())).isFalse(); + + // Check if the DescriptionTextView and Lottie animation overlapped + assertThat(rectDescriptionTextView.get() + .intersect(rectLottieAnimationView.get())).isFalse(); + + // Check if the Lottie animation and UDSPFEnrollView overlapped + assertThat(rectLottieAnimationView.get() + .intersect(rectUdfpsEnrollView.get())).isFalse(); + } + @Test public void forwardEnrollProgressEvents() { FeatureFlagUtils.setEnabled(mContext,