'version: 1.10
#Event: Complete (Success As Boolean, ErrorMessage As String)
Sub Class_Globals
Private ctxt As JavaObject
Private BioManager As JavaObject
Private Handler As JavaObject
Private Executor As Object
Private mTarget As Object
Private mEventName As String
Private ion As Object
Private xui As XUI
End Sub
Public Sub Initialize(Target As Object, EventName As String)
mTarget = Target
mEventName = EventName
ctxt.InitializeContext
BioManager = BioManager.InitializeStatic("androidx.biometric.BiometricManager").RunMethod("from", Array(ctxt))
Handler.InitializeNewInstance("android.os.Handler", Null)
Executor = Handler.CreateEvent("java.util.concurrent.Executor", "Executor", Null)
End Sub
'====================================================
' EXECUTOR CALLBACK
'====================================================
Private Sub Executor_Event(MethodName As String, Args() As Object) As Object
If MethodName = "execute" Then
Handler.RunMethod("post", Array(Args(0)))
End If
Return Null
End Sub
'====================================================
' BIOMETRIC CAPABILITY CHECK
'====================================================
Public Sub CanAuthenticate As String
Dim v As Int = BioManager.RunMethod("canAuthenticate", Null)
Select v
Case 0
Return "SUCCESS"
Case 1
Return "UNAVAILABLE"
Case 11
Return "NONE_ENROLLED"
Case 12
Return "NO_HARDWARE"
Case Else
Return "UNKNOWN"
End Select
End Sub
'====================================================
' SHOW BIOMETRIC PROMPT
'====================================================
Public Sub ShowBiometric(Title As String)
Dim Builder As JavaObject
Builder.InitializeNewInstance("androidx.biometric.BiometricPrompt$PromptInfo$Builder", Null)
Builder.RunMethod("setTitle", Array(Title))
Builder.RunMethod("setNegativeButtonText", Array("Cancel"))
Dim Callback As JavaObject
Callback.InitializeNewInstance(Application.PackageName & ".biometricmanager.BiometricPromptAuthentication", Array(Me))
Dim Prompt As JavaObject
Prompt.InitializeNewInstance("androidx.biometric.BiometricPrompt", Array(ctxt, Executor, Callback))
Prompt.RunMethod("authenticate", Array(Builder.RunMethod("build", Null)))
End Sub
Private Sub Auth_Complete(Success As Boolean, ErrorCode As Int, ErrorMessage As String)
CallSubDelayed3(mTarget, mEventName & "_Complete", Success, ErrorMessage)
End Sub
'====================================================
' KEYGUARD FALLBACK
'====================================================
Public Sub ShowKeyGuard(Title As String, Description As String)
Dim km As JavaObject = ctxt.RunMethod("getSystemService", Array("keyguard"))
Dim intent As Intent = km.RunMethod("createConfirmDeviceCredentialIntent", Array(Title, Description))
If intent.IsInitialized = False Then
CallSubDelayed3(mTarget, mEventName & "_Complete", True, "")
Return
End If
StartActivityForResult(intent)
End Sub
Private Sub StartActivityForResult(i As Intent)
Dim jo As JavaObject = GetBA
ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
jo.RunMethod("startActivityForResult", Array As Object(ion, i))
End Sub
Private Sub GetBA As Object
Dim jo As JavaObject = Me
Return jo.RunMethod("getBA", Null)
End Sub
Private Sub ion_Event(MethodName As String, Args() As Object) As Object
Dim Success As Boolean = (Args(0) = -1)
CallSubDelayed3(mTarget, mEventName & "_Complete", Success, "")
Return Null
End Sub
#If java
import androidx.biometric.*;
public static class BiometricPromptAuthentication extends BiometricPrompt.AuthenticationCallback {
private BA ba;
public BiometricPromptAuthentication(B4AClass parent) {
ba = parent.getBA();
}
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
ba.raiseEventFromUI(this, "auth_complete", false, errorCode, errString);
}
@Override
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
ba.raiseEventFromUI(this, "auth_complete", true, 0, "");
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
}
}
#End If