Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68d05b2d authored by Grace Cheng's avatar Grace Cheng Committed by Automerger Merge Worker
Browse files

Merge "Update side-fps affordance to account for changes in device rotation,...

Merge "Update side-fps affordance to account for changes in device rotation, and derive params from sensorProps and WindowManager" into sc-dev am: 1b89ad15

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14750381

Change-Id: I2fcfe61428cf7c98c401f91891a9e618c7b30522
parents 1314f52d 1b89ad15
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -693,7 +693,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // UdfpsController is not BiometricPrompt-specific. It can be active for keyguard or
        // enrollment.
        if (mUdfpsController != null) {
+64 −26
Original line number Diff line number Diff line
@@ -26,9 +26,11 @@ import android.graphics.PixelFormat;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.WindowManager;

import com.android.internal.annotations.VisibleForTesting;
@@ -45,20 +47,19 @@ import javax.inject.Inject;
@SysUISingleton
public class SidefpsController {
    private static final String TAG = "SidefpsController";
    // TODO (b/188690214): define and retrieve values from framework via SensorProps
    static final int DISPLAY_HEIGHT = 1804;
    static final int DISPLAY_WIDTH = 2208;
    static final int SFPS_INDICATOR_HEIGHT = 225;
    static final int SFPS_Y = 500;
    static final int SFPS_INDICATOR_WIDTH = 50;

    @Nullable private SidefpsView mView;
    private final FingerprintManager mFingerprintManager;
    private final Context mContext;
    @NonNull private final Context mContext;
    @NonNull private final LayoutInflater mInflater;
    private final FingerprintManager mFingerprintManager;
    private final WindowManager mWindowManager;
    private final DelayableExecutor mFgExecutor;
    // TODO: update mDisplayHeight and mDisplayWidth for multi-display devices
    private final int mDisplayHeight;
    private final int mDisplayWidth;

    private boolean mIsVisible = false;
    @Nullable private SidefpsView mView;

    static final int SFPS_AFFORDANCE_WIDTH = 50; // in default portrait mode

    @NonNull
    private final ISidefpsController mSidefpsControllerImpl = new ISidefpsController.Stub() {
@@ -110,6 +111,11 @@ public class SidefpsController {
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mCoreLayoutParams.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        mDisplayHeight = displayMetrics.heightPixels;
        mDisplayWidth = displayMetrics.widthPixels;

        mFingerprintManager.setSidefpsController(mSidefpsControllerImpl);
    }

@@ -122,7 +128,6 @@ public class SidefpsController {

    void hide() {
        if (mView != null) {
            Log.v(TAG, "hideUdfpsOverlay | removing window");
            mWindowManager.removeView(mView);
            mView.setOnTouchListener(null);
            mView.setOnHoverListener(null);
@@ -132,13 +137,14 @@ public class SidefpsController {
        }
    }


    void onConfigurationChanged() {
        // If overlay was hidden, it should remain hidden
        if (!mIsVisible) {
        // If mView is null or if view is hidden, then return.
        if (mView == null || !mIsVisible) {
            return;
        }
        // If the overlay needs to be shown, destroy the current overlay, and re-create and show
        // the overlay with the updated LayoutParams.
        // If the overlay needs to be displayed with a new configuration, destroy the current
        // overlay, and re-create and show the overlay with the updated LayoutParams.
        hide();
        show();
    }
@@ -148,6 +154,25 @@ public class SidefpsController {
        for (FingerprintSensorPropertiesInternal props :
                mFingerprintManager.getSensorPropertiesInternal()) {
            if (props.isAnySidefpsType()) {
                // TODO(b/188690214): L155-L173 can be removed once sensorLocationX,
                //  sensorLocationY, and sensorRadius are defined in sensorProps by the HAL
                int sensorLocationX = 25;
                int sensorLocationY = 610;
                int sensorRadius = 112;

                FingerprintSensorPropertiesInternal tempProps =
                        new FingerprintSensorPropertiesInternal(
                                props.sensorId,
                                props.sensorStrength,
                                props.maxEnrollmentsPerUser,
                                props.componentInfo,
                                props.sensorType,
                                props.resetLockoutRequiresHardwareAuthToken,
                                sensorLocationX,
                                sensorLocationY,
                                sensorRadius
                        );
                props = tempProps;
                return props;
            }
        }
@@ -166,17 +191,30 @@ public class SidefpsController {
     */
    private WindowManager.LayoutParams computeLayoutParams() {
        mCoreLayoutParams.flags = getCoreLayoutParamFlags();

        // Default dimensions assume portrait mode.
        mCoreLayoutParams.x = DISPLAY_WIDTH - SFPS_INDICATOR_WIDTH;
        mCoreLayoutParams.y = SFPS_Y;
        mCoreLayoutParams.height = SFPS_INDICATOR_HEIGHT;
        mCoreLayoutParams.width = SFPS_INDICATOR_WIDTH;

        /*
        TODO (b/188692405): recalculate coordinates for non-portrait configurations and folding
         states
        */
        // Y value of top of affordance in portrait mode, X value of left of affordance in landscape
        int sfpsLocationY = mSensorProps.sensorLocationY - mSensorProps.sensorRadius;
        int sfpsAffordanceHeight = mSensorProps.sensorRadius * 2;

        // Calculate coordinates of drawable area for the fps affordance, accounting for orientation
        switch (mContext.getDisplay().getRotation()) {
            case Surface.ROTATION_90:
                mCoreLayoutParams.x = sfpsLocationY;
                mCoreLayoutParams.y = 0;
                mCoreLayoutParams.height = SFPS_AFFORDANCE_WIDTH;
                mCoreLayoutParams.width = sfpsAffordanceHeight;
                break;
            case Surface.ROTATION_270:
                mCoreLayoutParams.x = mDisplayHeight - sfpsLocationY - sfpsAffordanceHeight;
                mCoreLayoutParams.y = mDisplayWidth - SFPS_AFFORDANCE_WIDTH;
                mCoreLayoutParams.height = SFPS_AFFORDANCE_WIDTH;
                mCoreLayoutParams.width = sfpsAffordanceHeight;
                break;
            default: // Portrait
                mCoreLayoutParams.x = mDisplayWidth - SFPS_AFFORDANCE_WIDTH;
                mCoreLayoutParams.y = sfpsLocationY;
                mCoreLayoutParams.height = sfpsAffordanceHeight;
                mCoreLayoutParams.width = SFPS_AFFORDANCE_WIDTH;
        }
        return mCoreLayoutParams;
    }
}
+30 −10
Original line number Diff line number Diff line
@@ -16,8 +16,7 @@

package com.android.systemui.biometrics;

import static com.android.systemui.biometrics.SidefpsController.SFPS_INDICATOR_HEIGHT;
import static com.android.systemui.biometrics.SidefpsController.SFPS_INDICATOR_WIDTH;
import static com.android.systemui.biometrics.SidefpsController.SFPS_AFFORDANCE_WIDTH;

import android.annotation.NonNull;
import android.content.Context;
@@ -27,6 +26,7 @@ import android.graphics.Paint;
import android.graphics.RectF;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.util.AttributeSet;
import android.view.Surface;
import android.widget.FrameLayout;

/**
@@ -34,18 +34,22 @@ import android.widget.FrameLayout;
 */
public class SidefpsView extends FrameLayout {
    private static final String TAG = "SidefpsView";
    private static final int POINTER_SIZE_PX = 50;
    private static final int ROUND_RADIUS = 15;

    @NonNull private final RectF mSensorRect;
    @NonNull private final Paint mSensorRectPaint;
    @NonNull private final Paint mPointerText;
    private static final int POINTER_SIZE_PX = 50;
    @NonNull private final Context mContext;

    // Used to obtain the sensor location.
    @NonNull private FingerprintSensorPropertiesInternal mSensorProps;
    @Surface.Rotation private int mOrientation;

    public SidefpsView(Context context, AttributeSet attrs) {
        super(context, attrs);
        super.setWillNotDraw(false);

        mContext = context;
        mPointerText = new Paint(0 /* flags */);
        mPointerText.setAntiAlias(true);
        mPointerText.setColor(Color.WHITE);
@@ -54,7 +58,7 @@ public class SidefpsView extends FrameLayout {
        mSensorRect = new RectF();
        mSensorRectPaint = new Paint(0 /* flags */);
        mSensorRectPaint.setAntiAlias(true);
        mSensorRectPaint.setColor(Color.BLUE);
        mSensorRectPaint.setColor(Color.BLUE); // TODO: Fix Color
        mSensorRectPaint.setStyle(Paint.Style.FILL);
    }

@@ -65,11 +69,19 @@ public class SidefpsView extends FrameLayout {
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(mSensorRect, mSensorRectPaint);
        canvas.drawRoundRect(mSensorRect, ROUND_RADIUS, ROUND_RADIUS, mSensorRectPaint);
        int x, y;
        if (mOrientation == Surface.ROTATION_90 || mOrientation == Surface.ROTATION_270) {
            x = mSensorProps.sensorRadius + 10;
            y = SFPS_AFFORDANCE_WIDTH / 2 + 15;
        } else {
            x = SFPS_AFFORDANCE_WIDTH / 2 - 10;
            y = mSensorProps.sensorRadius + 30;
        }
        canvas.drawText(
                ">",
                SFPS_INDICATOR_WIDTH / 2 - 10, // TODO(b/188690214): retrieve from sensorProps
                SFPS_INDICATOR_HEIGHT / 2 + 30, //TODO(b/188690214): retrieve from sensorProps
                x,
                y,
                mPointerText
        );
    }
@@ -77,11 +89,19 @@ public class SidefpsView extends FrameLayout {
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        mOrientation = mContext.getDisplay().getRotation();
        if (mOrientation == Surface.ROTATION_90 || mOrientation == Surface.ROTATION_270) {
            right = mSensorProps.sensorRadius * 2;
            bottom = SFPS_AFFORDANCE_WIDTH;
        } else {
            right = SFPS_AFFORDANCE_WIDTH;
            bottom = mSensorProps.sensorRadius * 2;
        }

        mSensorRect.set(
                0,
                0,
                SFPS_INDICATOR_WIDTH, //TODO(b/188690214): retrieve from sensorProps
                SFPS_INDICATOR_HEIGHT); //TODO(b/188690214): retrieve from sensorProps
                right,
                bottom);
    }
}