Skip to content

Commit

Permalink
Merge pull request #67 from BlinkID/release/v6.9.0
Browse files Browse the repository at this point in the history
Release/v6.9.0
  • Loading branch information
mparadina authored Jul 19, 2024
2 parents 9dfe2da + 7378fd5 commit 5b63ede
Show file tree
Hide file tree
Showing 22 changed files with 424 additions and 118 deletions.
4 changes: 2 additions & 2 deletions BlinkID/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.android.tools.build:gradle:8.5.0'
}
}

Expand Down Expand Up @@ -38,7 +38,7 @@ android {
}

dependencies {
implementation('com.microblink:blinkid:6.8.0@aar') {
implementation('com.microblink:blinkid:6.9.0@aar') {
transitive = true
}
}
Expand Down
2 changes: 1 addition & 1 deletion BlinkID/android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import com.microblink.blinkid.metadata.recognition.FirstSideRecognitionCallback;
import com.microblink.blinkid.recognition.RecognitionSuccessType;
import com.microblink.blinkid.view.recognition.ScanResultListener;

import com.microblink.blinkid.licence.exception.LicenceKeyException;

import com.microblink.blinkid.flutter.recognizers.RecognizerSerializers;
import com.microblink.blinkid.flutter.overlays.OverlaySettingsSerializers;
Expand All @@ -61,7 +61,6 @@ public class BlinkIDFlutterPlugin implements FlutterPlugin, MethodCallHandler, P
private static final String ARG_OVERLAY_SETTINGS = "overlaySettings";
private static final String ARG_FRONT_IMAGE = "frontImage";
private static final String ARG_BACK_IMAGE = "backImage";

private boolean mFirstSideScanned = false;
private RecognizerBundle mRecognizerBundle;
private RecognizerRunner mRecognizerRunner;
Expand Down Expand Up @@ -99,27 +98,29 @@ private void setupPlugin(Context context, BinaryMessenger messenger) {

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
setLicense((Map)call.argument(ARG_LICENSE));

if (call.method.equals(METHOD_SCAN_CAMERA)) {
pendingResult = result;
boolean isLicenseKeyValid = setLicense((Map)call.argument(ARG_LICENSE));

JSONObject jsonOverlaySettings = new JSONObject((Map)call.argument(ARG_OVERLAY_SETTINGS));
JSONObject jsonRecognizerCollection = new JSONObject((Map)call.argument(ARG_RECOGNIZER_COLLECTION));
setLanguage(jsonOverlaySettings);
mRecognizerBundle = RecognizerSerializers.INSTANCE.deserializeRecognizerCollection(jsonRecognizerCollection);
UISettings uiSettings = OverlaySettingsSerializers.INSTANCE.getOverlaySettings(context, jsonOverlaySettings, mRecognizerBundle);

startScanning(SCAN_REQ_CODE, uiSettings);

} else if (call.method.equals(METHOD_SCAN_DIRECT_API)) {
if (isLicenseKeyValid) {
setLanguage(jsonOverlaySettings);
mRecognizerBundle = RecognizerSerializers.INSTANCE.deserializeRecognizerCollection(jsonRecognizerCollection);
UISettings uiSettings = OverlaySettingsSerializers.INSTANCE.getOverlaySettings(context, jsonOverlaySettings, mRecognizerBundle);
startScanning(SCAN_REQ_CODE, uiSettings);
}
} else if (call.method.equals(METHOD_SCAN_DIRECT_API)) {
pendingResult = result;
boolean isLicenseKeyValid = setLicense((Map)call.argument(ARG_LICENSE));

JSONObject jsonRecognizerCollection = new JSONObject((Map)call.argument(ARG_RECOGNIZER_COLLECTION));
String frontImage = call.argument(ARG_FRONT_IMAGE);
String backImage = call.argument(ARG_BACK_IMAGE);

scanWithDirectApi(jsonRecognizerCollection, frontImage, backImage);
if (isLicenseKeyValid) {
scanWithDirectApi(jsonRecognizerCollection, frontImage, backImage);
}

} else {
result.notImplemented();
Expand All @@ -128,7 +129,8 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {


@SuppressWarnings("unchecked")
private void setLicense(Map licenseMap) {
private boolean setLicense(Map licenseMap) {
boolean isLicenseKeyValid = true;
if (licenseMap.get(ARG_SHOW_LICENSE_WARNING) != null) {
MicroblinkSDK.setShowTrialLicenseWarning((boolean) licenseMap.get(ARG_SHOW_LICENSE_WARNING));
} else {
Expand All @@ -139,12 +141,22 @@ private void setLicense(Map licenseMap) {
String licensee = (String) licenseMap.get(ARG_LICENSEE);

if (licensee == null) {
MicroblinkSDK.setLicenseKey(licenseKey, context);
try {
MicroblinkSDK.setLicenseKey(licenseKey, context);
} catch (LicenceKeyException licenceKeyException) {
isLicenseKeyValid = false;
pendingResult.error("Android license key error", licenceKeyException.getMessage(), null);
}
} else {
MicroblinkSDK.setLicenseKey(licenseKey, licensee, context);
try {
MicroblinkSDK.setLicenseKey(licenseKey, licensee, context);
} catch (LicenceKeyException licenceKeyException) {
isLicenseKeyValid = false;
pendingResult.error("Android license key error", licenceKeyException.getMessage(), null);
}
}

MicroblinkSDK.setIntentDataTransferMode(IntentDataTransferMode.PERSISTED_OPTIMISED);
MicroblinkSDK.setIntentDataTransferMode(IntentDataTransferMode.PERSISTED_OPTIMISED);
return isLicenseKeyValid;
}

private void setLanguage(JSONObject jsonOverlaySettings) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public UISettings createUISettings(Context context, JSONObject jsonUISettings, R
BlinkIdUISettings settings = new BlinkIdUISettings(recognizerBundle);

OverlaySerializationUtils.extractCommonUISettings(jsonUISettings, settings);
settings.setAllowHapticFeedback(false);

boolean requireDocumentSidesDataMatch = jsonUISettings.optBoolean("requireDocumentSidesDataMatch", true);
settings.setDocumentDataMatchRequired(requireDocumentSidesDataMatch);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
import com.microblink.blinkid.entities.recognizers.blinkid.generic.Side;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.imageanalysis.CardRotation;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DocumentNumberAnonymizationSettings;

import com.microblink.blinkid.entities.recognizers.blinkid.generic.CustomClassRules;
import com.microblink.blinkid.entities.recognizers.blinkid.generic.DetailedFieldType;


import org.json.JSONArray;
Expand Down Expand Up @@ -385,4 +386,54 @@ private static DocumentNumberAnonymizationSettings deserializeDocumentNumberAnon
return null;
}
}

public static CustomClassRules[] deserializeCustomClassRules(JSONArray jsonArray) {
if (jsonArray != null && jsonArray.length() > 0) {
CustomClassRules[] customClassRulesArray = new CustomClassRules[jsonArray.length()];

for (int i = 0; i < jsonArray.length(); i++) {

DetailedFieldType[] detailedFieldTypes = new DetailedFieldType[0];
Country country = Country.NONE;
Region region = Region.NONE;
Type type = Type.NONE;

try {
JSONObject jsonCustomClassRulesArray = jsonArray.getJSONObject(i);

JSONArray detailedFieldTypeJsonArray = jsonCustomClassRulesArray.optJSONArray("detailedFieldTypes");
detailedFieldTypes = new DetailedFieldType[detailedFieldTypeJsonArray.length()];
for (int x = 0; x < detailedFieldTypeJsonArray.length(); x++) {
FieldType fieldType = FieldType.values()[detailedFieldTypeJsonArray.getJSONObject(x).getInt("fieldType")];
AlphabetType alphabetType = AlphabetType.values()[detailedFieldTypeJsonArray.getJSONObject(x).getInt("alphabetType")];
detailedFieldTypes[x] = new DetailedFieldType(fieldType, alphabetType);
}

try {
country = Country.values()[jsonCustomClassRulesArray.getInt("country")];
} catch (JSONException e) {
country = null;
}
try {
region = Region.values()[jsonCustomClassRulesArray.getInt("region")];
} catch (JSONException e) {
region = null;
}
try {
type = Type.values()[jsonCustomClassRulesArray.getInt("type")];
} catch (JSONException e) {
type = null;
}

CustomClassRules customClassRules = new CustomClassRules(country, region, type, detailedFieldTypes);
customClassRulesArray[i] = customClassRules;
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
return customClassRulesArray;
} else {
return new CustomClassRules[]{};
}
}
}
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.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
recognizer.setEnableGlareFilter(jsonObject.optBoolean("enableGlareFilter", true));
recognizer.setFaceImageDpi(jsonObject.optInt("faceImageDpi", 250));
Expand Down Expand Up @@ -97,11 +98,14 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
jsonResult.put("race", BlinkIDSerializationUtils.serializeStringResult(result.getRace()));
jsonResult.put("recognitionMode", SerializationUtils.serializeEnum(result.getRecognitionMode()));
jsonResult.put("religion", BlinkIDSerializationUtils.serializeStringResult(result.getReligion()));
jsonResult.put("remarks", BlinkIDSerializationUtils.serializeStringResult(result.getRemarks()));
jsonResult.put("residencePermitType", BlinkIDSerializationUtils.serializeStringResult(result.getResidencePermitType()));
jsonResult.put("residentialStatus", BlinkIDSerializationUtils.serializeStringResult(result.getResidentialStatus()));
jsonResult.put("scanningFirstSideDone", result.isScanningFirstSideDone());
jsonResult.put("sex", BlinkIDSerializationUtils.serializeStringResult(result.getSex()));
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
} catch (JSONException e) {
// see https://developer.android.com/reference/org/json/JSONException
throw new RuntimeException(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,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.setCustomClassRules(BlinkIDSerializationUtils.deserializeCustomClassRules(jsonObject.optJSONArray("customClassRules")));
recognizer.setEnableBlurFilter(jsonObject.optBoolean("enableBlurFilter", true));
recognizer.setEnableGlareFilter(jsonObject.optBoolean("enableGlareFilter", true));
recognizer.setFaceImageDpi(jsonObject.optInt("faceImageDpi", 250));
Expand Down Expand Up @@ -85,10 +86,13 @@ public JSONObject serializeResult(Recognizer<?> recognizer) {
jsonResult.put("race", BlinkIDSerializationUtils.serializeStringResult(result.getRace()));
jsonResult.put("recognitionMode", SerializationUtils.serializeEnum(result.getRecognitionMode()));
jsonResult.put("religion", BlinkIDSerializationUtils.serializeStringResult(result.getReligion()));
jsonResult.put("remarks", BlinkIDSerializationUtils.serializeStringResult(result.getRemarks()));
jsonResult.put("residencePermitType", BlinkIDSerializationUtils.serializeStringResult(result.getResidencePermitType()));
jsonResult.put("residentialStatus", BlinkIDSerializationUtils.serializeStringResult(result.getResidentialStatus()));
jsonResult.put("sex", BlinkIDSerializationUtils.serializeStringResult(result.getSex()));
jsonResult.put("signatureImage", SerializationUtils.encodeImageBase64(result.getSignatureImage()));
jsonResult.put("sponsor", BlinkIDSerializationUtils.serializeStringResult(result.getSponsor()));
jsonResult.put("visaType", BlinkIDSerializationUtils.serializeStringResult(result.getVisaType()));
jsonResult.put("vizResult", BlinkIDSerializationUtils.serializeVizResult(result.getVizResult()));
} catch (JSONException e) {
// see https://developer.android.com/reference/org/json/JSONException
Expand Down
51 changes: 46 additions & 5 deletions BlinkID/ios/Classes/BlinkIDFlutterPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -59,24 +59,27 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
NSDictionary *overlaySettingsDict = call.arguments[@"overlaySettings"];
NSDictionary *licenseKeyDict = call.arguments[@"license"];

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

[self setLicenseKey:licenseKeyDict];
[self scanWithDirectApi:recognizerCollectionDict frontImageString:frontImageBase64String];
if ([self setLicenseKey:licenseKeyDict]) {
[self scanWithDirectApi:recognizerCollectionDict frontImageString:frontImageBase64String];
}
}
else {
result(FlutterMethodNotImplemented);
}
}

- (void)setLicenseKey:(NSDictionary *)licenseKeyDict {
- (BOOL)setLicenseKey:(NSDictionary *)licenseKeyDict {
__block BOOL isLicenseKeyValid = YES;
licenseKeyDict = [self sanitizeDictionary:licenseKeyDict];

if ([licenseKeyDict objectForKey:@"showTrialLicenseWarning"] != nil) {
Expand All @@ -88,11 +91,17 @@ - (void)setLicenseKey:(NSDictionary *)licenseKeyDict {
if ([licenseKeyDict objectForKey:@"licensee"] != nil) {
NSString *licensee = [licenseKeyDict objectForKey:@"licensee"];
[[MBMicroblinkSDK sharedInstance] setLicenseKey:iosLicense andLicensee:licensee errorCallback:^(MBLicenseError licenseError) {
self.result([FlutterError errorWithCode:@"" message:[self licenseErrorToString:licenseError] details:nil]);
isLicenseKeyValid = NO;
}];
} else {
[[MBMicroblinkSDK sharedInstance] setLicenseKey:iosLicense errorCallback:^(MBLicenseError licenseError) {
self.result([FlutterError errorWithCode:@"" message:[self licenseErrorToString:licenseError] details:nil]);
isLicenseKeyValid = NO;
}];
}

return isLicenseKeyValid;
}

-(void)setLanguage:(NSDictionary *)overlaySettingsDict {
Expand Down Expand Up @@ -250,4 +259,36 @@ - (void) handleDirectApiError:(FlutterError*) flutterError {
self.recognizerRunner = nil;
}

- (NSString *)licenseErrorToString:(MBLicenseError)licenseError {
switch(licenseError) {
case MBLicenseErrorNetworkRequired:
return @"iOS license error: Network required";
break;
case MBLicenseErrorUnableToDoRemoteLicenceCheck:
return @"iOS license error: Unable to do remote licence check";
break;
case MBLicenseErrorLicenseIsLocked:
return @"iOS license error: License is locked";
break;
case MBLicenseErrorLicenseCheckFailed:
return @"iOS license error: License check failed";
break;
case MBLicenseErrorInvalidLicense:
return @"iOS license error: Invalid license";
break;
case MBLicenseErrorPermissionExpired:
return @"iOS license error: Permission expired";
break;
case MBLicenseErrorPayloadCorrupted:
return @"iOS license error: Payload corrupted";
break;
case MBLicenseErrorPayloadSignatureVerificationFailed:
return @"iOS license error: Payload signature verification failed";
break;
case MBLicenseErrorIncorrectTokenState:
return @"iOS license error: Incorrect token state";
break;
}
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@
+(NSDictionary * _Nonnull) serializeMBStringResult:(MBStringResult * _Nullable) value;
+(NSNumber * _Nullable)serializeMBSide:(MBSide) value;
+(NSDictionary * _Nonnull) serializeNSDate:(NSDate * _Nullable) value;
+(MBCustomClassRules * _Nonnull) deserializeMBCustomClassRules:(NSDictionary * _Nullable)jsonCustomClassRules;
@end
Loading

0 comments on commit 5b63ede

Please sign in to comment.