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

Commit c532376c authored by Grace Cheng's avatar Grace Cheng
Browse files

Remove all GHBM logic

Removing GHBM logic from codebase since it has been replaced by LHBM.
This will simplify the current implementation, and assist with future
refactors and the transition to Kotlin.

Fixes: 227229729
Test: atest UdfpsViewTest
Test: atest DisplayModeDirectorTest
Change-Id: I0d1e7ffb610154f4d56afab8385883a0389f89db
parent b07646b6
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -24,31 +24,20 @@ package android.hardware.fingerprint;
 * @hide
 */
oneway interface IUdfpsHbmListener {

    /** HBM that applies to the whole screen. */
    const int GLOBAL_HBM = 0;

    /** HBM that only applies to a portion of the screen. */
    const int LOCAL_HBM = 1;

    /**
     * UdfpsController will call this method when the HBM is enabled.
     *
     * @param hbmType The type of HBM that was enabled. See
     *        {@link com.android.systemui.biometrics.UdfpsHbmTypes}.
     * @param displayId The displayId for which the HBM is enabled. See
     *        {@link android.view.Display#getDisplayId()}.
     */
    void onHbmEnabled(int hbmType, int displayId);
    void onHbmEnabled(int displayId);

    /**
     * UdfpsController will call this method when the HBM is disabled.
     *
     * @param hbmType The type of HBM that was disabled. See
     *        {@link com.android.systemui.biometrics.UdfpsHbmTypes}.
     * @param displayId The displayId for which the HBM is disabled. See
     *        {@link android.view.Display#getDisplayId()}.
     */
    void onHbmDisabled(int hbmType, int displayId);
    void onHbmDisabled(int displayId);
}
+0 −6
Original line number Diff line number Diff line
@@ -28,10 +28,4 @@
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <com.android.systemui.biometrics.UdfpsSurfaceView
        android:id="@+id/hbm_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"/>

</com.android.systemui.biometrics.UdfpsView>
+6 −12
Original line number Diff line number Diff line
@@ -17,9 +17,6 @@
package com.android.systemui.biometrics;

import android.annotation.Nullable;
import android.view.Surface;

import com.android.systemui.biometrics.UdfpsHbmTypes.HbmType;

/**
 * Interface for controlling the high-brightness mode (HBM). UdfpsView can use this callback to
@@ -36,24 +33,21 @@ public interface UdfpsHbmProvider {
     * This method must be called from the UI thread. The callback, if provided, will also be
     * invoked from the UI thread.
     *
     * @param hbmType The type of HBM that should be enabled. See {@link UdfpsHbmTypes}.
     * @param surface The surface for which the HBM is requested, in case the HBM implementation
     *                needs to set special surface flags to enable the HBM. Can be null.
     * @param onHbmEnabled A runnable that will be executed once HBM is enabled.
     */
    void enableHbm(@HbmType int hbmType, @Nullable Surface surface,
            @Nullable Runnable onHbmEnabled);
    void enableHbm(@Nullable Runnable onHbmEnabled);

    /**
     * UdfpsView will call this to disable the HBM when the illumination is not longer needed.
     * UdfpsView will call this to disable HBM when illumination is no longer needed.
     *
     * This method is a no-op when HBM is already disabled. If HBM is enabled, this method will
     * disable HBM for the {@code hbmType} and {@code surface} that were provided to the
     * corresponding {@link #enableHbm(int, Surface, Runnable)}.
     * This method will disable HBM if HBM is enabled. Otherwise, if HBM is already disabled,
     * this method is a no-op.
     *
     * The call must be made from the UI thread. The callback, if provided, will also be invoked
     * from the UI thread.
     *
     *
     *
     * @param onHbmDisabled A runnable that will be executed once HBM is disabled.
     */
    void disableHbm(@Nullable Runnable onHbmDisabled);
+0 −39
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.biometrics;

import android.annotation.IntDef;
import android.hardware.fingerprint.IUdfpsHbmListener;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Different high-brightness mode (HBM) types that are relevant to this package.
 */
public final class UdfpsHbmTypes {
    /** HBM that applies to the whole screen. */
    public static final int GLOBAL_HBM = IUdfpsHbmListener.GLOBAL_HBM;

    /** HBM that only applies to a portion of the screen. */
    public static final int LOCAL_HBM = IUdfpsHbmListener.LOCAL_HBM;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({GLOBAL_HBM, LOCAL_HBM})
    public @interface HbmType {
    }
}
+0 −145
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.biometrics;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * Surface View for providing the Global High-Brightness Mode (GHBM) illumination for UDFPS.
 */
public class UdfpsSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "UdfpsSurfaceView";

    /**
     * Notifies {@link UdfpsView} when to enable GHBM illumination.
     */
    interface GhbmIlluminationListener {
        /**
         * @param surface the surface for which GHBM should be enabled.
         * @param onIlluminatedRunnable a runnable that should be run after GHBM is enabled.
         */
        void enableGhbm(@NonNull Surface surface, @Nullable Runnable onIlluminatedRunnable);
    }

    @NonNull private final SurfaceHolder mHolder;
    @NonNull private final Paint mSensorPaint;

    @Nullable private GhbmIlluminationListener mGhbmIlluminationListener;
    @Nullable private Runnable mOnIlluminatedRunnable;
    boolean mAwaitingSurfaceToStartIllumination;
    boolean mHasValidSurface;

    public UdfpsSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // Make this SurfaceView draw on top of everything else in this window. This allows us to
        // 1) Always show the HBM circle on top of everything else, and
        // 2) Properly composite this view with any other animations in the same window no matter
        //    what contents are added in which order to this view hierarchy.
        setZOrderOnTop(true);

        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setFormat(PixelFormat.RGBA_8888);

        mSensorPaint = new Paint(0 /* flags */);
        mSensorPaint.setAntiAlias(true);
        mSensorPaint.setARGB(255, 255, 255, 255);
        mSensorPaint.setStyle(Paint.Style.FILL);
    }

    @Override public void surfaceCreated(SurfaceHolder holder) {
        mHasValidSurface = true;
        if (mAwaitingSurfaceToStartIllumination) {
            doIlluminate(mOnIlluminatedRunnable);
            mOnIlluminatedRunnable = null;
            mAwaitingSurfaceToStartIllumination = false;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // Unused.
    }

    @Override public void surfaceDestroyed(SurfaceHolder holder) {
        mHasValidSurface = false;
    }

    void setGhbmIlluminationListener(@Nullable GhbmIlluminationListener listener) {
        mGhbmIlluminationListener = listener;
    }

    /**
     * Note: there is no corresponding method to stop GHBM illumination. It is expected that
     * {@link UdfpsView} will hide this view, which would destroy the surface and remove the
     * illumination dot.
     */
    void startGhbmIllumination(@Nullable Runnable onIlluminatedRunnable) {
        if (mGhbmIlluminationListener == null) {
            Log.e(TAG, "startIllumination | mGhbmIlluminationListener is null");
            return;
        }

        if (mHasValidSurface) {
            doIlluminate(onIlluminatedRunnable);
        } else {
            mAwaitingSurfaceToStartIllumination = true;
            mOnIlluminatedRunnable = onIlluminatedRunnable;
        }
    }

    private void doIlluminate(@Nullable Runnable onIlluminatedRunnable) {
        if (mGhbmIlluminationListener == null) {
            Log.e(TAG, "doIlluminate | mGhbmIlluminationListener is null");
            return;
        }

        mGhbmIlluminationListener.enableGhbm(mHolder.getSurface(), onIlluminatedRunnable);
    }

    /**
     * Immediately draws the illumination dot on this SurfaceView's surface.
     */
    void drawIlluminationDot(@NonNull RectF sensorRect) {
        if (!mHasValidSurface) {
            Log.e(TAG, "drawIlluminationDot | the surface is destroyed or was never created.");
            return;
        }
        Canvas canvas = null;
        try {
            canvas = mHolder.lockCanvas();
            canvas.drawOval(sensorRect, mSensorPaint);
        } finally {
            // Make sure the surface is never left in a bad state.
            if (canvas != null) {
                mHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}
Loading