Skip to content

Commit

Permalink
Added UnifiedResult and fixed selfie and faceliveness signature.
Browse files Browse the repository at this point in the history
  • Loading branch information
Li-Bot committed Aug 26, 2021
1 parent 48ca3cb commit df68dbe
Show file tree
Hide file tree
Showing 10 changed files with 199 additions and 30 deletions.
28 changes: 24 additions & 4 deletions ZenIDDemo.xcodeproj/project.pbxproj
Expand Up @@ -53,6 +53,10 @@
01859B0622C4863C005B7E36 /* UIDevice+Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01859B0522C4863C005B7E36 /* UIDevice+Size.swift */; };
01B8F88622B92BE100D8B75E /* MessagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B8F88522B92BE100D8B75E /* MessagesView.swift */; };
01EDB2C3231FAE22009B0859 /* UIImageView+Clipping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EDB2C2231FAE22009B0859 /* UIImageView+Clipping.swift */; };
18237B3026D79DB800D83627 /* UnifiedResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18237B2F26D79DB700D83627 /* UnifiedResult.swift */; };
18237B3226D79E0F00D83627 /* UnifiedState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18237B3126D79E0F00D83627 /* UnifiedState.swift */; };
18237B3426D79E7100D83627 /* UnifiedDocumentResultAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18237B3326D79E7100D83627 /* UnifiedDocumentResultAdapter.swift */; };
18237B3626D7A13300D83627 /* UnifiedSelfieResultAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18237B3526D7A13300D83627 /* UnifiedSelfieResultAdapter.swift */; };
18953D46268233AD0077F976 /* Menu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 18953D45268233AD0077F976 /* Menu.storyboard */; };
18953D492682419A0077F976 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18953D482682419A0077F976 /* SettingsViewController.swift */; };
18953D4B268241CC0077F976 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18953D4A268241CC0077F976 /* SettingsView.swift */; };
Expand Down Expand Up @@ -121,6 +125,7 @@
18953DE02685F3310077F976 /* SelfieSelectionCoordinable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18953DDF2685F3310077F976 /* SelfieSelectionCoordinable.swift */; };
18953DE4268994D60077F976 /* DocumentsFilterValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18953DE3268994D60077F976 /* DocumentsFilterValidator.swift */; };
18953DE62689959F0077F976 /* RecogLibDocumentsFilterValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18953DE52689959F0077F976 /* RecogLibDocumentsFilterValidator.swift */; };
18A7B91526D7A38000BD8A83 /* UnifiedFacelivenessResultAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A7B91426D7A38000BD8A83 /* UnifiedFacelivenessResultAdapter.swift */; };
6F2D536C24696A2A001C3544 /* QrSquareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F2D536B24696A2A001C3544 /* QrSquareView.swift */; };
6F2D536E246970DC001C3544 /* QrScannerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F2D536D246970DC001C3544 /* QrScannerController.swift */; };
6F2D53712469A937001C3544 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F2D53702469A937001C3544 /* Credentials.swift */; };
Expand Down Expand Up @@ -235,6 +240,10 @@
01859B0522C4863C005B7E36 /* UIDevice+Size.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Size.swift"; sourceTree = "<group>"; };
01B8F88522B92BE100D8B75E /* MessagesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesView.swift; sourceTree = "<group>"; };
01EDB2C2231FAE22009B0859 /* UIImageView+Clipping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Clipping.swift"; sourceTree = "<group>"; };
18237B2F26D79DB700D83627 /* UnifiedResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedResult.swift; sourceTree = "<group>"; };
18237B3126D79E0F00D83627 /* UnifiedState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedState.swift; sourceTree = "<group>"; };
18237B3326D79E7100D83627 /* UnifiedDocumentResultAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedDocumentResultAdapter.swift; sourceTree = "<group>"; };
18237B3526D7A13300D83627 /* UnifiedSelfieResultAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedSelfieResultAdapter.swift; sourceTree = "<group>"; };
18953D45268233AD0077F976 /* Menu.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Menu.storyboard; sourceTree = "<group>"; };
18953D482682419A0077F976 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
18953D4A268241CC0077F976 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -303,6 +312,7 @@
18953DDF2685F3310077F976 /* SelfieSelectionCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelfieSelectionCoordinable.swift; sourceTree = "<group>"; };
18953DE3268994D60077F976 /* DocumentsFilterValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentsFilterValidator.swift; sourceTree = "<group>"; };
18953DE52689959F0077F976 /* RecogLibDocumentsFilterValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecogLibDocumentsFilterValidator.swift; sourceTree = "<group>"; };
18A7B91426D7A38000BD8A83 /* UnifiedFacelivenessResultAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedFacelivenessResultAdapter.swift; sourceTree = "<group>"; };
6F2D536B24696A2A001C3544 /* QrSquareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrSquareView.swift; sourceTree = "<group>"; };
6F2D536D246970DC001C3544 /* QrScannerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrScannerController.swift; sourceTree = "<group>"; };
6F2D53702469A937001C3544 /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -504,6 +514,11 @@
D2CB352622BB84CA00453DB8 /* DispatchError.swift */,
D2CB352822BB84F700453DB8 /* DispatchResult.swift */,
D293FE1922CA393D00FC49D0 /* RecoglibMapper.swift */,
18237B2F26D79DB700D83627 /* UnifiedResult.swift */,
18237B3126D79E0F00D83627 /* UnifiedState.swift */,
18237B3326D79E7100D83627 /* UnifiedDocumentResultAdapter.swift */,
18237B3526D7A13300D83627 /* UnifiedSelfieResultAdapter.swift */,
18A7B91426D7A38000BD8A83 /* UnifiedFacelivenessResultAdapter.swift */,
);
path = Model;
sourceTree = "<group>";
Expand Down Expand Up @@ -912,6 +927,7 @@
18953D6B26824AF10077F976 /* BasicTableCellController.swift in Sources */,
0141C03A23A853EE00566078 /* Circle.swift in Sources */,
18953D562682444E0077F976 /* SettingsViewModel.swift in Sources */,
18237B3226D79E0F00D83627 /* UnifiedState.swift in Sources */,
01859B0422C360CE005B7E36 /* ToastView.swift in Sources */,
18953DA1268314850077F976 /* AddDocumentFilterCountryCellController.swift in Sources */,
18953DE62689959F0077F976 /* RecogLibDocumentsFilterValidator.swift in Sources */,
Expand Down Expand Up @@ -959,17 +975,20 @@
0134755A21EE2179004EE4E5 /* Client.swift in Sources */,
0134753721ECBD1F004EE4E5 /* Enums.swift in Sources */,
6F8EEF1F24C4E62A00208223 /* Torch.swift in Sources */,
18237B3626D7A13300D83627 /* UnifiedSelfieResultAdapter.swift in Sources */,
0141C02823A38AAF00566078 /* SelectCountryView.swift in Sources */,
0141C02E23A7917B00566078 /* Line.swift in Sources */,
18953D4B268241CC0077F976 /* SettingsView.swift in Sources */,
18953DD12684E3B10077F976 /* SelfieSelectionComposer.swift in Sources */,
18237B3426D79E7100D83627 /* UnifiedDocumentResultAdapter.swift in Sources */,
18953D502682428F0077F976 /* GroupedTableView.swift in Sources */,
011C6A8A22BCF8A80053ABF6 /* CameraViewControllerDelegate.swift in Sources */,
D2CB351E22BA792400453DB8 /* Data+resizing.swift in Sources */,
012F7B62228AA85700B0BBB6 /* CameraViewController.swift in Sources */,
18953D492682419A0077F976 /* SettingsViewController.swift in Sources */,
6F2D53732469B24B001C3544 /* CredentialsQrCode.swift in Sources */,
18953DBC268468180077F976 /* DocumentVerifierSettingsComposer.swift in Sources */,
18A7B91526D7A38000BD8A83 /* UnifiedFacelivenessResultAdapter.swift in Sources */,
18953D782682E5220077F976 /* DocumentsFilterViewModel.swift in Sources */,
18953D812682E6BF0077F976 /* DocumentsFilter.swift in Sources */,
D293FE1A22CA393D00FC49D0 /* RecoglibMapper.swift in Sources */,
Expand All @@ -979,6 +998,7 @@
18953DDC2685EC530077F976 /* SelfieSelectionLoaderComposer.swift in Sources */,
0141C03C23A8E2D000566078 /* Text.swift in Sources */,
18953D52268242BA0077F976 /* TableViewSectionViewModel.swift in Sources */,
18237B3026D79DB800D83627 /* UnifiedResult.swift in Sources */,
D2CB352222BA807A00453DB8 /* UIFont+Styles.swift in Sources */,
18953D972682F4B70077F976 /* AddDocumentFilterContentView.swift in Sources */,
6FFC82C2247F029D00CB4979 /* QrScannerControllerDelegate.swift in Sources */,
Expand Down Expand Up @@ -1166,7 +1186,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 10;
CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = FQAZ2Y87Y2;
ENABLE_BITCODE = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -1184,7 +1204,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.3.4;
MARKETING_VERSION = 1.3.5;
PRODUCT_BUNDLE_IDENTIFIER = cz.trask.ZenID;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Development: ZenID Demo Debug";
Expand All @@ -1200,7 +1220,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 10;
CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = FQAZ2Y87Y2;
ENABLE_BITCODE = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -1215,7 +1235,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.3.4;
MARKETING_VERSION = 1.3.5;
PRODUCT_BUNDLE_IDENTIFIER = cz.trask.ZenID;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Development: ZenID Demo Debug";
Expand Down
25 changes: 11 additions & 14 deletions ZenIDDemo/Controller/Camera/CameraViewController.swift
@@ -1,18 +1,12 @@
//
// CameraViewController.swift
// ZenIDDemo
//
// Created by František Kratochvíl on 14/05/2019.
// Copyright © 2019 Trask, a.s. All rights reserved.
//

import AVFoundation
import CoreGraphics
import RecogLib_iOS
import UIKit

public class CameraViewController: UIViewController {
public weak var delegate: CameraViewControllerDelegate?

class CameraViewController: UIViewController {
weak var delegate: CameraViewControllerDelegate?

// This enables / disables additional debug visualisation hints from the ZenID framework
public var showVisualisationDebugInfo: Bool = false {
Expand Down Expand Up @@ -389,8 +383,9 @@ public class CameraViewController: UIViewController {
guard detectionRunning else { return }
detectionRunning = false

let unifiedResult = result == nil ? nil : UnifiedDocumentResultAdapter(result: result!)
// return preview image
returnImage(buffer, ImageFlip.fromLandScape, result: result)
returnImage(buffer, ImageFlip.fromLandScape, result: unifiedResult)
}

private func updateView(with result: HologramResult?, buffer: CVPixelBuffer) {
Expand Down Expand Up @@ -427,8 +422,9 @@ public class CameraViewController: UIViewController {
guard detectionRunning else { return }
detectionRunning = false

let unifiedResult = result == nil ? nil : UnifiedFacelivenessResultAdapter(result: result!)
// return preview image
returnImage(buffer, ImageFlip.fromPortrait)
returnImage(buffer, ImageFlip.fromPortrait, result: unifiedResult)
}

private func updateView(with result: SelfieResult?, buffer: CVPixelBuffer) {
Expand All @@ -446,8 +442,9 @@ public class CameraViewController: UIViewController {
guard detectionRunning else { return }
detectionRunning = false

let unifiedResult = result == nil ? nil : UnifiedSelfieResultAdapter(result: result!)
// return preview image
returnImage(buffer, ImageFlip.fromPortrait)
returnImage(buffer, ImageFlip.fromPortrait, result: unifiedResult)
}

@objc private func capture() {
Expand Down Expand Up @@ -482,13 +479,13 @@ public class CameraViewController: UIViewController {
delegate?.didFinishPDF()
}

private func returnImage(_ buffer: CVPixelBuffer, _ flipMethod: ImageFlip, result: DocumentResult? = nil) {
private func returnImage(_ buffer: CVPixelBuffer, _ flipMethod: ImageFlip, result: UnifiedResult? = nil) {
let image = UIImage(pixelBuffer: buffer)?.flip(flipMethod)
let data = image?.jpegData(compressionQuality: 0.5)
returnImage(data, result)
}

private func returnImage(_ data: Data?, _ result: DocumentResult? = nil) {
private func returnImage(_ data: Data?, _ result: UnifiedResult? = nil) {
if let data = data, let image = UIImage(data: data) {
let preview = PreviewViewController(title:title ?? "", image: image)
preview.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
Expand Down
12 changes: 3 additions & 9 deletions ZenIDDemo/Controller/Camera/CameraViewControllerDelegate.swift
@@ -1,17 +1,11 @@
//
// CameraViewControllerDelegate.swift
// ZenIDDemo
//
// Created by František Kratochvíl on 21/06/2019.
// Copyright © 2019 Trask, a.s. All rights reserved.
//

import UIKit
import AVFoundation
import RecogLib_iOS

public protocol CameraViewControllerDelegate: class {
func didTakePhoto(_ imageData: Data?, type: PhotoType, result: DocumentResult?)

protocol CameraViewControllerDelegate: class {
func didTakePhoto(_ imageData: Data?, type: PhotoType, result: UnifiedResult?)
func didTakeVideo(_ videoAsset: AVURLAsset?, type: PhotoType)
func didFinishPDF()
}
4 changes: 2 additions & 2 deletions ZenIDDemo/Controller/ChoiceViewController.swift
Expand Up @@ -31,7 +31,7 @@ final class ChoiceViewController: UIViewController {
passportButton,
otherDocumentButton,
documentsFilterButton,
hologramButton,
//hologramButton,
//faceButton,
logsButton
]
Expand Down Expand Up @@ -256,7 +256,7 @@ final class ChoiceViewController: UIViewController {
}

extension ChoiceViewController: CameraViewControllerDelegate {
func didTakePhoto(_ imageData: Data?, type: PhotoType, result: DocumentResult?) {
func didTakePhoto(_ imageData: Data?, type: PhotoType, result: UnifiedResult?) {
if let data = imageData {
scanProcess?.processPhoto(imageData: data, type: type, result: result)
}
Expand Down
2 changes: 1 addition & 1 deletion ZenIDDemo/Main/ScanProcess.swift
Expand Up @@ -126,7 +126,7 @@ final class ScanProcess {
/// - Parameters:
/// - imageData: the image data
/// - type: photo sample type
public func processPhoto(imageData: Data, type: PhotoType, result: DocumentResult?) {
public func processPhoto(imageData: Data, type: PhotoType, result: UnifiedResult?) {
checkIfIsFinishedAndCallDelegate()
self.scanNextSample()
let imageInput = ImageInput(
Expand Down
47 changes: 47 additions & 0 deletions ZenIDDemo/Model/UnifiedDocumentResultAdapter.swift
@@ -0,0 +1,47 @@

import Foundation
import RecogLib_iOS


final class UnifiedDocumentResultAdapter: UnifiedResult {

let state: UnifiedState
let role: RecogLib_iOS.DocumentRole?
let country: RecogLib_iOS.Country?
let code: RecogLib_iOS.DocumentCode?
let page: RecogLib_iOS.PageCode?
let signature: ImageSignature?

init(result: DocumentResult) {
state = result.state.toDomain()
role = result.role
country = result.country
code = result.code
page = result.page
signature = result.signature
}

}

extension DocumentState {
func toDomain() -> UnifiedState {
switch self {
case .AlignCard:
return .alignCard
case .Blurry:
return .blurry
case .Dark:
return .dark
case .HoldSteady:
return .holdSteady
case .NoMatchFound:
return .notFound
case .Ok:
return .ok
case .Hologram:
return .hologram
case .ReflectionPresent:
return .reflectionPresent
}
}
}
39 changes: 39 additions & 0 deletions ZenIDDemo/Model/UnifiedFacelivenessResultAdapter.swift
@@ -0,0 +1,39 @@

import Foundation
import RecogLib_iOS


final class UnifiedFacelivenessResultAdapter: UnifiedResult {

let state: UnifiedState
let role: RecogLib_iOS.DocumentRole?
let country: RecogLib_iOS.Country?
let code: RecogLib_iOS.DocumentCode?
let page: RecogLib_iOS.PageCode?
let signature: ImageSignature?

init(result: FaceLivenessResult) {
state = result.faceLivenessState.toDomain()
role = nil
country = nil
code = nil
page = nil
signature = result.signature
}

}

extension FaceLivenessState {
func toDomain() -> UnifiedState {
switch self {
case .LookAtMe:
return .lookAtMe
case .TurnHead:
return .turnHead
case .Smile:
return .smile
case .Ok:
return .ok
}
}
}
13 changes: 13 additions & 0 deletions ZenIDDemo/Model/UnifiedResult.swift
@@ -0,0 +1,13 @@

import Foundation
import RecogLib_iOS


protocol UnifiedResult {
var state: UnifiedState { get }
var role: RecogLib_iOS.DocumentRole? { get }
var country: RecogLib_iOS.Country? { get }
var code: RecogLib_iOS.DocumentCode? { get }
var page: RecogLib_iOS.PageCode? { get }
var signature: RecogLib_iOS.ImageSignature? { get }
}
41 changes: 41 additions & 0 deletions ZenIDDemo/Model/UnifiedSelfieResultAdapter.swift
@@ -0,0 +1,41 @@

import Foundation
import RecogLib_iOS


final class UnifiedSelfieResultAdapter: UnifiedResult {

let state: UnifiedState
let role: RecogLib_iOS.DocumentRole?
let country: RecogLib_iOS.Country?
let code: RecogLib_iOS.DocumentCode?
let page: RecogLib_iOS.PageCode?
let signature: ImageSignature?

init(result: SelfieResult) {
state = result.selfieState.toDomain()
role = nil
country = nil
code = nil
page = nil
signature = result.signature
}

}

extension SelfieState {
func toDomain() -> UnifiedState {
switch self {
case .ConfirmingFace:
return .confirming
case .Blurry:
return .blurry
case .Dark:
return .dark
case .NoFaceFound:
return .notFound
case .Ok:
return .ok
}
}
}

0 comments on commit df68dbe

Please sign in to comment.