Want to track your users' login behavior? The Android SDK lets you easily track whether users log in via device recognition or with their pin/password credentials. With this info, you can optimize your login screen and get even more users on board.

Due to technical restrictions, it is difficult to distinguish the type of device recognition used (for example, fingerprint vs facial). It is possible to detect the preferred login type, though.

//Username and password login(email login):
    view.findViewById<Button>(R.id.login_button).setOnClickListener {
        if (!validate()) {
            onSignupFailed()
            return
        }
   
        //Tracking event is sent if inpuit is valid
        val params: LinkedHashMap<String, String> = LinkedHashMap()
        params.put("ck2", "screen_name")
        params.put("ck5", "login_mail")
        Webtrekk.getInstance().trackCustomEvent("click.button", params)
    }
   
//Biometric login:
    private val authenticationCallback = object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationError(errorCode: Int,
                errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            Toast.makeText(applicationContext,
                "Authentication error: $errString", Toast.LENGTH_SHORT)
                .show()
        }
   
        override fun onAuthenticationSucceeded(
                result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            Toast.makeText(applicationContext,
                "Authentication succeeded!", Toast.LENGTH_SHORT)
                .show()
   
            //Tracking event is sent on authentication success
            val params: LinkedHashMap<String, String> = LinkedHashMap()
            params.put("ck2", "screen_name")
            params.put("ck5", "biometric_login")
            Webtrekk.getInstance().trackCustomEvent("click.button", params)
        }
   
        override fun onAuthenticationFailed() {
            super.onAuthenticationFailed()
            Toast.makeText(applicationContext, "Authentication failed",
                Toast.LENGTH_SHORT)
                .show()
        }
    }
JAVA
//Username and password login(email login):
view.findViewById(R.id.login_button).setOnClickListener(v -> {
if (!validate()) {
onSignupFailed();
return;
}

//Tracking event is sent if input is valid
Map<String, String> params = new LinkedHashMap<>();
params.put("ck2", "screen_name");
params.put("ck5", "login_mail");
Webtrekk.getInstance().trackCustomEvent("click.button", params);
});

//Biometric login:
BiometricPrompt.AuthenticationCallback authenticationCallback = new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode,
@NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
Toast.makeText(getApplicationContext(),
"Authentication error: " + errString, Toast.LENGTH_SHORT)
.show();
}

@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
Toast.makeText(getApplicationContext(),
"Authentication succeeded!", Toast.LENGTH_SHORT).show();

//Tracking event is sent on authentication success
Map<String, String> params = new LinkedHashMap<>();
params.put("ck2", "screen_name");
params.put("ck5", "biometric_login");
Webtrekk.getInstance().trackCustomEvent("click.button", params);
}

@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Toast.makeText(getApplicationContext(), "Authentication failed",
Toast.LENGTH_SHORT)
.show();
}
};
JAVA