Skip to content
This repository has been archived by the owner on Apr 10, 2024. It is now read-only.

Commit

Permalink
Workaround to support low-area UDFPS on BP
Browse files Browse the repository at this point in the history
1) Ensure the spacer measurement is clamped to 0. Negative values
   cause the layout to exhibit undefined behavior.
2) Instead of making the layout xml even more complicated, for low-area
   sensor devices, we just have onLayoutInternal() translate the icon
   and indicator to where it should be. Note that this can definitely
   cause overlap with the button bar, but at least this implementation
   allows the button bar to be shown (and thus pass curent CTS
   requirements). We can have additional refinement in the future.

Bug: 201510778
Test: atest CtsBiometricsTestCases
Change-Id: Ie9869f15fc3afddc3bd4392a2fd08efbf136cd6c
  • Loading branch information
kchyn3 authored and jhenrique09 committed Mar 20, 2022
1 parent aa419ee commit 721e90e
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,19 @@
import android.content.Context;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.android.systemui.R;

/**
* Manages the layout for under-display fingerprint sensors (UDFPS). Ensures that UI elements
* do not overlap with
*/
public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView {
private static final String TAG = "AuthBiometricUdfpsView";

@Nullable private UdfpsDialogMeasureAdapter mMeasureAdapter;

public AuthBiometricUdfpsView(Context context) {
Expand All @@ -51,4 +58,23 @@ AuthDialog.LayoutParams onMeasureInternal(int width, int height) {
? mMeasureAdapter.onMeasureInternal(width, height, layoutParams)
: layoutParams;
}

@Override
void onLayoutInternal() {
super.onLayoutInternal();

// Move the UDFPS icon and indicator text if necessary. This probably only needs to happen
// for devices where the UDFPS sensor is too low.
// TODO(b/201510778): Update this logic to support cases where the sensor or text overlap
// the button bar area.
final int bottomSpacerHeight = mMeasureAdapter.getBottomSpacerHeight();
Log.w(TAG, "bottomSpacerHeight: " + bottomSpacerHeight);
if (bottomSpacerHeight < 0) {
FrameLayout iconFrame = findViewById(R.id.biometric_icon_frame);
iconFrame.setTranslationY(-bottomSpacerHeight);

TextView indicator = findViewById(R.id.indicator);
indicator.setTranslationY(-bottomSpacerHeight);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class UdfpsDialogMeasureAdapter {
@NonNull private final FingerprintSensorPropertiesInternal mSensorProps;

@Nullable private WindowManager mWindowManager;
private int mBottomSpacerHeight;

public UdfpsDialogMeasureAdapter(
@NonNull ViewGroup view, @NonNull FingerprintSensorPropertiesInternal sensorProps) {
Expand Down Expand Up @@ -75,6 +76,16 @@ AuthDialog.LayoutParams onMeasureInternal(
}
}

/**
* @return the actual (and possibly negative) bottom spacer height. If negative, this indicates
* that the UDFPS sensor is too low. Our current xml and custom measurement logic is very hard
* too cleanly support this case. So, let's have the onLayout code translate the sensor location
* instead.
*/
int getBottomSpacerHeight() {
return mBottomSpacerHeight;
}

@NonNull
private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) {
// Get the height of the everything below the icon. Currently, that's the indicator and
Expand All @@ -87,7 +98,7 @@ private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height)
final int dialogMargin = getDialogMarginPx();
final int displayHeight = getWindowBounds().height();
final Insets navbarInsets = getNavbarInsets();
final int bottomSpacerHeight = calculateBottomSpacerHeightForPortrait(
mBottomSpacerHeight = calculateBottomSpacerHeightForPortrait(
mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight,
dialogMargin, navbarInsets.bottom);

Expand Down Expand Up @@ -123,9 +134,10 @@ private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height)
MeasureSpec.EXACTLY));
} else if (child.getId() == R.id.space_below_icon) {
// Set the spacer height so the fingerprint icon is on the physical sensor area
final int clampedSpacerHeight = Math.max(mBottomSpacerHeight, 0);
child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY));
MeasureSpec.makeMeasureSpec(clampedSpacerHeight, MeasureSpec.EXACTLY));
} else {
child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
Expand Down

0 comments on commit 721e90e

Please sign in to comment.