FingerprintDialog.java 4.81 KB
package com.polysoft.nafmii.fragment.dialog;

import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

import com.polysoft.nafmii.bean.Result;
import com.polysoft.nafmii.utils.CtxUtils;
import com.polysoft.nafmii.utils.ToastUtils;
import com.whaty.nafmii.R;

import java.util.Objects;


@TargetApi(23)
public class FingerprintDialog extends DialogFragment {

    private FingerprintManager mFingerprintMgr;
    private CancellationSignal mCancellationSignal;

    private TextView errorMsg;
    private AuthBackListener mAuthBackListener;


    public static void show(FragmentManager manager, AuthBackListener listener) {
        FingerprintDialog dialog = new FingerprintDialog();
        dialog.setAuthBackListener(listener);

        if (dialog.isSupportFingerprint()) {
            dialog.show(manager, "Fingerprint");
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
        super.setCancelable(false);
        this.mFingerprintMgr = CtxUtils.getSystemService(FingerprintManager.class);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fingerprint_dialog, container, false);
        this.errorMsg = view.findViewById(R.id.error_msg);
        view.findViewById(R.id.cancel).setOnClickListener((v) -> cancel());
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        this.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        this.stop();
    }

    public void setAuthBackListener(AuthBackListener listener) {
        this.mAuthBackListener = listener;
    }

    private void start() {
        this.mCancellationSignal = new CancellationSignal();
        mFingerprintMgr.authenticate(null, this.mCancellationSignal, 0, new AuthBackImpl(), null);
    }

    private void stop() {
        if (null != this.mCancellationSignal) {
            this.mCancellationSignal.cancel();
            this.mCancellationSignal = null;
        }
    }

    private void cancel() {
        this.closeBack(Result.success("cancel"));
    }

    private void success() {
        this.closeBack(Result.success("ok"));
    }

    private void error(String error) {
        this.closeBack(Result.fail(error));
    }

    private void closeBack(Result result) {
        super.dismiss();
        if (null != this.mAuthBackListener) {
            this.mAuthBackListener.onAuthBack(result);
        }
    }

    @Override
    public void show(@NonNull FragmentManager manager, @Nullable String tag) {
        super.show(manager, tag);
    }

    private boolean isSupportFingerprint() {
        FingerprintManager fingerprintMgr = CtxUtils.getSystemService(FingerprintManager.class);
        if (null != fingerprintMgr && !fingerprintMgr.isHardwareDetected()) {
            this.error("您的手机不支持指纹功能");
            return false;
        }
        KeyguardManager keyMgr = CtxUtils.getSystemService(KeyguardManager.class);
        if (keyMgr != null && !keyMgr.isKeyguardSecure()) {
            this.error("您还未设置锁屏,请先设置锁屏并添加一个指纹");
            return false;
        }
        if (null != fingerprintMgr && !fingerprintMgr.hasEnrolledFingerprints()) {
            this.error("您至少需要在系统设置中添加一个指纹");
            return false;
        }
        return true;
    }


    private class AuthBackImpl extends FingerprintManager.AuthenticationCallback {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {
            errorMsg.setText(errString);
        }

        @Override
        public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
            errorMsg.setText(helpString);
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            ToastUtils.showLong("认证成功");
            success();
        }

        @Override
        public void onAuthenticationFailed() {
            errorMsg.setText("指纹认证失败,请再试一次");
        }
    }

    public interface AuthBackListener {
        void onAuthBack(Result result);
    }
}