Skip to content

Commit fa1f6bf

Browse files
committed
Added display of date on captured cards
1 parent effb48d commit fa1f6bf

File tree

11 files changed

+337
-6
lines changed

11 files changed

+337
-6
lines changed

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ dependencies {
3232
implementation("com.microblink:blinkid:$rootProject.blinkidVersion@aar") {
3333
transitive = true
3434
}
35+
implementation 'androidx.appcompat:appcompat:1.1.0'
36+
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
3537
}

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
android:roundIcon="@mipmap/ic_launcher_round"
1515
android:supportsRtl="true"
1616
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
17-
<activity android:name=".AboutActivity" android:label="@string/about"></activity>
17+
<activity android:name=".DocumentDetailsActivity"></activity>
18+
<activity
19+
android:name=".AboutActivity"
20+
android:label="@string/about" />
1821
<activity
1922
android:name=".ScoreTableActivity"
2023
android:label="@string/score_explanation" />
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.appliedrec.credentials.app;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
import com.microblink.entities.recognizers.blinkid.generic.BlinkIdCombinedRecognizer;
7+
import com.microblink.entities.recognizers.blinkid.usdl.UsdlCombinedRecognizer;
8+
9+
public class DocumentData implements Parcelable {
10+
11+
private String firstName;
12+
private String lastName;
13+
private String address;
14+
private String dateOfBirth;
15+
private String dateOfExpiry;
16+
private String dateOfIssue;
17+
private String documentNumber;
18+
private String sex;
19+
20+
public DocumentData(UsdlCombinedRecognizer.Result result) {
21+
firstName = result.getFirstName();
22+
lastName = result.getLastName();
23+
address = result.getAddress();
24+
dateOfBirth = result.getDateOfBirth().getOriginalDateString();
25+
dateOfExpiry = result.getDateOfExpiry().getOriginalDateString();
26+
dateOfIssue = result.getDateOfIssue().getOriginalDateString();
27+
documentNumber = result.getDocumentNumber();
28+
sex = result.getSex();
29+
}
30+
31+
public DocumentData(BlinkIdCombinedRecognizer.Result result) {
32+
firstName = result.getFirstName();
33+
lastName = result.getLastName();
34+
address = result.getAddress();
35+
dateOfBirth = result.getDateOfBirth().getOriginalDateString();
36+
dateOfExpiry = result.getDateOfExpiry().getOriginalDateString();
37+
dateOfIssue = result.getDateOfIssue().getOriginalDateString();
38+
documentNumber = result.getDocumentNumber();
39+
sex = result.getSex();
40+
}
41+
42+
protected DocumentData(Parcel in) {
43+
firstName = in.readString();
44+
lastName = in.readString();
45+
address = in.readString();
46+
dateOfBirth = in.readString();
47+
dateOfExpiry = in.readString();
48+
dateOfIssue = in.readString();
49+
documentNumber = in.readString();
50+
sex = in.readString();
51+
}
52+
53+
public static final Creator<DocumentData> CREATOR = new Creator<DocumentData>() {
54+
@Override
55+
public DocumentData createFromParcel(Parcel in) {
56+
return new DocumentData(in);
57+
}
58+
59+
@Override
60+
public DocumentData[] newArray(int size) {
61+
return new DocumentData[size];
62+
}
63+
};
64+
65+
public String getFirstName() {
66+
return firstName;
67+
}
68+
69+
public String getLastName() {
70+
return lastName;
71+
}
72+
73+
public String getAddress() {
74+
return address;
75+
}
76+
77+
public String getDateOfBirth() {
78+
return dateOfBirth;
79+
}
80+
81+
public String getDateOfExpiry() {
82+
return dateOfExpiry;
83+
}
84+
85+
public String getDateOfIssue() {
86+
return dateOfIssue;
87+
}
88+
89+
public String getDocumentNumber() {
90+
return documentNumber;
91+
}
92+
93+
public String getSex() {
94+
return sex;
95+
}
96+
97+
@Override
98+
public int describeContents() {
99+
return 0;
100+
}
101+
102+
@Override
103+
public void writeToParcel(Parcel parcel, int i) {
104+
parcel.writeString(firstName);
105+
parcel.writeString(lastName);
106+
parcel.writeString(address);
107+
parcel.writeString(dateOfBirth);
108+
parcel.writeString(dateOfExpiry);
109+
parcel.writeString(dateOfIssue);
110+
parcel.writeString(documentNumber);
111+
parcel.writeString(sex);
112+
}
113+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.appliedrec.credentials.app;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.os.Bundle;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.TextView;
10+
11+
import androidx.annotation.NonNull;
12+
import androidx.appcompat.app.AppCompatActivity;
13+
import androidx.core.util.Pair;
14+
import androidx.recyclerview.widget.LinearLayoutManager;
15+
import androidx.recyclerview.widget.RecyclerView;
16+
17+
import java.util.ArrayList;
18+
19+
public class DocumentDetailsActivity extends AppCompatActivity {
20+
21+
static class DocumentPropertyViewHolder extends RecyclerView.ViewHolder {
22+
23+
private TextView keyTextView;
24+
private TextView valueTextView;
25+
26+
public DocumentPropertyViewHolder(@NonNull View itemView) {
27+
super(itemView);
28+
keyTextView = itemView.findViewById(R.id.key);
29+
valueTextView = itemView.findViewById(R.id.value);
30+
}
31+
32+
void bind(String name, String value) {
33+
keyTextView.setText(name);
34+
valueTextView.setText(value);
35+
}
36+
}
37+
38+
static class DocumentDetailsAdapter extends RecyclerView.Adapter<DocumentPropertyViewHolder> {
39+
40+
private LayoutInflater layoutInflater;
41+
private ArrayList<Pair<String,String>> documentProperties;
42+
43+
DocumentDetailsAdapter(Context context, ArrayList<Pair<String,String>> documentProperties) {
44+
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
45+
this.documentProperties = documentProperties;
46+
}
47+
48+
@NonNull
49+
@Override
50+
public DocumentPropertyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
51+
View view = layoutInflater.inflate(R.layout.list_item_doc_property, parent, false);
52+
return new DocumentPropertyViewHolder(view);
53+
}
54+
55+
@Override
56+
public void onBindViewHolder(@NonNull DocumentPropertyViewHolder holder, int position) {
57+
Pair<String,String> pair = documentProperties.get(position);
58+
holder.bind(pair.first, pair.second);
59+
}
60+
61+
@Override
62+
public int getItemCount() {
63+
return documentProperties.size();
64+
}
65+
}
66+
67+
@Override
68+
protected void onCreate(Bundle savedInstanceState) {
69+
super.onCreate(savedInstanceState);
70+
setContentView(R.layout.activity_document_details);
71+
RecyclerView recyclerView = findViewById(R.id.recyclerView);
72+
Intent intent = getIntent();
73+
if (intent != null) {
74+
DocumentData documentData = intent.getParcelableExtra(IDCardActivity.EXTRA_DOCUMENT_DATA);
75+
if (documentData != null) {
76+
ArrayList<Pair<String,String>> properties = new ArrayList<>();
77+
if (documentData.getFirstName() != null && !documentData.getFirstName().isEmpty()) {
78+
properties.add(new Pair<>("First name", documentData.getFirstName()));
79+
}
80+
if (documentData.getLastName() != null && !documentData.getLastName().isEmpty()) {
81+
properties.add(new Pair<>("Last name", documentData.getLastName()));
82+
}
83+
if (documentData.getDateOfBirth() != null && !documentData.getDateOfBirth().isEmpty()) {
84+
properties.add(new Pair<>("Date of birth", documentData.getDateOfBirth()));
85+
}
86+
if (documentData.getSex() != null && !documentData.getSex().isEmpty()) {
87+
properties.add(new Pair<>("Sex", documentData.getSex()));
88+
}
89+
if (documentData.getAddress() != null && !documentData.getAddress().isEmpty()) {
90+
properties.add(new Pair<>("Address", documentData.getAddress()));
91+
}
92+
if (documentData.getDateOfIssue() != null && !documentData.getDateOfIssue().isEmpty()) {
93+
properties.add(new Pair<>("Date of issue", documentData.getDateOfIssue()));
94+
}
95+
if (documentData.getDateOfExpiry() != null && !documentData.getDateOfExpiry().isEmpty()) {
96+
properties.add(new Pair<>("Date of expiry", documentData.getDateOfExpiry()));
97+
}
98+
if (documentData.getDocumentNumber() != null && !documentData.getDocumentNumber().isEmpty()) {
99+
properties.add(new Pair<>("Document number", documentData.getDocumentNumber()));
100+
}
101+
recyclerView.setLayoutManager(new LinearLayoutManager(this));
102+
recyclerView.setHasFixedSize(true);
103+
DocumentDetailsAdapter adapter = new DocumentDetailsAdapter(this, properties);
104+
recyclerView.setAdapter(adapter);
105+
}
106+
}
107+
}
108+
}

app/src/main/java/com/appliedrec/credentials/app/IDCardActivity.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import android.graphics.Bitmap;
55
import android.graphics.BitmapFactory;
66
import android.os.Bundle;
7+
import android.view.Menu;
8+
import android.view.MenuItem;
79
import android.widget.ImageView;
810

11+
import androidx.annotation.NonNull;
912
import androidx.annotation.Nullable;
1013
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
1114
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
@@ -25,8 +28,10 @@
2528
public class IDCardActivity extends RxVerIDActivity {
2629

2730
public static final String EXTRA_DETECTED_FACE = "com.appliedrec.verid.EXTRA_DETECTED_FACE";
31+
public static final String EXTRA_DOCUMENT_DATA = "com.appliedrec.verid.EXTRA_DOCUMENT_DATA";
2832
private static final int REQUEST_CODE_LIVE_FACE = 1;
2933
private DetectedFace cardFace;
34+
private DocumentData documentData;
3035

3136
@Override
3237
protected void onCreate(Bundle savedInstanceState) {
@@ -53,10 +58,36 @@ protected void onCreate(Bundle savedInstanceState) {
5358
}
5459
));
5560
}
61+
documentData = intent.getParcelableExtra(EXTRA_DOCUMENT_DATA);
62+
invalidateOptionsMenu();
5663
}
5764
findViewById(R.id.button).setOnClickListener(v -> startLivenessDetection());
5865
}
5966

67+
@Override
68+
public boolean onCreateOptionsMenu(Menu menu) {
69+
getMenuInflater().inflate(R.menu.card, menu);
70+
return true;
71+
}
72+
73+
@Override
74+
public boolean onPrepareOptionsMenu(Menu menu) {
75+
menu.findItem(R.id.action_details).setVisible(documentData != null && cardFace != null && cardFace.getImageUri() != null);
76+
return true;
77+
}
78+
79+
@Override
80+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
81+
if (item.getItemId() == R.id.action_details) {
82+
Intent intent = new Intent(this, DocumentDetailsActivity.class);
83+
intent.putExtra(EXTRA_DOCUMENT_DATA, documentData);
84+
// intent.putExtra(EXTRA_DETECTED_FACE, cardFace);
85+
startActivity(intent);
86+
return true;
87+
}
88+
return super.onOptionsItemSelected(item);
89+
}
90+
6091
@Override
6192
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
6293
super.onActivityResult(requestCode, resultCode, data);

app/src/main/java/com/appliedrec/credentials/app/MainActivity.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class MainActivity extends RxVerIDActivity {
3838
private RecognizerBundle recognizerBundle;
3939
private ProgressBar progressBar;
4040
private Group mainUIGroup;
41+
private DocumentData documentData;
4142

4243
@Override
4344
protected void onCreate(Bundle savedInstanceState) {
@@ -101,10 +102,15 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
101102
SuccessFrameGrabberRecognizer successFrameGrabberRecognizer = (SuccessFrameGrabberRecognizer) firstRecognizer;
102103

103104
byte[] frontImage;
105+
documentData = null;
104106
if (successFrameGrabberRecognizer.getSlaveRecognizer() instanceof UsdlCombinedRecognizer) {
105-
frontImage = ((UsdlCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult().getEncodedFullDocumentImage();
107+
UsdlCombinedRecognizer.Result result = ((UsdlCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult();
108+
frontImage = result.getEncodedFullDocumentImage();
109+
documentData = new DocumentData(result);
106110
} else if (successFrameGrabberRecognizer.getSlaveRecognizer() instanceof BlinkIdCombinedRecognizer) {
107-
frontImage = ((BlinkIdCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult().getEncodedFrontFullDocumentImage();
111+
BlinkIdCombinedRecognizer.Result result = ((BlinkIdCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult();
112+
frontImage = result.getEncodedFrontFullDocumentImage();
113+
documentData = new DocumentData(result);
108114
} else {
109115
return;
110116
}
@@ -189,6 +195,9 @@ private void showCard(DetectedFace face) {
189195
mainUIGroup.setVisibility(View.VISIBLE);
190196
Intent intent = new Intent(this, IDCardActivity.class);
191197
intent.putExtra(IDCardActivity.EXTRA_DETECTED_FACE, face);
198+
if (documentData != null) {
199+
intent.putExtra(IDCardActivity.EXTRA_DOCUMENT_DATA, documentData);
200+
}
192201
startActivity(intent);
193202
}
194203

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context=".DocumentDetailsActivity">
8+
9+
<androidx.recyclerview.widget.RecyclerView
10+
android:id="@+id/recyclerView"
11+
android:layout_width="0dp"
12+
android:layout_height="0dp"
13+
app:layout_constraintBottom_toBottomOf="parent"
14+
app:layout_constraintEnd_toEndOf="parent"
15+
app:layout_constraintStart_toStartOf="parent"
16+
app:layout_constraintTop_toTopOf="parent" />
17+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)