Skip to content

Commit 028628d

Browse files
author
Sergey Yakimchik
committed
Release 5.2
1 parent 7b2eef7 commit 028628d

101 files changed

Lines changed: 3366 additions & 189 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

FaceSample/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ dependencies {
3434

3535
implementation "androidx.recyclerview:recyclerview:1.2.1"
3636

37-
implementation ('com.regula.face:api:5.1.+@aar'){
37+
implementation ('com.regula.face:api:5.2.+@aar'){
3838
transitive = true
3939
}
4040

41-
implementation ('com.regula.face:core:5.1.+@aar')
41+
implementation ('com.regula.face:core:5.2.+@aar')
4242
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{
2+
"objects": [
3+
{
4+
"button": {
5+
"title": "Close",
6+
"tag": 101,
7+
"style": "FaceSdkButtonStyle",
8+
"position": {
9+
"v": 1.6,
10+
"h": 1
11+
},
12+
"padding": {
13+
"start": 25,
14+
"end": 25
15+
},
16+
"image": {
17+
"name": "ic_cross",
18+
"placement": "start",
19+
"padding": 15
20+
}
21+
}
22+
},
23+
{
24+
"label": {
25+
"text": "Text With Start & End Margins, Center Text Alignment, 10% Offset From Bottom",
26+
"fontStyle": "normal",
27+
"fontColor": "#FF000000",
28+
"fontSize": 16,
29+
"fontName": "Arial",
30+
"alignment": "center",
31+
"background": "#CAC9C9C9",
32+
"borderRadius": 8,
33+
"margin": {
34+
"start": 24,
35+
"end": 24
36+
},
37+
"padding": {
38+
"start": 8,
39+
"end": 8,
40+
"top": 8,
41+
"bottom": 8
42+
},
43+
"position": {
44+
"v": 1.8
45+
}
46+
}
47+
},
48+
{
49+
"label": {
50+
"text": "Center your face, turn your head",
51+
"fontStyle": "normal",
52+
"fontColor": "#FF000000",
53+
"fontSize": 16,
54+
"fontName": "Arial",
55+
"alignment": "center",
56+
"margin": {
57+
"start": 70,
58+
"top": 30
59+
}
60+
}
61+
},
62+
{
63+
"image": {
64+
"data": "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",
65+
"background": "#AAFFFFFF",
66+
"borderRadius": 5,
67+
"contentMode": "fill",
68+
"padding": {
69+
"start": 10,
70+
"end": 10,
71+
"top": 10,
72+
"bottom": 10
73+
},
74+
"size": {
75+
"width": 60,
76+
"height": 60
77+
},
78+
"margin": {
79+
"start": 10,
80+
"top": 10
81+
}
82+
}
83+
}
84+
],
85+
"version": "1.0"
86+
}

FaceSample/app/src/main/java/com/regula/facesample/MatchFacesActivity.java

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66
import android.graphics.Bitmap;
77
import android.graphics.drawable.BitmapDrawable;
88
import android.net.Uri;
9+
import android.os.Build;
910
import android.os.Bundle;
1011
import android.provider.MediaStore;
1112
import android.widget.Button;
1213
import android.widget.ImageView;
1314
import android.widget.PopupMenu;
15+
import android.widget.RadioButton;
16+
import android.widget.RadioGroup;
1417
import android.widget.TextView;
1518
import android.widget.Toast;
1619

1720
import com.regula.facesdk.FaceSDK;
1821
import com.regula.facesdk.configuration.FaceCaptureConfiguration;
19-
import com.regula.facesdk.configuration.LivenessConfiguration;
2022
import com.regula.facesdk.enums.ImageType;
2123
import com.regula.facesdk.enums.LivenessStatus;
2224
import com.regula.facesdk.model.MatchFacesImage;
@@ -39,6 +41,8 @@ public class MatchFacesActivity extends Activity {
3941
ImageView imageView1;
4042
ImageView imageView2;
4143

44+
RadioGroup group0, group1;
45+
4246
Button buttonMatch;
4347
Button buttonLiveness;
4448
Button buttonClear;
@@ -59,6 +63,9 @@ public void onCreate(Bundle savedInstanceState) {
5963
imageView2 = findViewById(R.id.imageView2);
6064
imageView2.getLayoutParams().height = 400;
6165

66+
group0 = findViewById(R.id.rbGroup0);
67+
group1 = findViewById(R.id.rbGroup1);
68+
6269
buttonMatch = findViewById(R.id.buttonMatch);
6370
buttonLiveness = findViewById(R.id.buttonLiveness);
6471
buttonClear = findViewById(R.id.buttonClear);
@@ -107,7 +114,12 @@ private void showMenu(ImageView imageView, int i) {
107114
openGallery(i);
108115
return true;
109116
case R.id.camera:
110-
startFaceCaptureActivity(imageView);
117+
RadioGroup radioGroup;
118+
if(i == PICK_IMAGE_1)
119+
radioGroup = group0;
120+
else //if PICK_IMAGE_2
121+
radioGroup = group1;
122+
startFaceCaptureActivity(imageView, radioGroup);
111123
return true;
112124
default:
113125
return false;
@@ -129,18 +141,62 @@ private void openGallery(int id) {
129141
startActivityForResult(gallery, id);
130142
}
131143

132-
private void startFaceCaptureActivity(ImageView imageView) {
144+
private void startFaceCaptureActivity(ImageView imageView, RadioGroup group) {
133145
FaceCaptureConfiguration configuration = new FaceCaptureConfiguration.Builder().setCameraSwitchEnabled(true).build();
134146

135147
FaceSDK.Instance().presentFaceCaptureActivity(MatchFacesActivity.this, configuration, faceCaptureResponse -> {
136148
if (faceCaptureResponse.getImage() == null)
137149
return;
138150

139151
imageView.setImageBitmap(faceCaptureResponse.getImage().getBitmap());
140-
imageView.setTag(ImageType.LIVE);
152+
153+
setGroupSelection(group, ImageType.LIVE);
141154
});
142155
}
143156

157+
private void setGroupSelection(RadioGroup group, ImageType type) {
158+
switch (type){
159+
case LIVE:
160+
group.check(group.getChildAt(2).getId());
161+
break;
162+
case RFID:
163+
group.check(group.getChildAt(1).getId());
164+
break;
165+
case PRINTED:
166+
group.check(group.getChildAt(0).getId());
167+
break;
168+
case EXTERNAL:
169+
group.check(group.getChildAt(4).getId());
170+
break;
171+
case DOCUMENT_WITH_LIVE:
172+
group.check(group.getChildAt(3).getId());
173+
break;
174+
case GHOST_PORTRAIT:
175+
group.check(group.getChildAt(5).getId());
176+
break;
177+
}
178+
}
179+
180+
private ImageType getGroupSelection(RadioGroup group){
181+
RadioButton button = group.findViewById(group.getCheckedRadioButtonId());
182+
int index = group.indexOfChild(button);
183+
switch (index){
184+
case 2:
185+
return ImageType.LIVE;
186+
case 1:
187+
return ImageType.RFID;
188+
case 0:
189+
return ImageType.PRINTED;
190+
case 4:
191+
return ImageType.EXTERNAL;
192+
case 3:
193+
return ImageType.DOCUMENT_WITH_LIVE;
194+
case 5:
195+
return ImageType.GHOST_PORTRAIT;
196+
}
197+
return ImageType.PRINTED;
198+
}
199+
144200
@Override
145201
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
146202
super.onActivityResult(requestCode, resultCode, data);
@@ -152,23 +208,29 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
152208
textViewSimilarity.setText("Similarity: null");
153209

154210
ImageView imageView = null;
211+
RadioGroup group = null;
155212

156-
if (requestCode == PICK_IMAGE_1)
213+
if (requestCode == PICK_IMAGE_1) {
157214
imageView = imageView1;
158-
else if (requestCode == PICK_IMAGE_2)
215+
group = group0;
216+
}
217+
else if (requestCode == PICK_IMAGE_2) {
159218
imageView = imageView2;
219+
group = group1;
220+
}
160221

161222
if (imageView == null)
162223
return;
163224

164225
imageView.setImageURI(imageUri);
165-
imageView.setTag(ImageType.PRINTED);
226+
227+
setGroupSelection(group, ImageType.PRINTED);
166228
}
167229

168230
private void matchFaces(Bitmap first, Bitmap second) {
169231
List<MatchFacesImage> imageList = new ArrayList<>();
170-
imageList.add(new MatchFacesImage(first, (ImageType) imageView1.getTag(), true));
171-
imageList.add(new MatchFacesImage(second, (ImageType) imageView2.getTag(), true));
232+
imageList.add(new MatchFacesImage(first, getGroupSelection(group0), true));
233+
imageList.add(new MatchFacesImage(second, getGroupSelection(group1), true));
172234
MatchFacesRequest matchRequest = new MatchFacesRequest(imageList);
173235

174236
FaceSDK.Instance().matchFaces(matchRequest, matchFacesResponse -> {
@@ -206,4 +268,4 @@ private void startLiveness() {
206268
textViewSimilarity.setText("Similarity: null");
207269
});
208270
}
209-
}
271+
}

FaceSample/app/src/main/java/com/regula/facesample/data/CategoryDataProvider.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
import com.regula.facesample.items.customization.NotificationViewPositionItem;
1717
import com.regula.facesample.items.customization.OverlayCustomItem;
1818
import com.regula.facesample.items.customization.SwapButtonItem;
19+
import com.regula.facesample.items.customization.UICustomizationItem;
1920
import com.regula.facesample.items.features.FaceCaptureCameraPositionItem;
20-
import com.regula.facesample.items.features.FaceCaptureHintAnimationItem;
2121
import com.regula.facesample.items.features.FaceSdkDeinitItem;
2222
import com.regula.facesample.items.features.FaceSdkInitItem;
2323
import com.regula.facesample.items.features.LivenessAttemptsCountItem;
2424
import com.regula.facesample.items.features.LivenessDisableStepItem;
25-
import com.regula.facesample.items.features.LivenessHintAnimationItem;
2625
import com.regula.facesample.items.features.LivenessSessionIdItem;
2726
import com.regula.facesample.items.other.LocalizationItem;
2827
import com.regula.facesample.items.other.NetworkInterceptorItem;
@@ -57,9 +56,7 @@ public String getTitle() {
5756
}
5857
},
5958
new LivenessAttemptsCountItem(),
60-
new LivenessHintAnimationItem(),
6159
new FaceCaptureCameraPositionItem(),
62-
new FaceCaptureHintAnimationItem(),
6360
new LivenessDisableStepItem(),
6461
new LivenessSessionIdItem(),
6562
new FaceSdkInitItem(),
@@ -82,6 +79,7 @@ public String getTitle() {
8279
new AdvancedCustomItem(),
8380
new OverlayCustomItem(),
8481
new LivenessProcessingCustomItem(),
82+
new UICustomizationItem(),
8583
new HeaderItem() {
8684
@Override
8785
public String getTitle() {
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.regula.facesample.items.customization;
2+
3+
import android.animation.ValueAnimator;
4+
import android.content.Context;
5+
import android.view.animation.AccelerateInterpolator;
6+
7+
import com.regula.facesample.items.CategoryItem;
8+
import com.regula.facesdk.FaceSDK;
9+
import com.regula.facesdk.configuration.LivenessConfiguration;
10+
11+
import org.json.JSONException;
12+
import org.json.JSONObject;
13+
14+
import java.io.IOException;
15+
import java.io.InputStream;
16+
import java.util.Scanner;
17+
18+
public class UICustomizationItem extends CategoryItem {
19+
20+
@Override
21+
public void onItemSelected(Context context) {
22+
ValueAnimator mTimerAnimator = ValueAnimator.ofFloat(0.9f, 0.1f);
23+
24+
JSONObject jsonObject = getJsonFromAssets(context, "layer.json");
25+
26+
LivenessConfiguration configuration = new LivenessConfiguration.Builder()
27+
.setCloseButtonEnabled(false)
28+
.build();
29+
30+
FaceSDK.Instance().getCustomization().setUiCustomizationLayer(jsonObject);
31+
32+
FaceSDK.Instance().setOnClickListener(view -> {
33+
if ((int) view.getTag() == 101) {
34+
FaceSDK.Instance().stopLivenessProcessing(context);
35+
mTimerAnimator.cancel();
36+
}
37+
});
38+
39+
FaceSDK.Instance().startLiveness(context, configuration, livenessResponse -> {
40+
FaceSDK.Instance().getCustomization().setUiCustomizationLayer(null);
41+
if (mTimerAnimator != null)
42+
mTimerAnimator.cancel();
43+
});
44+
45+
initAnimation(mTimerAnimator, jsonObject);
46+
}
47+
48+
private JSONObject getJsonFromAssets(Context context, String name) {
49+
try {
50+
InputStream inputStream = context.getAssets().open(name);
51+
String jsonString = new Scanner(inputStream).useDelimiter("\\A").next();
52+
return new JSONObject(jsonString);
53+
} catch (IOException | JSONException e) {
54+
e.printStackTrace();
55+
}
56+
return null;
57+
}
58+
59+
private void initAnimation(ValueAnimator mTimerAnimator, JSONObject jsonObject) {
60+
mTimerAnimator.setDuration(1000);
61+
mTimerAnimator.setInterpolator(new AccelerateInterpolator());
62+
mTimerAnimator.setRepeatMode(ValueAnimator.REVERSE);
63+
mTimerAnimator.setRepeatCount(20);
64+
mTimerAnimator.addUpdateListener(valueAnimator -> {
65+
updatePosition(jsonObject, (float) valueAnimator.getAnimatedValue());
66+
FaceSDK.Instance().getCustomization().setUiCustomizationLayer(jsonObject);
67+
});
68+
mTimerAnimator.start();
69+
}
70+
71+
private void updatePosition(JSONObject jsonObject, Float position) {
72+
if (jsonObject != null) {
73+
try {
74+
((JSONObject) jsonObject.getJSONArray("objects").get(3)).getJSONObject("image")
75+
.put("alpha", position);
76+
} catch (JSONException e) {
77+
e.printStackTrace();
78+
}
79+
}
80+
}
81+
82+
@Override
83+
public String getDescription() {
84+
return "Custom labels, images and buttons to the camera screen";
85+
}
86+
87+
@Override
88+
public String getTitle() {
89+
return "Custom UI layer";
90+
}
91+
}

0 commit comments

Comments
 (0)