Skip to content

Commit 9647dff

Browse files
authored
Merge pull request #78 from BlinkID/release/v6.13.0
Release/v6.13.0
2 parents 4a6d4dd + dd64610 commit 9647dff

19 files changed

+334
-17
lines changed

BlinkID/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ android {
3838
}
3939

4040
dependencies {
41-
implementation('com.microblink:blinkid:6.12.0@aar') {
41+
implementation('com.microblink:blinkid:6.13.0@aar') {
4242
transitive = true
4343
}
4444
}

BlinkID/android/src/main/java/com/microblink/blinkid/flutter/recognizers/serialization/BlinkIDSerializationUtils.java

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@
3434
import com.microblink.blinkid.entities.recognizers.blinkid.generic.CustomClassRules;
3535
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DetailedFieldType;
3636
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DependentInfo;
37+
import com.microblink.blinkid.entities.recognizers.blinkid.generic.ClassFilter;
3738

38-
39+
import android.os.Parcel;
40+
import androidx.annotation.NonNull;
3941
import org.json.JSONArray;
4042
import org.json.JSONException;
4143
import org.json.JSONObject;
@@ -445,6 +447,69 @@ public static CustomClassRules[] deserializeCustomClassRules(JSONArray jsonArray
445447
return new CustomClassRules[]{};
446448
}
447449
}
450+
451+
public static ClassFilter deserializeClassFilter(JSONObject jsonClassFilter) {
452+
return new ClassFilter() {
453+
@Override
454+
public boolean classFilter(@NonNull ClassInfo classInfo) {
455+
JSONArray jsonIncludeClasses = jsonClassFilter.optJSONArray("includeClasses");
456+
JSONArray jsonExcludeClasses = jsonClassFilter.optJSONArray("excludeClasses");
457+
boolean includeClass = false;
458+
boolean excludeClass = true;
459+
460+
if (jsonIncludeClasses != null) {
461+
if (jsonIncludeClasses.length() > 0) {
462+
for (int x = 0; x < jsonIncludeClasses.length(); x++) {
463+
try {
464+
includeClass = includeClass || matchClassInfo(classInfo, jsonIncludeClasses.getJSONObject(x));
465+
} catch (JSONException e) {}
466+
}
467+
} else {
468+
includeClass = true;
469+
}
470+
} else {
471+
includeClass = true;
472+
}
473+
474+
if (jsonExcludeClasses != null) {
475+
for (int x = 0; x < jsonExcludeClasses.length(); x++) {
476+
try {
477+
excludeClass = excludeClass && !matchClassInfo(classInfo, jsonExcludeClasses.getJSONObject(x));
478+
} catch (JSONException e) {}
479+
}
480+
}
481+
return includeClass && excludeClass;
482+
}
483+
484+
@Override
485+
public int describeContents() {
486+
return 0;
487+
}
488+
489+
@Override
490+
public void writeToParcel(@NonNull Parcel parcel, int i) {
491+
}
492+
};
493+
}
494+
495+
// helper methods for ClassFilter
496+
private static boolean matchClassInfo(ClassInfo classInfo, JSONObject jsonObject) {
497+
Country country = getEnumValue(jsonObject, "country", Country.class);
498+
Type type = getEnumValue(jsonObject, "type", Type.class);
499+
Region region = getEnumValue(jsonObject, "region", Region.class);
500+
501+
return (country == null || classInfo.getCountry() == country) &&
502+
(type == null || classInfo.getType() == type) &&
503+
(region == null || classInfo.getRegion() == region);
504+
}
505+
506+
private static <T extends Enum<T>> T getEnumValue(JSONObject jsonObject, String key, Class<T> enumType) {
507+
try {
508+
return enumType.getEnumConstants()[jsonObject.getInt(key)];
509+
} catch (JSONException | IndexOutOfBoundsException e) {
510+
return null;
511+
}
512+
}
448513

449514
public static JSONArray serializeDependentInfo (DependentInfo[] dependentInfos) throws JSONException {
450515
JSONArray jsonDependentInfos = new JSONArray();

BlinkID/android/src/main/java/com/microblink/blinkid/flutter/recognizers/serialization/BlinkIdMultiSideRecognizerSerialization.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public Recognizer<?> createRecognizer(JSONObject jsonObject) {
1919
recognizer.setAllowUnverifiedMrzResults(jsonObject.optBoolean("allowUnverifiedMrzResults", true));
2020
recognizer.setAnonymizationMode(com.microblink.blinkid.entities.recognizers.blinkid.generic.AnonymizationMode.values()[jsonObject.optInt("anonymizationMode", 3)]);
2121
recognizer.setBlurStrictnessLevel(com.microblink.blinkid.entities.recognizers.blinkid.generic.imageanalysis.StrictnessLevel.values()[jsonObject.optInt("blurStrictnessLevel", 1)]);
22+
recognizer.setClassFilter(BlinkIDSerializationUtils.deserializeClassFilter(jsonObject.optJSONObject("classFilter")));
2223
recognizer.setCombineFrameResults(jsonObject.optBoolean("combineFrameResults", true));
2324
recognizer.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
2425
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
@@ -113,6 +114,7 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
113114
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
114115
jsonResult.put("specificDocumentValidity", BlinkIDSerializationUtils.serializeStringResult(result.getSpecificDocumentValidity()));
115116
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
117+
jsonResult.put("vehicleOwner", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleOwner()));
116118
jsonResult.put("vehicleType", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleType()));
117119
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
118120
} catch (JSONException e) {

BlinkID/android/src/main/java/com/microblink/blinkid/flutter/recognizers/serialization/BlinkIdSingleSideRecognizerSerialization.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public Recognizer<?> createRecognizer(JSONObject jsonObject) {
1818
recognizer.setAllowUnverifiedMrzResults(jsonObject.optBoolean("allowUnverifiedMrzResults", true));
1919
recognizer.setAnonymizationMode(com.microblink.blinkid.entities.recognizers.blinkid.generic.AnonymizationMode.values()[jsonObject.optInt("anonymizationMode", 3)]);
2020
recognizer.setBlurStrictnessLevel(com.microblink.blinkid.entities.recognizers.blinkid.generic.imageanalysis.StrictnessLevel.values()[jsonObject.optInt("blurStrictnessLevel", 1)]);
21+
recognizer.setClassFilter(BlinkIDSerializationUtils.deserializeClassFilter(jsonObject.optJSONObject("classFilter")));
2122
recognizer.setCombineFrameResults(jsonObject.optBoolean("combineFrameResults", true));
2223
recognizer.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
2324
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
@@ -99,6 +100,7 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
99100
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
100101
jsonResult.put("specificDocumentValidity", BlinkIDSerializationUtils.serializeStringResult(result.getSpecificDocumentValidity()));
101102
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
103+
jsonResult.put("vehicleOwner", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleOwner()));
102104
jsonResult.put("vehicleType", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleType()));
103105
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
104106
jsonResult.put("vizResult", BlinkIDSerializationUtils.serializeVizResult(result.getVizResult()));

BlinkID/ios/Classes/BlinkIDFlutterPlugin.m

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
#import "MicroblinkModule/Recognizers/MBRecognizerSerializers.h"
55
#import "MicroblinkModule/Overlays/MBOverlaySettingsSerializers.h"
66
#import "MBSerializationUtils.h"
7+
#import "MBBlinkIDSerializationUtils.h"
78

8-
@interface BlinkIDFlutterPlugin () <MBOverlayViewControllerDelegate, MBScanningRecognizerRunnerDelegate, MBFirstSideFinishedRecognizerRunnerDelegate>
9-
9+
@interface BlinkIDFlutterPlugin () <MBOverlayViewControllerDelegate, MBScanningRecognizerRunnerDelegate, MBFirstSideFinishedRecognizerRunnerDelegate, MBBlinkIdMultiSideRecognizerDelegate, MBBlinkIdSingleSideRecognizerDelegate>
1010

1111
@property (nonatomic, strong) MBRecognizerCollection *recognizerCollection;
1212
@property (nonatomic, strong) MBRecognizerRunner *recognizerRunner;
13+
@property (nonatomic, strong) MBOverlayViewController *overlayVc;
14+
@property (nonatomic, strong) NSDictionary *recognizerCollectionDict;
1315
@property (nonatomic, strong) NSString *backImageBase64String;
1416

1517
@property (nonatomic, strong) FlutterResult result;
@@ -55,22 +57,22 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
5557
self.result = result;
5658

5759
if ([kScanWithCameraMethodName isEqualToString:call.method]) {
58-
NSDictionary *recognizerCollectionDict = call.arguments[@"recognizerCollection"];
60+
_recognizerCollectionDict = call.arguments[@"recognizerCollection"];
5961
NSDictionary *overlaySettingsDict = call.arguments[@"overlaySettings"];
6062
NSDictionary *licenseKeyDict = call.arguments[@"license"];
6163

6264
if ([self setLicenseKey:licenseKeyDict]) {
63-
[self scanWith:recognizerCollectionDict overlaySettingsDict:overlaySettingsDict];
65+
[self scanWith:_recognizerCollectionDict overlaySettingsDict:overlaySettingsDict];
6466
}
6567
}
6668
else if ([kScanWithDirectApiMethodName isEqualToString:call.method]) {
67-
NSDictionary *recognizerCollectionDict = call.arguments[@"recognizerCollection"];
69+
_recognizerCollectionDict = call.arguments[@"recognizerCollection"];
6870
NSString *frontImageBase64String = call.arguments[@"frontImage"];
6971
self.backImageBase64String = call.arguments[@"backImage"];
7072
NSDictionary *licenseKeyDict = call.arguments[@"license"];
7173

7274
if ([self setLicenseKey:licenseKeyDict]) {
73-
[self scanWithDirectApi:recognizerCollectionDict frontImageString:frontImageBase64String];
75+
[self scanWithDirectApi:_recognizerCollectionDict frontImageString:frontImageBase64String];
7476
}
7577
}
7678
else {
@@ -121,9 +123,18 @@ - (void)scanWith:(NSDictionary *)recognizerCollectionDict overlaySettingsDict:(N
121123
self.recognizerCollection = [[MBRecognizerSerializers sharedInstance] deserializeRecognizerCollection:recognizerCollectionDict];
122124
[self setLanguage:overlaySettingsDict];
123125

124-
MBOverlayViewController *overlayVC = [[MBOverlaySettingsSerializers sharedInstance] createOverlayViewController:overlaySettingsDict recognizerCollection:self.recognizerCollection delegate:self];
126+
_overlayVc = [[MBOverlaySettingsSerializers sharedInstance] createOverlayViewController:overlaySettingsDict recognizerCollection:self.recognizerCollection delegate:self];
127+
for (MBRecognizer *recognizer in self.recognizerCollection.recognizerList) {
128+
if([recognizer isKindOfClass:[MBBlinkIdMultiSideRecognizer class]]) {
129+
[(MBBlinkIdMultiSideRecognizer *)recognizer setDelegate:self];
130+
break;
131+
} else if ([recognizer isKindOfClass:[MBBlinkIdSingleSideRecognizer class]]) {
132+
[(MBBlinkIdSingleSideRecognizer *)recognizer setDelegate:self];
133+
break;
134+
}
135+
}
125136

126-
UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:overlayVC];
137+
UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:_overlayVc];
127138

128139
UIViewController *rootViewController = (UINavigationController *) UIApplication.sharedApplication.keyWindow.rootViewController;
129140

@@ -166,6 +177,25 @@ - (void)overlayDidTapClose:(MBOverlayViewController *)overlayViewController {
166177
self.result(@"null");
167178
self.result = nil;
168179
}
180+
- (BOOL)multiSideClassInfoFilter:(nullable MBClassInfo *)classInfo {
181+
return [MBBlinkIDSerializationUtils deserializeClassFilter:self.recognizerCollectionDict classInfo:classInfo];
182+
}
183+
184+
- (void)onMultiSideDocumentSupportStatus:(BOOL)isDocumentSupported {
185+
if([_overlayVc isKindOfClass:[MBBlinkIdOverlayViewController class]]) {
186+
[(MBBlinkIdOverlayViewController *)_overlayVc onDocumentSupportStatus:isDocumentSupported];
187+
}
188+
}
189+
190+
- (BOOL)classInfoFilter:(MBClassInfo *)classInfo {
191+
return [MBBlinkIDSerializationUtils deserializeClassFilter:self.recognizerCollectionDict classInfo:classInfo];
192+
}
193+
194+
- (void)onDocumentSupportStatus:(BOOL)isDocumentSupported {
195+
if([_overlayVc isKindOfClass:[MBBlinkIdOverlayViewController class]]) {
196+
[(MBBlinkIdOverlayViewController *)_overlayVc onDocumentSupportStatus:isDocumentSupported];
197+
}
198+
}
169199

170200
//MARK: DirectAPI scanning
171201
- (void)scanWithDirectApi:(NSDictionary *)recognizerCollectionDict frontImageString:(NSString *)frontImageString {

BlinkID/ios/Classes/MicroblinkModule/MBBlinkIDSerializationUtils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@
3232
+(NSDictionary * _Nonnull) serializeNSDate:(NSDate * _Nullable) value;
3333
+(MBCustomClassRules * _Nonnull) deserializeMBCustomClassRules:(NSDictionary * _Nullable)jsonCustomClassRules;
3434
+(NSMutableArray<NSDictionary *> * _Nullable) serializeDependentInfo:(NSArray<MBDependentInfo *>* _Nullable)dependentInfos;
35+
+ (BOOL)deserializeClassFilter:(NSDictionary * _Nullable)jsonRecognizerCollection classInfo:(MBClassInfo * _Nullable)classInfo;
3536
@end

BlinkID/ios/Classes/MicroblinkModule/MBBlinkIDSerializationUtils.m

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,59 @@ +(NSDictionary *) serializeClassInfo:(MBClassInfo *)classInfo {
136136
};
137137
}
138138

139+
+ (BOOL)deserializeClassFilter:(NSDictionary *)jsonRecognizerCollection classInfo:(MBClassInfo *)classInfo {
140+
BOOL includeClass = NO;
141+
BOOL excludeClass = YES;
142+
NSDictionary *classFilter;
143+
144+
for (NSDictionary *recognizer in jsonRecognizerCollection[@"recognizerArray"]) {
145+
NSString *recognizerType = recognizer[@"recognizerType"];
146+
147+
if ([recognizerType isEqualToString:@"BlinkIdMultiSideRecognizer"] ||
148+
[recognizerType isEqualToString:@"BlinkIdSingleSideRecognizer"]) {
149+
150+
classFilter = recognizer[@"classFilter"];
151+
if (!classFilter) {
152+
return YES;
153+
}
154+
}
155+
}
156+
157+
NSArray *addClassToClassFilter = classFilter[@"includeClasses"];
158+
if (addClassToClassFilter != nil && ![addClassToClassFilter isEqual:[NSNull null]]) {
159+
if ([addClassToClassFilter count] > 0) {
160+
for (int i = 0; i < [addClassToClassFilter count]; i++) {
161+
NSDictionary *jsonClassInfo = addClassToClassFilter[i];
162+
includeClass = includeClass || [self matchClassFilter:jsonClassInfo classInfo:classInfo];
163+
}
164+
} else {
165+
includeClass = YES;
166+
}
167+
} else {
168+
includeClass = YES;
169+
}
170+
171+
NSArray *removeClassFromClassFilter = classFilter[@"excludeClasses"];
172+
if (removeClassFromClassFilter != nil && ![removeClassFromClassFilter isEqual:[NSNull null]]) {
173+
for (int i = 0; i < [removeClassFromClassFilter count]; i++) {
174+
NSDictionary *jsonClassInfo = removeClassFromClassFilter[i];
175+
excludeClass = excludeClass && ![self matchClassFilter:jsonClassInfo classInfo:classInfo];
176+
}
177+
}
178+
return includeClass && excludeClass;
179+
}
180+
181+
+ (BOOL)matchClassFilter:(NSDictionary *)jsonClassFilterInfo classInfo:(MBClassInfo *)classInfo {
182+
183+
NSNumber *country = [jsonClassFilterInfo valueForKey:@"country"];
184+
NSNumber *region = [jsonClassFilterInfo valueForKey:@"region"];
185+
NSNumber *type = [jsonClassFilterInfo valueForKey:@"type"];
186+
187+
return (![self isNotNullandNil:country] || classInfo.country == country.integerValue) &&
188+
(![self isNotNullandNil:type] || classInfo.type == type.integerValue) &&
189+
(![self isNotNullandNil:region]|| classInfo.region == region.integerValue);
190+
}
191+
139192
+(NSDictionary *) serializeVizResult:(MBVizResult *)vizResult {
140193
return @{
141194
@"firstName" : [MBBlinkIDSerializationUtils serializeMBStringResult:vizResult.firstName],
@@ -407,5 +460,8 @@ +(NSNumber *)serializeMBSide:(MBSide) value {
407460

408461
return jsonDependentInfos;
409462
}
463+
+ (BOOL)isNotNullandNil:(NSNumber *)value {
464+
return ![value isEqual:[NSNull null]] && (value != nil);
465+
}
410466

411467
@end

BlinkID/ios/Classes/MicroblinkModule/Recognizers/Wrappers/MBBlinkIdMultiSideRecognizerWrapper.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ -(NSDictionary *) serializeResult {
265265
[jsonResult setValue:[MBSerializationUtils encodeMBImage:self.result.signatureImage] forKey:@"signatureImage"];
266266
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.specificDocumentValidity] forKey:@"specificDocumentValidity"];
267267
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.sponsor] forKey:@"sponsor"];
268+
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleOwner] forKey:@"vehicleOwner"];
268269
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleType] forKey:@"vehicleType"];
269270
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.visaType] forKey:@"visaType"];
270271
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeDependentInfo:self.result.dependentInfos] forKey:@"dependentsInfo"];

BlinkID/ios/Classes/MicroblinkModule/Recognizers/Wrappers/MBBlinkIdSingleSideRecognizerWrapper.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ -(NSDictionary *) serializeResult {
230230
[jsonResult setValue:[MBSerializationUtils encodeMBImage:self.result.signatureImage] forKey:@"signatureImage"];
231231
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.specificDocumentValidity] forKey:@"specificDocumentValidity"];
232232
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.sponsor] forKey:@"sponsor"];
233+
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleOwner] forKey:@"vehicleOwner"];
233234
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleType] forKey:@"vehicleType"];
234235
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.visaType] forKey:@"visaType"];
235236
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeVizResult:self.result.vizResult] forKey:@"vizResult"];

BlinkID/ios/blinkid_flutter.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
Pod::Spec.new do |s|
66
s.name = 'blinkid_flutter'
7-
s.version = '6.12.0'
7+
s.version = '6.13.0'
88
s.summary = 'A new flutter plugin project.'
99
s.description = <<-DESC
1010
A new flutter plugin project.
@@ -18,7 +18,7 @@ A new flutter plugin project.
1818
s.dependency 'Flutter'
1919
s.platform = :ios, '13.0'
2020

21-
s.dependency 'PPBlinkID', '~> 6.12.0'
21+
s.dependency 'PPBlinkID', '~> 6.13.0'
2222

2323
# Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
2424
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }

0 commit comments

Comments
 (0)