diff --git a/BlinkID/MicroblinkBlinkidCapacitor.podspec b/BlinkID/MicroblinkBlinkidCapacitor.podspec index 71519d7..b4ba3f7 100644 --- a/BlinkID/MicroblinkBlinkidCapacitor.podspec +++ b/BlinkID/MicroblinkBlinkidCapacitor.podspec @@ -14,5 +14,5 @@ Pod::Spec.new do |s| s.ios.deployment_target = '13.0' s.dependency 'Capacitor' s.swift_version = '5.5' - s.dependency 'PPBlinkID', '~> 6.12.0' + s.dependency 'PPBlinkID', '~> 6.13.0' end diff --git a/BlinkID/android/build.gradle b/BlinkID/android/build.gradle index aa90601..b872b1b 100644 --- a/BlinkID/android/build.gradle +++ b/BlinkID/android/build.gradle @@ -45,7 +45,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':capacitor-android') - implementation('com.microblink:blinkid:6.12.0@aar') { + implementation('com.microblink:blinkid:6.13.0@aar') { transitive = true } } diff --git a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIDSerializationUtils.java b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIDSerializationUtils.java index e18c6e8..849647b 100644 --- a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIDSerializationUtils.java +++ b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIDSerializationUtils.java @@ -33,11 +33,14 @@ 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 org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import android.os.Parcel; +import androidx.annotation.NonNull; public abstract class BlinkIDSerializationUtils { public static JSONObject serializeMrzResult(MrzResult mrzResult) throws JSONException { @@ -446,6 +449,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 getEnumValue(JSONObject jsonObject, String key, Class 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(); diff --git a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdMultiSideRecognizerSerialization.java b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdMultiSideRecognizerSerialization.java index dad924d..18d6dac 100644 --- a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdMultiSideRecognizerSerialization.java +++ b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdMultiSideRecognizerSerialization.java @@ -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)); @@ -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) { diff --git a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdSingleSideRecognizerSerialization.java b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdSingleSideRecognizerSerialization.java index e657e59..90a0477 100644 --- a/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdSingleSideRecognizerSerialization.java +++ b/BlinkID/android/src/main/java/com/microblink/blinkid/capacitor/recognizers/serialization/BlinkIdSingleSideRecognizerSerialization.java @@ -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)); @@ -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())); diff --git a/BlinkID/ios/Plugin/BlinkIDPlugin.swift b/BlinkID/ios/Plugin/BlinkIDPlugin.swift index 43bfe47..7d4757e 100644 --- a/BlinkID/ios/Plugin/BlinkIDPlugin.swift +++ b/BlinkID/ios/Plugin/BlinkIDPlugin.swift @@ -11,6 +11,8 @@ public class BlinkIDCapacitorPlugin: CAPPlugin { var pluginCall: CAPPluginCall? var recognizerCollection: MBRecognizerCollection? + var jsonRecognizerCollection: [String : Any]? + var overlayVc: MBOverlayViewController? var recognizerRunner: MBRecognizerRunner? var backImage: String? @@ -37,7 +39,7 @@ public class BlinkIDCapacitorPlugin: CAPPlugin { } let jsonOverlaySettings = sanitizeDictionary(overlaySettingsObject) - let jsonRecognizerCollection = sanitizeDictionary(recognizerCollectionObject) + jsonRecognizerCollection = sanitizeDictionary(recognizerCollectionObject) guard let jsonLicense = sanitizeDictionary(licensesObject) else { call.reject("Must provide license keys for Microblink SDK!") return @@ -48,19 +50,32 @@ public class BlinkIDCapacitorPlugin: CAPPlugin { jsonOverlaySettings?["country"] ?? "") recognizerCollection = MBRecognizerSerializers.sharedInstance()?.deserializeRecognizerCollection(jsonRecognizerCollection) + if let recognizerList = recognizerCollection?.recognizerList { + for recognizer in recognizerList { + if (recognizer is MBBlinkIdMultiSideRecognizer) { + (recognizer as! MBBlinkIdMultiSideRecognizer).delegate = self + } else if (recognizer is MBBlinkIdSingleSideRecognizer) { + (recognizer as! MBBlinkIdSingleSideRecognizer).delegate = self + } + } + } DispatchQueue.main.async { guard let overlayVC = MBOverlaySettingsSerializers.sharedInstance()?.createOverlayViewController(jsonOverlaySettings, recognizerCollection: self.recognizerCollection, delegate: self) else { call.reject("Unsupported overlay view controller!") return } - - guard let recognizerRunneViewController: UIViewController = - MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: overlayVC) else { - return + self.overlayVc = overlayVC + if let overlayVc = self.overlayVc { + guard let recognizerRunneViewController: UIViewController = + MBViewControllerFactory.recognizerRunnerViewController(withOverlayViewController: overlayVc) else { + return + } + recognizerRunneViewController.modalPresentationStyle = .fullScreen + self.bridge?.viewController?.present(recognizerRunneViewController, animated: true, completion: nil) + } else { + return } - recognizerRunneViewController.modalPresentationStyle = .fullScreen - self.bridge?.viewController?.present(recognizerRunneViewController, animated: true, completion: nil) } } } @@ -321,4 +336,31 @@ extension BlinkIDCapacitorPlugin: MBFirstSideFinishedRecognizerRunnerDelegate, M pluginCall?.reject("Could not extract the information with DirectAPI!") } } +} +extension BlinkIDCapacitorPlugin: MBBlinkIdMultiSideRecognizerDelegate, MBBlinkIdSingleSideRecognizerDelegate { + + public func onMultiSideDocumentSupportStatus(_ isDocumentSupported: Bool) { + if (overlayVc is MBBlinkIdOverlayViewController) { + (overlayVc as! MBBlinkIdOverlayViewController).onMultiSideDocumentSupportStatus(isDocumentSupported) + } + } + + public func multiSideClassInfoFilter(_ classInfo: MBClassInfo?) -> Bool { + return MBBlinkIDSerializationUtils.deserializeClassFilter(jsonRecognizerCollection, classInfo: classInfo) + } + + public func onDocumentSupportStatus(_ isDocumentSupported: Bool) { + if (overlayVc is MBBlinkIdOverlayViewController) { + (overlayVc as! MBBlinkIdOverlayViewController).onDocumentSupportStatus(isDocumentSupported) + } + } + + public func classInfoFilter(_ classInfo: MBClassInfo?) -> Bool { + return MBBlinkIDSerializationUtils.deserializeClassFilter(jsonRecognizerCollection, classInfo: classInfo) + } + + public func onMultiSideImageAvailable(_ dewarpedImage: MBImage?) {} + public func onMultiSideBarcodeScanningStarted() {} + public func onImageAvailable(_ dewarpedImage: MBImage?) {} + public func onBarcodeScanningStarted() {} } \ No newline at end of file diff --git a/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.h b/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.h index 12e262b..fa1c301 100644 --- a/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.h +++ b/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.h @@ -32,4 +32,5 @@ +(NSDictionary * _Nonnull) serializeNSDate:(NSDate * _Nullable) value; +(MBCustomClassRules * _Nonnull) deserializeMBCustomClassRules:(NSDictionary * _Nullable)jsonCustomClassRules; +(NSMutableArray * _Nullable) serializeDependentInfo:(NSArray* _Nullable)dependentInfos; ++ (BOOL)deserializeClassFilter:(NSDictionary * _Nullable)jsonRecognizerCollection classInfo:(MBClassInfo * _Nullable)classInfo; @end \ No newline at end of file diff --git a/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.m b/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.m index cb8e703..75a9406 100644 --- a/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.m +++ b/BlinkID/ios/Plugin/MBBlinkIDSerializationUtils.m @@ -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], @@ -407,5 +460,8 @@ +(NSNumber *)serializeMBSide:(MBSide) value { return jsonDependentInfos; } ++ (BOOL)isNotNullandNil:(NSNumber *)value { + return ![value isEqual:[NSNull null]] && (value != nil); +} @end \ No newline at end of file diff --git a/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdMultiSideRecognizerWrapper.m b/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdMultiSideRecognizerWrapper.m index 726893f..a78aca1 100644 --- a/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdMultiSideRecognizerWrapper.m +++ b/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdMultiSideRecognizerWrapper.m @@ -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"]; diff --git a/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdSingleSideRecognizerWrapper.m b/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdSingleSideRecognizerWrapper.m index 3c0624b..9debb50 100644 --- a/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdSingleSideRecognizerWrapper.m +++ b/BlinkID/ios/Plugin/Recognizers/Wrappers/MBBlinkIdSingleSideRecognizerWrapper.m @@ -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"]; diff --git a/BlinkID/ios/Podfile b/BlinkID/ios/Podfile index 8dc44f5..f6555e7 100644 --- a/BlinkID/ios/Podfile +++ b/BlinkID/ios/Podfile @@ -10,7 +10,7 @@ end target 'Plugin' do capacitor_pods - pod 'PPBlinkID', '~> 6.12.0' + pod 'PPBlinkID', '~> 6.13.0' end target 'PluginTests' do diff --git a/BlinkID/package-lock.json b/BlinkID/package-lock.json index 71063b5..9205a3a 100644 --- a/BlinkID/package-lock.json +++ b/BlinkID/package-lock.json @@ -1,12 +1,12 @@ { "name": "@microblink/blinkid-capacitor", - "version": "6.12.0", + "version": "6.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@microblink/blinkid-capacitor", - "version": "6.12.0", + "version": "6.13.0", "license": "MIT", "devDependencies": { "@capacitor/android": "^6.0.0", diff --git a/BlinkID/package.json b/BlinkID/package.json index a5f8345..942d81b 100644 --- a/BlinkID/package.json +++ b/BlinkID/package.json @@ -1,6 +1,6 @@ { "name": "@microblink/blinkid-capacitor", - "version": "6.12.0", + "version": "6.13.0", "description": "A small and powerful ID card Capacitor plugin for BlinkID SDK", "main": "dist/plugin.js", "module": "dist/esm/index.js", diff --git a/BlinkID/src/recognizers/blinkIdMultiSideRecognizer.ts b/BlinkID/src/recognizers/blinkIdMultiSideRecognizer.ts index 3e85c3b..b7468b1 100644 --- a/BlinkID/src/recognizers/blinkIdMultiSideRecognizer.ts +++ b/BlinkID/src/recognizers/blinkIdMultiSideRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, @@ -391,6 +392,11 @@ export class BlinkIdMultiSideRecognizerResult extends RecognizerResult { */ sponsor?: StringResult; + /** + * The vehicle owner. + */ + vehicleOwner?: StringResult; + /** * The eligibility category. */ @@ -752,6 +758,11 @@ export class BlinkIdMultiSideRecognizerResult extends RecognizerResult { */ this.sponsor = nativeResult.sponsor; + /** + * The vehicle owner. + */ + this.vehicleOwner = nativeResult.vehicleOwner; + /** * The eligibility category. */ @@ -829,6 +840,11 @@ export class BlinkIdMultiSideRecognizer extends Recognizer { */ blurStrictnessLevel: StrictnessLevel; + /** + * Sets the ClassFilter that can determine whether the document should be processed or filtered out. + */ + classFilter: ClassFilter; + /** * Enables the aggregation of data from multiple frames. * Disabling this setting will yield higher-quality captured images, but it may slow down the scanning process due to the additional effort required to find the optimal frame. @@ -1036,6 +1052,11 @@ export class BlinkIdMultiSideRecognizer extends Recognizer { */ this.blurStrictnessLevel = StrictnessLevel.Normal; + /** + * Sets the ClassFilter that can determine whether the document should be processed or filtered out. + */ + this.classFilter = new ClassFilter(); + /** * Enables the aggregation of data from multiple frames. * Disabling this setting will yield higher-quality captured images, but it may slow down the scanning process due to the additional effort required to find the optimal frame. diff --git a/BlinkID/src/recognizers/blinkIdSingleSideRecognizer.ts b/BlinkID/src/recognizers/blinkIdSingleSideRecognizer.ts index fd19006..a7ddfd1 100644 --- a/BlinkID/src/recognizers/blinkIdSingleSideRecognizer.ts +++ b/BlinkID/src/recognizers/blinkIdSingleSideRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, @@ -332,6 +333,11 @@ export class BlinkIdSingleSideRecognizerResult extends RecognizerResult { */ sponsor?: StringResult; + /** + * The vehicle owner. + */ + vehicleOwner?: StringResult; + /** * The eligibility category. */ @@ -639,6 +645,11 @@ export class BlinkIdSingleSideRecognizerResult extends RecognizerResult { */ this.sponsor = nativeResult.sponsor; + /** + * The vehicle owner. + */ + this.vehicleOwner = nativeResult.vehicleOwner; + /** * The eligibility category. */ @@ -713,6 +724,11 @@ export class BlinkIdSingleSideRecognizer extends Recognizer { */ blurStrictnessLevel: StrictnessLevel; + /** + * Sets the ClassFilter that can determine whether the document should be processed or filtered out. + */ + classFilter: ClassFilter; + /** * Enables the aggregation of data from multiple frames. * Disabling this setting will yield higher-quality captured images, but it may slow down the scanning process due to the additional effort required to find the optimal frame. @@ -890,6 +906,11 @@ export class BlinkIdSingleSideRecognizer extends Recognizer { */ this.blurStrictnessLevel = StrictnessLevel.Normal; + /** + * Sets the ClassFilter that can determine whether the document should be processed or filtered out. + */ + this.classFilter = new ClassFilter(); + /** * Enables the aggregation of data from multiple frames. * Disabling this setting will yield higher-quality captured images, but it may slow down the scanning process due to the additional effort required to find the optimal frame. diff --git a/BlinkID/src/recognizers/documentFaceRecognizer.ts b/BlinkID/src/recognizers/documentFaceRecognizer.ts index b0407ec..5230851 100644 --- a/BlinkID/src/recognizers/documentFaceRecognizer.ts +++ b/BlinkID/src/recognizers/documentFaceRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/recognizers/idBarcodeRecognizer.ts b/BlinkID/src/recognizers/idBarcodeRecognizer.ts index 1446192..48be252 100644 --- a/BlinkID/src/recognizers/idBarcodeRecognizer.ts +++ b/BlinkID/src/recognizers/idBarcodeRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/recognizers/mrtdCombinedRecognizer.ts b/BlinkID/src/recognizers/mrtdCombinedRecognizer.ts index a24a63c..423d098 100644 --- a/BlinkID/src/recognizers/mrtdCombinedRecognizer.ts +++ b/BlinkID/src/recognizers/mrtdCombinedRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/recognizers/mrtdRecognizer.ts b/BlinkID/src/recognizers/mrtdRecognizer.ts index fabee5e..c1891a7 100644 --- a/BlinkID/src/recognizers/mrtdRecognizer.ts +++ b/BlinkID/src/recognizers/mrtdRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/recognizers/passportRecognizer.ts b/BlinkID/src/recognizers/passportRecognizer.ts index 54de9a3..2766601 100644 --- a/BlinkID/src/recognizers/passportRecognizer.ts +++ b/BlinkID/src/recognizers/passportRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/recognizers/visaRecognizer.ts b/BlinkID/src/recognizers/visaRecognizer.ts index d24c1d8..b48ec5d 100644 --- a/BlinkID/src/recognizers/visaRecognizer.ts +++ b/BlinkID/src/recognizers/visaRecognizer.ts @@ -36,6 +36,7 @@ import { StrictnessLevel, CustomClassRules, DependentInfo, + ClassFilter, ImageExtensionFactors, diff --git a/BlinkID/src/types.ts b/BlinkID/src/types.ts index 89248fa..1294294 100644 --- a/BlinkID/src/types.ts +++ b/BlinkID/src/types.ts @@ -1010,7 +1010,8 @@ export const enum Type { InterimHealthInsuranceCard = 73, NonVoterId = 74, ReciprocalHealthInsuranceCard = 75, - VehicleRegistration = 76 + VehicleRegistration = 76, + EsaadCard = 77, } export const enum FieldType { @@ -1063,7 +1064,8 @@ export const enum FieldType { DependentDocumentNumber = 46, DependentFullName = 47, EligibilityCategory = 48, - SpecificDocumentValidity = 49 + SpecificDocumentValidity = 49, + VehicleOwner = 50, } /** Defines the data extracted from the barcode. */ @@ -2663,6 +2665,82 @@ export class DetailedFieldType { alphabetType?: AlphabetType; } +/** + * ClassFilter represents the document filter used to determine which documents will be processed. + * Document information (Country, Region, Type) is evaluated with the content set in the filter, and their inclusion or exclusion depends on the defined rules. + * + * The recognition results of the excluded documents will not be returned. + * If using the standard BlinkID Overlay, an alert will be displayed that the document will not be scanned. + * + * By default, the ClassFilter is turned off, and all documents will be included. + */ +export class ClassFilter { + /** + * Document classes that will be explicitly accepted by this filter. + * Only documents belonging to the specified classes will be processed. All other documents will be rejected. + * + * If this array is empty, no restrictions are applied, and documents will be accepted unless explicitly excluded by `excludedClasses`. + * + * Example usage: + * + * var includedClassOne = new BlinkID.FilteredClass(); + * includedClassOne.country = BlinkID.Country.Croatia; + * includedClassOne.type = BlinkID.Type.Id; + * + * var includedClassTwo = new BlinkID.FilteredClass(); + * includedClassTwo.region = BlinkID.Region.California; + * + * var classFilter = new ClassFilter(); + * classFilter.includeClasses = [includedClassOne, includedClassTwo]; + * + * NOTE: from the example above, the class filter is set to only accept Croatian IDs, and all documents from the California region. + * All other documents will be rejected. + * + * Rules can be combined, for example, to set all three properties (Country Region, Type), two (e.g., Country and Type) or just one (e.g, Region). + */ + includeClasses?: FilteredClass[]; + /** + * Document classes that will be explicitly rejected by this filter. + * Documents belonging to the specified classes will not be processed. Other documents, not included with `excludeClasses` will be accepted. + * + * If this array is empty, no restrictions are applied, and documents will be excluded only if not present in `includeClasses`. + * If a document class appears in both `includeClasses` and `excludeClasses`, it will be rejected, as `excludeClasses` takes precedence. + * + * Example usage: + * + * var excludedClassOne = new BlinkID.FilteredClass(); + * excludedClassOne.country = BlinkID.Country.Croatia; + * excludedClassOne.type = BlinkID.Type.Id; + * + * var excludedClassTwo = new BlinkID.FilteredClass(); + * excludedClassTwo.region = BlinkID.Region.California; + * + * var classFilter = new ClassFilter(); + * classFilter.excludeClasses = [excludedClassOne, excludedClassTwo]; + * + * NOTE: from the example above, the class filter is set to only reject Croatian IDs, and all documents from the California region. + * All other classes will be accepted. + * + * Rules can be combined, for example, to set all three properties (Country Region, Type), two (e.g., Country and Type) or just one (e.g, Region). + */ + excludeClasses?: FilteredClass[]; +} + +/** + * FilteredClass represents the document class that is added in the ClassFilter. + * By defining the rules of the ClassFilter, the entered class can be included or excluded from processing. + * + * See the ClassFilter class for more detailed information. + */ +export class FilteredClass { + /** Document country that will be added in the filter */ + country?: Country; + /** Document region that will be added in the filter */ + region?: Region; + /** Document type that will be added in the filter */ + type?: Type; +} + /** Defines status of the last recognition process. */ export const enum ProcessingStatus { /** Recognition was successful. */ diff --git a/Release notes.md b/Release notes.md index c92eced..386abd2 100644 --- a/Release notes.md +++ b/Release notes.md @@ -1,3 +1,26 @@ +## 6.13.0 +- Updated the plugin to [Android SDK v6.13.0](https://github.com/BlinkID/blinkid-android/releases/tag/v6.13.0) and [iOS SDK v6.13.0](https://github.com/BlinkID/blinkid-ios/releases/tag/v6.13.0) + +**New features** +- **ClassFilter** + - `ClassFilter` represents the document filter used to determine which documents will be processed. + - Document information (Country, Region, Type) is evaluated with the content set in the filter, and their inclusion or exclusion depends on the defined rules. + - The recognition results of the excluded documents will not be returned. + - If using the standard BlinkID Overlay, an alert will be displayed that the document will not be scanned. + - Modifying the `includeClasses` property will set the filter to scan only the set document classes. Other document classes will be rejected. + - Modifying the `excludeClasses` property will set the filter to reject only the set document classes. Other document classes will be accepted. + - By defult, all of the document classes are accepted. + +**Expanded document coverage** +- All of the new documents & document versions can also be found in the release notes for native Android and iOS SDKs. + +**Bug fixes** +- NY ID/DL: Added logic to expose the Enhanced document subtype, allowing customers to distinguish between regular and enhanced versions. +- Bolivia & Namibia ID: Resolved data match inconsistencies that were causing data match failures. +- Romanian ID: Multi side scan no longer expects blank back card of old IDs, even with skipUnsupportedBack set to false. +- Fixed backImageAnalysisResult.cardRotation not being correctly populated when scanning the wrong side of a document. +- [iOS-specific] Fixed document flip animation on the `BlinkIdOverlay` + ## 6.12.0 - Updated the plugin to [Android SDK v6.12.0](https://github.com/BlinkID/blinkid-android/releases/tag/v6.12.0) and [iOS SDK v6.12.0](https://github.com/BlinkID/blinkid-ios/releases/tag/v6.12.0) diff --git a/sample_files/home.page.ts b/sample_files/home.page.ts index 1c1db53..92136b3 100644 --- a/sample_files/home.page.ts +++ b/sample_files/home.page.ts @@ -6,6 +6,7 @@ import { CameraResultType, Camera } from '@capacitor/camera'; selector: 'app-home', templateUrl: 'home.page.html', styleUrls: ['home.page.scss'], + standalone: false }) export class HomePage { @@ -17,8 +18,8 @@ export class HomePage { // license key is needed to unlock the BlinkID SDK // com.microblink.sample licenseKeys: BlinkID.License = { - ios: 'sRwCABVjb20ubWljcm9ibGluay5zYW1wbGUBbGV5SkRjbVZoZEdWa1QyNGlPakUzTXpFMU9EazFPRFExTVRJc0lrTnlaV0YwWldSR2IzSWlPaUprWkdRd05qWmxaaTAxT0RJekxUUXdNRGd0T1RRNE1DMDFORFU0WWpBeFlUVTJZamdpZlE9PVcl5cUobHO9HsKUmIo2hNgFPbgbNajREsH4k/WP2Zc0QwRQx0ObfqDc14FFJvSYxj8u+PR91m+23+ZuopgaHpVl+QZcbIm5jX8Te04hqQSuPxG/JGIrSxrr7Ic0kAYj9l4YoHH8DHdtRqboelGrrMs0g8JjtrpyLA==', - android: 'sRwCABVjb20ubWljcm9ibGluay5zYW1wbGUAbGV5SkRjbVZoZEdWa1QyNGlPakUzTXpFMU9EazFNakkzTWpBc0lrTnlaV0YwWldSR2IzSWlPaUprWkdRd05qWmxaaTAxT0RJekxUUXdNRGd0T1RRNE1DMDFORFU0WWpBeFlUVTJZamdpZlE9PQgQAmS4jMWlpIrTFuTqNnmxtVlnmcIZur0BfSOYe5024g5BmY6We9lpvD9ok9ZhVhIzz2vVQMdtkCSPemMV9a2kUJu29JfQh97EJibWCo8m02dLKzb+GTJW/9FwErIJWnn2U2JqMdpEytj4xj5ElDQzBm0v6VGUbg==', + ios: 'sRwCABVjb20ubWljcm9ibGluay5zYW1wbGUBbGV5SkRjbVZoZEdWa1QyNGlPakUzTXpVNE1qSTBOakEzTmpZc0lrTnlaV0YwWldSR2IzSWlPaUprWkdRd05qWmxaaTAxT0RJekxUUXdNRGd0T1RRNE1DMDFORFU0WWpBeFlUVTJZamdpZlE9PZKCqvKghmuqhDWs9/GP/eAvvl/bC2awwEyPKpyENgXQIugQhFM3AiujVm5fOE/9OW0U96Ps5qRL47XvXGExKwjrw21+9/PugOMHlnG39bin1Uj/C2JuscJHHB7S/mPNUEqhd0YJWh2rOuVQnLGce1/N2sq25Wohig==', + android: 'sRwCABVjb20ubWljcm9ibGluay5zYW1wbGUAbGV5SkRjbVZoZEdWa1QyNGlPakUzTXpVNE1qSTBPVFV5T0RNc0lrTnlaV0YwWldSR2IzSWlPaUprWkdRd05qWmxaaTAxT0RJekxUUXdNRGd0T1RRNE1DMDFORFU0WWpBeFlUVTJZamdpZlE9Pe17kwCrcsbfLHv9SpCjOsosRpjY0ZJY0bH3UmS849NVH08GkZkpIXRfS09XQ0mtt9yylB2aeB2L1lUpiKb8FCZrA+TErLE6F8IRdti+EZPMrV3GvpU+TLZBCcvfWWk4ffu7ANgrIr+WgRnxr155DOa+NmEY1oD60g==', showTrialLicenseWarning: true };