Skip to main content

References

This page contains references for several Ozone classes. Most of this can be obtained from the javadoc/clicking into code via Android Studio, but it is also provided here as a reference.

SmartCapture Ozone Result Data

class OzoneResultData {
enum class OzoneResultStatus {
SUCCESS, FAILED, UNKNOWN, NOT_PERFORMED
}

enum class ByteGroup {
DG1, DG2, DG3, DG4, DG5, DG6, DG7, DG8, DG9, DG10, DG11, DG12, DG13, DG14, DG15, SOD, COM
}

enum class AuthStatus {
Success, Failure, Skipped
}

enum class TranslatedDocumentType(private var displayName: String) {
Default("Default"),
NationalPassport("National Passport"),
EmergencyPassport("Emergency Passport"),
DiplomaticPassport("Diplomatic Passport"),
OfficialOrServicePassport("Official/Service Passport"),
RefugeePassport("Refugee Passport"),
AlienPassport("Alien Passport"),
StatelessPassport("Stateless Passport"),
TravelDocument("Travel Document"),
MilitaryPassport("Military Passport");
}

/**
* Place of birth as parsed from DG11.
*
* Note: DG11 is optional and the data in it is also not guaranteed to be filled out. If DG11 is
* not present or if this data is not present in DG11, this field will be null.
*/
var placeOfBirth: String?

/**
* Date of birth as parsed from the MRZ info in DG1.
*/
var dateOfBirthMrz: String

/**
* Date of birth formatted to dd.MM.yyyy.
*
* Note: This is the best possible approximation of the date of birth as could be parsed from a
* combination of DG11 and DG1. Depending on the data present on the chip, there may have been
* an inference made due to incomplete data (if DG11 is not present or lacks date of birth data
* then we only have access to the last two digits of the year. If that is the case, the first
* 2 digits of the year are inferred based on the current date). Use crosschecks for increased
* certainty.
*/
var dateOfBirth: String

/**
* Document expiration date as parsed from the MRZ info in DG1.
*/
var documentExpiryDateMrz: String

/**
* Document expiration date formatted to dd.MM.yyyy.
*
* Note: This is the best possible approximation of the expiration date as could be parsed from
* DG1. DG1 only has the last two digits of the expiration year. The first 2 digits of the year
* are inferred based on the current date. Use crosschecks for increased certainty.
*/
var documentExpiryDate: String

/**
* Document Code as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var documentCode: String

/**
* Issuing Authority as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var issuingAuthority: String

/**
* Document Number as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var documentNumber: String

/**
* Nationality as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var nationality: String

/**
* Personal Number as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var personalNumber: String

/**
* First Name as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var firstName: String

/**
* Last Name as parsed from the MRZ info in DG1 with any '<' chars trimmed off.
*/
var lastName: String

/**
* Document Type as parsed from the MRZ info in DG1. If document code was missing in the MRZ
* info (not expected to ever happen), the value of this field will instead be '?'.
*/
var documentType: String

/**
* Document Subtype as parsed from the MRZ info in DG1. The value of this field will be '<' for
* standard passports or if no subtype data is present.
*/
var documentSubType: String

/**
* This is a parsed enum representation of the data present in [documentType] and
* [documentSubType].
*/
var translatedDocumentType: TranslatedDocumentType

/**
* Gender as as parsed from the gender code in the MRZ info in DG1. Currently returned values
* are "M", "F", or "?" which currently covers all other values. If more gender values get
* defined in the standards they will be added to the possible values.
*/
var gender: String

/**
* This is a parsed integer approximation of the age. This has the same constraints as
* [dateOfBirth]. Use crosschecks for increased certainty.
*/
val age : Int?

/**
* This is a parsed approximation of if the document is expired. This has the same constraints
* as [documentExpiryDate]. Use crosschecks for increased certainty.
*/
val isExpired : Boolean?

/**
* Represents the first face image present in the DG2 block as a [Bitmap]. For a list of all the
* successfully read face images, use [faceImages]. Will be null if no images were successfully
* extracted.
*/
val faceImage: Bitmap?

/**
* Contains all the successfully face images successfully parsed from DG2 as [Bitmap]s. Will be
* an empty list if no images were successfully extracted.
*/
var faceImages: List<Bitmap>

/**
* Contains the signature image extracted from DG7 as a [Bitmap]. Will be null if DG7 was not
* present or if the signature image could not be extracted.
*/
var signatureImage: Bitmap?

/**
* Represents whether BAC was performed as part of the read, and if so whether it succeeded or
* failed.
*/
var BACStatus: AuthStatus

/**
* Represents whether PACE was performed as part of the read, and if so whether it succeeded or
* failed.
*/
var PACEStatus: AuthStatus

/**
* Represents whether Active Authentication was performed as part of the read, and if so
* whether it succeeded or failed.
*/
var activeAuthenticationStatus: AuthStatus

/**
* Represents whether Chip Authentication was performed as part of the read, and if so
* whether it succeeded or failed.
*/
var chipAuthenticationStatus: AuthStatus


/**
* Represents whether data group hashes matched expected hashes as a boolean. True indicates
* all hashes passed. False indicates at least one hash failed.
*/
var passportDataValid: Boolean

/**
* Used to obtain data about any read Data Group as a [ByteArray]. Will return null if that
* data group was not read.
*/
fun getBytes(group: ByteGroup?): ByteArray?

/**
* Returns a map of fields that can be easily parsed as strings with human readable
* representations of the field name as a key. Intended use case is printing to a log or
* presenting to a user as a summary. For other use cases use relevant variables directly.
*/
fun toMap(): Map<String, Any>
}

SmartCapture Ozone Input Data

/**
* Input data for ozone to be able to unlock the NFC chip in a user's passport.
*
* @param documentNumber The document number as read from the MRZ
* @param dateOfBirth The date of birth as read from the MRZ
* @param dateOfExpiration The date of expiration as read from the MRZ
* @param allowScreenshots (optional) Whether screenshots should be allowed while NFC capture is
* happening. (Defaults to true)
* @param countryCode (optional) The country code of the country that issued the document.
* (Currently not used, but might be used in the future to provide better guidance to the user)
*/
class OzoneInputData(
documentNumber: String,
dateOfBirth: String,
dateOfExpiration: String,
allowScreenshots: Boolean = true,
countryCode: String? = null
) : Parcelable