// Signature format: 4.0
package androidx.biometric {

  public class BiometricManager {
    method @Deprecated public int canAuthenticate();
    method public int canAuthenticate(int);
    method public static androidx.biometric.BiometricManager from(android.content.Context);
    field public static final int BIOMETRIC_ERROR_HW_UNAVAILABLE = 1; // 0x1
    field public static final int BIOMETRIC_ERROR_NONE_ENROLLED = 11; // 0xb
    field public static final int BIOMETRIC_ERROR_NO_HARDWARE = 12; // 0xc
    field public static final int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15; // 0xf
    field public static final int BIOMETRIC_ERROR_UNSUPPORTED = -2; // 0xfffffffe
    field public static final int BIOMETRIC_STATUS_UNKNOWN = -1; // 0xffffffff
    field public static final int BIOMETRIC_SUCCESS = 0; // 0x0
  }

  public static interface BiometricManager.Authenticators {
    field public static final int BIOMETRIC_STRONG = 15; // 0xf
    field public static final int BIOMETRIC_WEAK = 255; // 0xff
    field public static final int DEVICE_CREDENTIAL = 32768; // 0x8000
  }

  public class BiometricPrompt {
    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback);
    ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback);
    ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
    ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
    method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
    method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
    method public void cancelAuthentication();
    field public static final int AUTHENTICATION_RESULT_TYPE_BIOMETRIC = 2; // 0x2
    field public static final int AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL = 1; // 0x1
    field public static final int AUTHENTICATION_RESULT_TYPE_UNKNOWN = -1; // 0xffffffff
    field public static final int ERROR_CANCELED = 5; // 0x5
    field public static final int ERROR_HW_NOT_PRESENT = 12; // 0xc
    field public static final int ERROR_HW_UNAVAILABLE = 1; // 0x1
    field public static final int ERROR_LOCKOUT = 7; // 0x7
    field public static final int ERROR_LOCKOUT_PERMANENT = 9; // 0x9
    field public static final int ERROR_NEGATIVE_BUTTON = 13; // 0xd
    field public static final int ERROR_NO_BIOMETRICS = 11; // 0xb
    field public static final int ERROR_NO_DEVICE_CREDENTIAL = 14; // 0xe
    field public static final int ERROR_NO_SPACE = 4; // 0x4
    field public static final int ERROR_SECURITY_UPDATE_REQUIRED = 15; // 0xf
    field public static final int ERROR_TIMEOUT = 3; // 0x3
    field public static final int ERROR_UNABLE_TO_PROCESS = 2; // 0x2
    field public static final int ERROR_USER_CANCELED = 10; // 0xa
    field public static final int ERROR_VENDOR = 8; // 0x8
  }

  public abstract static class BiometricPrompt.AuthenticationCallback {
    ctor public BiometricPrompt.AuthenticationCallback();
    method public void onAuthenticationError(int, CharSequence);
    method public void onAuthenticationFailed();
    method public void onAuthenticationSucceeded(androidx.biometric.BiometricPrompt.AuthenticationResult);
  }

  public static class BiometricPrompt.AuthenticationResult {
    method public int getAuthenticationType();
    method public androidx.biometric.BiometricPrompt.CryptoObject? getCryptoObject();
  }

  public static class BiometricPrompt.CryptoObject {
    ctor public BiometricPrompt.CryptoObject(java.security.Signature);
    ctor public BiometricPrompt.CryptoObject(javax.crypto.Cipher);
    ctor public BiometricPrompt.CryptoObject(javax.crypto.Mac);
    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public BiometricPrompt.CryptoObject(android.security.identity.IdentityCredential);
    method public javax.crypto.Cipher? getCipher();
    method @RequiresApi(android.os.Build.VERSION_CODES.R) public android.security.identity.IdentityCredential? getIdentityCredential();
    method public javax.crypto.Mac? getMac();
    method public java.security.Signature? getSignature();
  }

  public static class BiometricPrompt.PromptInfo {
    method public int getAllowedAuthenticators();
    method public CharSequence? getDescription();
    method public CharSequence getNegativeButtonText();
    method public CharSequence? getSubtitle();
    method public CharSequence getTitle();
    method public boolean isConfirmationRequired();
    method @Deprecated public boolean isDeviceCredentialAllowed();
  }

  public static class BiometricPrompt.PromptInfo.Builder {
    ctor public BiometricPrompt.PromptInfo.Builder();
    method public androidx.biometric.BiometricPrompt.PromptInfo build();
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setAllowedAuthenticators(int);
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
    method @Deprecated public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
  }

}

package androidx.biometric.auth {

  public interface AuthPrompt {
    method public void cancelAuthentication();
  }

  public abstract class AuthPromptCallback {
    ctor public AuthPromptCallback();
    method public void onAuthenticationError(androidx.fragment.app.FragmentActivity?, int, CharSequence);
    method public void onAuthenticationFailed(androidx.fragment.app.FragmentActivity?);
    method public void onAuthenticationSucceeded(androidx.fragment.app.FragmentActivity?, androidx.biometric.BiometricPrompt.AuthenticationResult);
  }

  public class AuthPromptHost {
    ctor public AuthPromptHost(androidx.fragment.app.Fragment);
    ctor public AuthPromptHost(androidx.fragment.app.FragmentActivity);
    method public androidx.fragment.app.FragmentActivity? getActivity();
    method public androidx.fragment.app.Fragment? getFragment();
  }

  public class Class2BiometricAuthPrompt {
    method public CharSequence? getDescription();
    method public CharSequence? getSubtitle();
    method public boolean isConfirmationRequired();
    method public androidx.biometric.auth.AuthPrompt startAuthentication();
  }

  public static final class Class2BiometricAuthPrompt.Builder {
    ctor public Class2BiometricAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, CharSequence, java.util.concurrent.Executor, androidx.biometric.auth.AuthPromptCallback);
    ctor public Class2BiometricAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, CharSequence, androidx.biometric.auth.AuthPromptCallback);
    method public androidx.biometric.auth.Class2BiometricAuthPrompt build();
    method public androidx.biometric.auth.Class2BiometricAuthPrompt.Builder setConfirmationRequired(boolean);
    method public androidx.biometric.auth.Class2BiometricAuthPrompt.Builder setDescription(CharSequence);
    method public androidx.biometric.auth.Class2BiometricAuthPrompt.Builder setSubtitle(CharSequence);
  }

  public class Class2BiometricOrCredentialAuthPrompt {
    method public CharSequence? getDescription();
    method public CharSequence? getSubtitle();
    method public boolean isConfirmationRequired();
    method public androidx.biometric.auth.AuthPrompt startAuthentication();
  }

  public static final class Class2BiometricOrCredentialAuthPrompt.Builder {
    ctor public Class2BiometricOrCredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, java.util.concurrent.Executor, androidx.biometric.auth.AuthPromptCallback);
    ctor public Class2BiometricOrCredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, androidx.biometric.auth.AuthPromptCallback);
    method public androidx.biometric.auth.Class2BiometricOrCredentialAuthPrompt build();
    method public androidx.biometric.auth.Class2BiometricOrCredentialAuthPrompt.Builder setConfirmationRequired(boolean);
    method public androidx.biometric.auth.Class2BiometricOrCredentialAuthPrompt.Builder setDescription(CharSequence);
    method public androidx.biometric.auth.Class2BiometricOrCredentialAuthPrompt.Builder setSubtitle(CharSequence);
  }

  public class Class3BiometricAuthPrompt {
    method public androidx.biometric.BiometricPrompt.CryptoObject? getCrypto();
    method public CharSequence? getDescription();
    method public CharSequence? getSubtitle();
    method public boolean isConfirmationRequired();
    method public androidx.biometric.auth.AuthPrompt startAuthentication();
  }

  public static final class Class3BiometricAuthPrompt.Builder {
    ctor public Class3BiometricAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, CharSequence, java.util.concurrent.Executor, androidx.biometric.auth.AuthPromptCallback);
    ctor public Class3BiometricAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, CharSequence, androidx.biometric.auth.AuthPromptCallback);
    method public androidx.biometric.auth.Class3BiometricAuthPrompt build();
    method public androidx.biometric.auth.Class3BiometricAuthPrompt.Builder setConfirmationRequired(boolean);
    method public androidx.biometric.auth.Class3BiometricAuthPrompt.Builder setCrypto(androidx.biometric.BiometricPrompt.CryptoObject);
    method public androidx.biometric.auth.Class3BiometricAuthPrompt.Builder setDescription(CharSequence);
    method public androidx.biometric.auth.Class3BiometricAuthPrompt.Builder setSubtitle(CharSequence);
  }

  public class Class3BiometricOrCredentialAuthPrompt {
    method public androidx.biometric.BiometricPrompt.CryptoObject? getCrypto();
    method public CharSequence? getDescription();
    method public CharSequence? getSubtitle();
    method public boolean isConfirmationRequired();
    method public androidx.biometric.auth.AuthPrompt startAuthentication();
  }

  public static final class Class3BiometricOrCredentialAuthPrompt.Builder {
    ctor public Class3BiometricOrCredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, java.util.concurrent.Executor, androidx.biometric.auth.AuthPromptCallback);
    ctor public Class3BiometricOrCredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, androidx.biometric.auth.AuthPromptCallback);
    method public androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt build();
    method public androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt.Builder setConfirmationRequired(boolean);
    method public androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt.Builder setCrypto(androidx.biometric.BiometricPrompt.CryptoObject);
    method public androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt.Builder setDescription(CharSequence);
    method public androidx.biometric.auth.Class3BiometricOrCredentialAuthPrompt.Builder setSubtitle(CharSequence);
  }

  public class CredentialAuthPrompt {
    method public androidx.biometric.BiometricPrompt.CryptoObject? getCrypto();
    method public CharSequence? getDescription();
    method public androidx.biometric.auth.AuthPrompt startAuthentication();
  }

  public static final class CredentialAuthPrompt.Builder {
    ctor public CredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, java.util.concurrent.Executor, androidx.biometric.auth.AuthPromptCallback);
    ctor public CredentialAuthPrompt.Builder(androidx.biometric.auth.AuthPromptHost, CharSequence, androidx.biometric.auth.AuthPromptCallback);
    method public androidx.biometric.auth.CredentialAuthPrompt build();
    method public androidx.biometric.auth.CredentialAuthPrompt.Builder setCrypto(androidx.biometric.BiometricPrompt.CryptoObject);
    method public androidx.biometric.auth.CredentialAuthPrompt.Builder setDescription(CharSequence);
  }

}

