Skip to content

Commit

Permalink
Merge pull request #78 from BlinkID/release/v6.13.0
Browse files Browse the repository at this point in the history
Release/v6.13.0
  • Loading branch information
mparadina authored Jan 3, 2025
2 parents 4a6d4dd + dd64610 commit 9647dff
Show file tree
Hide file tree
Showing 19 changed files with 334 additions and 17 deletions.
2 changes: 1 addition & 1 deletion BlinkID/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ android {
}

dependencies {
implementation('com.microblink:blinkid:6.12.0@aar') {
implementation('com.microblink:blinkid:6.13.0@aar') {
transitive = true
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@
import com.microblink.blinkid.entities.recognizers.blinkid.generic.CustomClassRules;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DetailedFieldType;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DependentInfo;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.ClassFilter;


import android.os.Parcel;
import androidx.annotation.NonNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
Expand Down Expand Up @@ -445,6 +447,69 @@ public static CustomClassRules[] deserializeCustomClassRules(JSONArray jsonArray
return new CustomClassRules[]{};
}
}

public static ClassFilter deserializeClassFilter(JSONObject jsonClassFilter) {
return new ClassFilter() {
@Override
public boolean classFilter(@NonNull ClassInfo classInfo) {
JSONArray jsonIncludeClasses = jsonClassFilter.optJSONArray("includeClasses");
JSONArray jsonExcludeClasses = jsonClassFilter.optJSONArray("excludeClasses");
boolean includeClass = false;
boolean excludeClass = true;

if (jsonIncludeClasses != null) {
if (jsonIncludeClasses.length() > 0) {
for (int x = 0; x < jsonIncludeClasses.length(); x++) {
try {
includeClass = includeClass || matchClassInfo(classInfo, jsonIncludeClasses.getJSONObject(x));
} catch (JSONException e) {}
}
} else {
includeClass = true;
}
} else {
includeClass = true;
}

if (jsonExcludeClasses != null) {
for (int x = 0; x < jsonExcludeClasses.length(); x++) {
try {
excludeClass = excludeClass && !matchClassInfo(classInfo, jsonExcludeClasses.getJSONObject(x));
} catch (JSONException e) {}
}
}
return includeClass && excludeClass;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(@NonNull Parcel parcel, int i) {
}
};
}

// helper methods for ClassFilter
private static boolean matchClassInfo(ClassInfo classInfo, JSONObject jsonObject) {
Country country = getEnumValue(jsonObject, "country", Country.class);
Type type = getEnumValue(jsonObject, "type", Type.class);
Region region = getEnumValue(jsonObject, "region", Region.class);

return (country == null || classInfo.getCountry() == country) &&
(type == null || classInfo.getType() == type) &&
(region == null || classInfo.getRegion() == region);
}

private static <T extends Enum<T>> T getEnumValue(JSONObject jsonObject, String key, Class<T> enumType) {
try {
return enumType.getEnumConstants()[jsonObject.getInt(key)];
} catch (JSONException | IndexOutOfBoundsException e) {
return null;
}
}

public static JSONArray serializeDependentInfo (DependentInfo[] dependentInfos) throws JSONException {
JSONArray jsonDependentInfos = new JSONArray();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public Recognizer<?> createRecognizer(JSONObject jsonObject) {
recognizer.setAllowUnverifiedMrzResults(jsonObject.optBoolean("allowUnverifiedMrzResults", true));
recognizer.setAnonymizationMode(com.microblink.blinkid.entities.recognizers.blinkid.generic.AnonymizationMode.values()[jsonObject.optInt("anonymizationMode", 3)]);
recognizer.setBlurStrictnessLevel(com.microblink.blinkid.entities.recognizers.blinkid.generic.imageanalysis.StrictnessLevel.values()[jsonObject.optInt("blurStrictnessLevel", 1)]);
recognizer.setClassFilter(BlinkIDSerializationUtils.deserializeClassFilter(jsonObject.optJSONObject("classFilter")));
recognizer.setCombineFrameResults(jsonObject.optBoolean("combineFrameResults", true));
recognizer.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
Expand Down Expand Up @@ -113,6 +114,7 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
jsonResult.put("specificDocumentValidity", BlinkIDSerializationUtils.serializeStringResult(result.getSpecificDocumentValidity()));
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
jsonResult.put("vehicleOwner", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleOwner()));
jsonResult.put("vehicleType", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleType()));
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
} catch (JSONException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public Recognizer<?> createRecognizer(JSONObject jsonObject) {
recognizer.setAllowUnverifiedMrzResults(jsonObject.optBoolean("allowUnverifiedMrzResults", true));
recognizer.setAnonymizationMode(com.microblink.blinkid.entities.recognizers.blinkid.generic.AnonymizationMode.values()[jsonObject.optInt("anonymizationMode", 3)]);
recognizer.setBlurStrictnessLevel(com.microblink.blinkid.entities.recognizers.blinkid.generic.imageanalysis.StrictnessLevel.values()[jsonObject.optInt("blurStrictnessLevel", 1)]);
recognizer.setClassFilter(BlinkIDSerializationUtils.deserializeClassFilter(jsonObject.optJSONObject("classFilter")));
recognizer.setCombineFrameResults(jsonObject.optBoolean("combineFrameResults", true));
recognizer.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
Expand Down Expand Up @@ -99,6 +100,7 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
jsonResult.put("specificDocumentValidity", BlinkIDSerializationUtils.serializeStringResult(result.getSpecificDocumentValidity()));
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
jsonResult.put("vehicleOwner", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleOwner()));
jsonResult.put("vehicleType", BlinkIDSerializationUtils.serializeStringResult(result.getVehicleType()));
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
jsonResult.put("vizResult", BlinkIDSerializationUtils.serializeVizResult(result.getVizResult()));
Expand Down
46 changes: 38 additions & 8 deletions BlinkID/ios/Classes/BlinkIDFlutterPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
#import "MicroblinkModule/Recognizers/MBRecognizerSerializers.h"
#import "MicroblinkModule/Overlays/MBOverlaySettingsSerializers.h"
#import "MBSerializationUtils.h"
#import "MBBlinkIDSerializationUtils.h"

@interface BlinkIDFlutterPlugin () <MBOverlayViewControllerDelegate, MBScanningRecognizerRunnerDelegate, MBFirstSideFinishedRecognizerRunnerDelegate>

@interface BlinkIDFlutterPlugin () <MBOverlayViewControllerDelegate, MBScanningRecognizerRunnerDelegate, MBFirstSideFinishedRecognizerRunnerDelegate, MBBlinkIdMultiSideRecognizerDelegate, MBBlinkIdSingleSideRecognizerDelegate>

@property (nonatomic, strong) MBRecognizerCollection *recognizerCollection;
@property (nonatomic, strong) MBRecognizerRunner *recognizerRunner;
@property (nonatomic, strong) MBOverlayViewController *overlayVc;
@property (nonatomic, strong) NSDictionary *recognizerCollectionDict;
@property (nonatomic, strong) NSString *backImageBase64String;

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

if ([kScanWithCameraMethodName isEqualToString:call.method]) {
NSDictionary *recognizerCollectionDict = call.arguments[@"recognizerCollection"];
_recognizerCollectionDict = call.arguments[@"recognizerCollection"];
NSDictionary *overlaySettingsDict = call.arguments[@"overlaySettings"];
NSDictionary *licenseKeyDict = call.arguments[@"license"];

if ([self setLicenseKey:licenseKeyDict]) {
[self scanWith:recognizerCollectionDict overlaySettingsDict:overlaySettingsDict];
[self scanWith:_recognizerCollectionDict overlaySettingsDict:overlaySettingsDict];
}
}
else if ([kScanWithDirectApiMethodName isEqualToString:call.method]) {
NSDictionary *recognizerCollectionDict = call.arguments[@"recognizerCollection"];
_recognizerCollectionDict = call.arguments[@"recognizerCollection"];
NSString *frontImageBase64String = call.arguments[@"frontImage"];
self.backImageBase64String = call.arguments[@"backImage"];
NSDictionary *licenseKeyDict = call.arguments[@"license"];

if ([self setLicenseKey:licenseKeyDict]) {
[self scanWithDirectApi:recognizerCollectionDict frontImageString:frontImageBase64String];
[self scanWithDirectApi:_recognizerCollectionDict frontImageString:frontImageBase64String];
}
}
else {
Expand Down Expand Up @@ -121,9 +123,18 @@ - (void)scanWith:(NSDictionary *)recognizerCollectionDict overlaySettingsDict:(N
self.recognizerCollection = [[MBRecognizerSerializers sharedInstance] deserializeRecognizerCollection:recognizerCollectionDict];
[self setLanguage:overlaySettingsDict];

MBOverlayViewController *overlayVC = [[MBOverlaySettingsSerializers sharedInstance] createOverlayViewController:overlaySettingsDict recognizerCollection:self.recognizerCollection delegate:self];
_overlayVc = [[MBOverlaySettingsSerializers sharedInstance] createOverlayViewController:overlaySettingsDict recognizerCollection:self.recognizerCollection delegate:self];
for (MBRecognizer *recognizer in self.recognizerCollection.recognizerList) {
if([recognizer isKindOfClass:[MBBlinkIdMultiSideRecognizer class]]) {
[(MBBlinkIdMultiSideRecognizer *)recognizer setDelegate:self];
break;
} else if ([recognizer isKindOfClass:[MBBlinkIdSingleSideRecognizer class]]) {
[(MBBlinkIdSingleSideRecognizer *)recognizer setDelegate:self];
break;
}
}

UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:overlayVC];
UIViewController<MBRecognizerRunnerViewController>* recognizerRunnerViewController = [MBViewControllerFactory recognizerRunnerViewControllerWithOverlayViewController:_overlayVc];

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

Expand Down Expand Up @@ -166,6 +177,25 @@ - (void)overlayDidTapClose:(MBOverlayViewController *)overlayViewController {
self.result(@"null");
self.result = nil;
}
- (BOOL)multiSideClassInfoFilter:(nullable MBClassInfo *)classInfo {
return [MBBlinkIDSerializationUtils deserializeClassFilter:self.recognizerCollectionDict classInfo:classInfo];
}

- (void)onMultiSideDocumentSupportStatus:(BOOL)isDocumentSupported {
if([_overlayVc isKindOfClass:[MBBlinkIdOverlayViewController class]]) {
[(MBBlinkIdOverlayViewController *)_overlayVc onDocumentSupportStatus:isDocumentSupported];
}
}

- (BOOL)classInfoFilter:(MBClassInfo *)classInfo {
return [MBBlinkIDSerializationUtils deserializeClassFilter:self.recognizerCollectionDict classInfo:classInfo];
}

- (void)onDocumentSupportStatus:(BOOL)isDocumentSupported {
if([_overlayVc isKindOfClass:[MBBlinkIdOverlayViewController class]]) {
[(MBBlinkIdOverlayViewController *)_overlayVc onDocumentSupportStatus:isDocumentSupported];
}
}

//MARK: DirectAPI scanning
- (void)scanWithDirectApi:(NSDictionary *)recognizerCollectionDict frontImageString:(NSString *)frontImageString {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@
+(NSDictionary * _Nonnull) serializeNSDate:(NSDate * _Nullable) value;
+(MBCustomClassRules * _Nonnull) deserializeMBCustomClassRules:(NSDictionary * _Nullable)jsonCustomClassRules;
+(NSMutableArray<NSDictionary *> * _Nullable) serializeDependentInfo:(NSArray<MBDependentInfo *>* _Nullable)dependentInfos;
+ (BOOL)deserializeClassFilter:(NSDictionary * _Nullable)jsonRecognizerCollection classInfo:(MBClassInfo * _Nullable)classInfo;
@end
56 changes: 56 additions & 0 deletions BlinkID/ios/Classes/MicroblinkModule/MBBlinkIDSerializationUtils.m
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,59 @@ +(NSDictionary *) serializeClassInfo:(MBClassInfo *)classInfo {
};
}

+ (BOOL)deserializeClassFilter:(NSDictionary *)jsonRecognizerCollection classInfo:(MBClassInfo *)classInfo {
BOOL includeClass = NO;
BOOL excludeClass = YES;
NSDictionary *classFilter;

for (NSDictionary *recognizer in jsonRecognizerCollection[@"recognizerArray"]) {
NSString *recognizerType = recognizer[@"recognizerType"];

if ([recognizerType isEqualToString:@"BlinkIdMultiSideRecognizer"] ||
[recognizerType isEqualToString:@"BlinkIdSingleSideRecognizer"]) {

classFilter = recognizer[@"classFilter"];
if (!classFilter) {
return YES;
}
}
}

NSArray *addClassToClassFilter = classFilter[@"includeClasses"];
if (addClassToClassFilter != nil && ![addClassToClassFilter isEqual:[NSNull null]]) {
if ([addClassToClassFilter count] > 0) {
for (int i = 0; i < [addClassToClassFilter count]; i++) {
NSDictionary *jsonClassInfo = addClassToClassFilter[i];
includeClass = includeClass || [self matchClassFilter:jsonClassInfo classInfo:classInfo];
}
} else {
includeClass = YES;
}
} else {
includeClass = YES;
}

NSArray *removeClassFromClassFilter = classFilter[@"excludeClasses"];
if (removeClassFromClassFilter != nil && ![removeClassFromClassFilter isEqual:[NSNull null]]) {
for (int i = 0; i < [removeClassFromClassFilter count]; i++) {
NSDictionary *jsonClassInfo = removeClassFromClassFilter[i];
excludeClass = excludeClass && ![self matchClassFilter:jsonClassInfo classInfo:classInfo];
}
}
return includeClass && excludeClass;
}

+ (BOOL)matchClassFilter:(NSDictionary *)jsonClassFilterInfo classInfo:(MBClassInfo *)classInfo {

NSNumber *country = [jsonClassFilterInfo valueForKey:@"country"];
NSNumber *region = [jsonClassFilterInfo valueForKey:@"region"];
NSNumber *type = [jsonClassFilterInfo valueForKey:@"type"];

return (![self isNotNullandNil:country] || classInfo.country == country.integerValue) &&
(![self isNotNullandNil:type] || classInfo.type == type.integerValue) &&
(![self isNotNullandNil:region]|| classInfo.region == region.integerValue);
}

+(NSDictionary *) serializeVizResult:(MBVizResult *)vizResult {
return @{
@"firstName" : [MBBlinkIDSerializationUtils serializeMBStringResult:vizResult.firstName],
Expand Down Expand Up @@ -407,5 +460,8 @@ +(NSNumber *)serializeMBSide:(MBSide) value {

return jsonDependentInfos;
}
+ (BOOL)isNotNullandNil:(NSNumber *)value {
return ![value isEqual:[NSNull null]] && (value != nil);
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ -(NSDictionary *) serializeResult {
[jsonResult setValue:[MBSerializationUtils encodeMBImage:self.result.signatureImage] forKey:@"signatureImage"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.specificDocumentValidity] forKey:@"specificDocumentValidity"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.sponsor] forKey:@"sponsor"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleOwner] forKey:@"vehicleOwner"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleType] forKey:@"vehicleType"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.visaType] forKey:@"visaType"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeDependentInfo:self.result.dependentInfos] forKey:@"dependentsInfo"];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ -(NSDictionary *) serializeResult {
[jsonResult setValue:[MBSerializationUtils encodeMBImage:self.result.signatureImage] forKey:@"signatureImage"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.specificDocumentValidity] forKey:@"specificDocumentValidity"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.sponsor] forKey:@"sponsor"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleOwner] forKey:@"vehicleOwner"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.vehicleType] forKey:@"vehicleType"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeMBStringResult:self.result.visaType] forKey:@"visaType"];
[jsonResult setValue:[MBBlinkIDSerializationUtils serializeVizResult:self.result.vizResult] forKey:@"vizResult"];
Expand Down
4 changes: 2 additions & 2 deletions BlinkID/ios/blinkid_flutter.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
Pod::Spec.new do |s|
s.name = 'blinkid_flutter'
s.version = '6.12.0'
s.version = '6.13.0'
s.summary = 'A new flutter plugin project.'
s.description = <<-DESC
A new flutter plugin project.
Expand All @@ -18,7 +18,7 @@ A new flutter plugin project.
s.dependency 'Flutter'
s.platform = :ios, '13.0'

s.dependency 'PPBlinkID', '~> 6.12.0'
s.dependency 'PPBlinkID', '~> 6.13.0'

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

0 comments on commit 9647dff

Please sign in to comment.