-
Notifications
You must be signed in to change notification settings - Fork 19
/
NFCResult.kt
136 lines (132 loc) · 6.85 KB
/
NFCResult.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright (C) 2020 Newlogic Pte. Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*
*/
package org.idpass.smartscanner.lib.nfc
import org.idpass.smartscanner.lib.nfc.passport.Passport
import org.idpass.smartscanner.lib.platform.extension.arrayToString
import org.idpass.smartscanner.lib.platform.utils.DateUtils
import org.idpass.smartscanner.lib.platform.utils.DateUtils.formatStandardDate
import org.idpass.smartscanner.lib.platform.utils.LanguageUtils.isRTL
import org.idpass.smartscanner.lib.scanner.config.Language.Locale
import org.jmrtd.lds.icao.MRZInfo
data class NFCResult(
val image: String? = null,
val mrzImage: String? = null,
var givenNames: String? = null,
var surname: String? = null,
var nameOfHolder: String? = null,
var dateOfBirth: String? = null,
var gender: String? = null,
var documentNumber: String? = null,
var dateOfExpiry: String? = null,
var issuingState: String? = null,
var nationality: String? = null,
var otherNames: String? = null,
var custodyInformation: String? = null,
var profession: String? = null,
var telephone: String? = null,
var title: String? = null,
var dateAndTimeOfPersonalization: String? = null,
var dateOfIssue: String? = null,
var endorsementsAndObservations: String? = null,
var issuingAuthority: String? = null,
var personalizationSystemSerialNumber: String? = null,
var taxOrExitRequirements: String? = null,
var mrzOptional: String? = null,
var mrzOptional2: String? = null
) {
companion object {
fun formatResult(passport: Passport?, locale: String?, mrzInfo: MRZInfo? = null, image: String? = null, mrzImage: String? = null): NFCResult {
val personDetails = passport?.personDetails
val additionalPersonDetails = passport?.additionalPersonDetails
val additionalDocumentDetails = passport?.additionalDocumentDetails
var surname : String? = ""
var givenNames : String? = ""
// Note: In getting proper names
// we split nameOfHolder to two parts separated by '<<' (double chevron)
// one part of nameOfHolder should contain last names/surname
// other part remaining of nameOfHolder should contain given names
// in which multiple names are separated by '<' (single chevron)
val nameOfHolder = additionalPersonDetails?.nameOfHolder
if (isRTL(nameOfHolder) || locale == Locale.RTL) {
// For RTL languages, surname are on the last part of nameOfHolder and first part for given names
// NFCResult.nameOfHolder --> GIVEN_NAME1<GIVEN_NAME2<<LAST_NAME1<LAST_NAME2 (RTL for Arabic)
if (nameOfHolder?.contains("<<") == true) {
val parts = nameOfHolder.split("<<").toMutableList()
surname = parts.lastOrNull()?.replace("<", " ")
parts.apply {
removeAt(parts.size - 1)
forEach { name ->
givenNames = name.replace("<", " ")
}
}
} else {
// When surname is not available, set to null
surname = null
givenNames = nameOfHolder?.replace("<", " ")?.trim()
}
} else {
// For LTR languages, surname are on the first part of nameOfHolder and last part for given names
// NFCResult.nameOfHolder --> LAST_NAME1<LAST_NAME2<<GIVEN_NAME1<GIVEN_NAME2
if (nameOfHolder?.contains("<<") == true) {
val parts = nameOfHolder.split("<<").toMutableList()
surname = parts.firstOrNull()?.replace("<", " ")
parts.apply {
removeAt(0) // remove first item
forEach { name ->
givenNames = name.replace("<", " ")
}
}
} else {
// When surname is not available, set to null
surname = null
givenNames = nameOfHolder?.replace("<", " ")?.trim()
}
}
// Get proper date of birth
val dateOfBirth = if (additionalPersonDetails?.fullDateOfBirth.isNullOrEmpty()) {
DateUtils.toAdjustedDate (formatStandardDate(personDetails?.dateOfBirth))
} else formatStandardDate(additionalPersonDetails?.fullDateOfBirth, "yyyyMMdd")
return NFCResult(
image = image,
mrzImage = mrzImage,
givenNames = givenNames,
surname = surname,
nameOfHolder = additionalPersonDetails?.nameOfHolder,
gender = personDetails?.gender?.name,
documentNumber = personDetails?.documentNumber,
dateOfExpiry = DateUtils.toReadableDate(formatStandardDate(personDetails?.dateOfExpiry)),
issuingState = personDetails?.issuingState,
nationality = personDetails?.nationality,
otherNames = additionalPersonDetails?.otherNames?.arrayToString(),
dateOfBirth = dateOfBirth,
custodyInformation = additionalPersonDetails?.custodyInformation,
profession = additionalPersonDetails?.profession,
telephone = additionalPersonDetails?.telephone,
title = additionalPersonDetails?.title,
dateAndTimeOfPersonalization = additionalDocumentDetails?.dateAndTimeOfPersonalization,
dateOfIssue = formatStandardDate(additionalDocumentDetails?.dateOfIssue, "yyyyMMdd"),
endorsementsAndObservations = additionalDocumentDetails?.endorsementsAndObservations,
issuingAuthority = additionalDocumentDetails?.issuingAuthority,
personalizationSystemSerialNumber = additionalDocumentDetails?.personalizationSystemSerialNumber,
taxOrExitRequirements = additionalDocumentDetails?.taxOrExitRequirements,
mrzOptional = mrzInfo?.optionalData1,
mrzOptional2 = mrzInfo?.optionalData2
)
}
}
}