Skip to content
Snippets Groups Projects
Commit 4e08b36d authored by Kevin Chyn's avatar Kevin Chyn Committed by Mohammad Hasan Keramat J
Browse files

Workaround to support low-area UDFPS on BP

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
parent b062e19f
No related branches found
No related tags found
No related merge requests found
...@@ -21,12 +21,19 @@ import android.annotation.Nullable; ...@@ -21,12 +21,19 @@ import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.AttributeSet; 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 * Manages the layout for under-display fingerprint sensors (UDFPS). Ensures that UI elements
* do not overlap with * do not overlap with
*/ */
public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView { public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView {
private static final String TAG = "AuthBiometricUdfpsView";
@Nullable private UdfpsDialogMeasureAdapter mMeasureAdapter; @Nullable private UdfpsDialogMeasureAdapter mMeasureAdapter;
public AuthBiometricUdfpsView(Context context) { public AuthBiometricUdfpsView(Context context) {
...@@ -51,4 +58,23 @@ public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView { ...@@ -51,4 +58,23 @@ public class AuthBiometricUdfpsView extends AuthBiometricFingerprintView {
? mMeasureAdapter.onMeasureInternal(width, height, layoutParams) ? mMeasureAdapter.onMeasureInternal(width, height, layoutParams)
: 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);
}
}
} }
...@@ -46,6 +46,7 @@ public class UdfpsDialogMeasureAdapter { ...@@ -46,6 +46,7 @@ public class UdfpsDialogMeasureAdapter {
@NonNull private final FingerprintSensorPropertiesInternal mSensorProps; @NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
@Nullable private WindowManager mWindowManager; @Nullable private WindowManager mWindowManager;
private int mBottomSpacerHeight;
public UdfpsDialogMeasureAdapter( public UdfpsDialogMeasureAdapter(
@NonNull ViewGroup view, @NonNull FingerprintSensorPropertiesInternal sensorProps) { @NonNull ViewGroup view, @NonNull FingerprintSensorPropertiesInternal sensorProps) {
...@@ -75,6 +76,16 @@ public class UdfpsDialogMeasureAdapter { ...@@ -75,6 +76,16 @@ public class UdfpsDialogMeasureAdapter {
} }
} }
/**
* @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 @NonNull
private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) { private AuthDialog.LayoutParams onMeasureInternalPortrait(int width, int height) {
// Get the height of the everything below the icon. Currently, that's the indicator and // Get the height of the everything below the icon. Currently, that's the indicator and
...@@ -87,7 +98,7 @@ public class UdfpsDialogMeasureAdapter { ...@@ -87,7 +98,7 @@ public class UdfpsDialogMeasureAdapter {
final int dialogMargin = getDialogMarginPx(); final int dialogMargin = getDialogMarginPx();
final int displayHeight = getWindowBounds().height(); final int displayHeight = getWindowBounds().height();
final Insets navbarInsets = getNavbarInsets(); final Insets navbarInsets = getNavbarInsets();
final int bottomSpacerHeight = calculateBottomSpacerHeightForPortrait( mBottomSpacerHeight = calculateBottomSpacerHeightForPortrait(
mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight, mSensorProps, displayHeight, textIndicatorHeight, buttonBarHeight,
dialogMargin, navbarInsets.bottom); dialogMargin, navbarInsets.bottom);
...@@ -123,9 +134,10 @@ public class UdfpsDialogMeasureAdapter { ...@@ -123,9 +134,10 @@ public class UdfpsDialogMeasureAdapter {
MeasureSpec.EXACTLY)); MeasureSpec.EXACTLY));
} else if (child.getId() == R.id.space_below_icon) { } else if (child.getId() == R.id.space_below_icon) {
// Set the spacer height so the fingerprint icon is on the physical sensor area // Set the spacer height so the fingerprint icon is on the physical sensor area
final int clampedSpacerHeight = Math.max(mBottomSpacerHeight, 0);
child.measure( child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(bottomSpacerHeight, MeasureSpec.EXACTLY)); MeasureSpec.makeMeasureSpec(clampedSpacerHeight, MeasureSpec.EXACTLY));
} else { } else {
child.measure( child.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment