Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ excluded:
- Build
- .build
- Tests
- AdyenCardScannerTests
Comment thread
nauaros marked this conversation as resolved.
- Internal
- Docs
- Demo
Expand Down
22 changes: 11 additions & 11 deletions AdyenCardScanner/Sources/CaptureSessionManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import AVFoundation
import CoreImage
import Foundation

protocol CaptureSessionDelegate: AnyObject {
internal protocol CaptureSessionDelegate: AnyObject {
func didCapture(image: CIImage?)
}

protocol CaptureSessionManaging {
internal protocol CaptureSessionManaging {
var delegate: CaptureSessionDelegate? { get set }
func configureSession()
func startCaptureSession()
Expand All @@ -21,9 +21,9 @@ protocol CaptureSessionManaging {
var videoPreviewLayer: AVCaptureVideoPreviewLayer { get }
}

class CaptureSessionManager: NSObject, CaptureSessionManaging {
internal class CaptureSessionManager: NSObject, CaptureSessionManaging {

enum Constants {
private enum Constants {
static let videoSettings: [String: Any] = [
kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA
]
Expand All @@ -37,8 +37,8 @@ class CaptureSessionManager: NSObject, CaptureSessionManaging {
private let videoOutputQueue = DispatchQueue(label: "com.cardscanner.videoOutputQueue")

private let captureDevice: AVCaptureDevice
let videoPreviewLayer: AVCaptureVideoPreviewLayer
weak var delegate: CaptureSessionDelegate?
internal let videoPreviewLayer: AVCaptureVideoPreviewLayer
internal weak var delegate: CaptureSessionDelegate?

private let captureSession: AVCaptureSession = {
let session = AVCaptureSession()
Expand All @@ -48,7 +48,7 @@ class CaptureSessionManager: NSObject, CaptureSessionManaging {

// MARK: - Initializers

init(captureDevice: AVCaptureDevice) {
internal init(captureDevice: AVCaptureDevice) {
self.captureDevice = captureDevice

self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
Expand All @@ -57,27 +57,27 @@ class CaptureSessionManager: NSObject, CaptureSessionManaging {

// MARK: - CaptureSessionManaging

func configureSession() {
internal func configureSession() {
sessionQueue.async {
try? self.configureCaptureSession()
}
}

func startCaptureSession() {
internal func startCaptureSession() {
sessionQueue.async {
guard !self.captureSession.isRunning else { return }
self.captureSession.startRunning()
}
}

func stopCaptureSession() {
internal func stopCaptureSession() {
sessionQueue.async {
guard self.captureSession.isRunning else { return }
self.captureSession.stopRunning()
}
}

func updateVideoOrientation() {
internal func updateVideoOrientation() {
guard
let connection = videoPreviewLayer.connection,
connection.isVideoOrientationSupported else {
Expand Down
8 changes: 4 additions & 4 deletions AdyenCardScanner/Sources/CardImageParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import CoreImage.CIFilterBuiltins
import Foundation
import Vision

protocol CardImageParsing {
internal protocol CardImageParsing {
func parse(
image: CIImage,
completion: @escaping (CreditCard) -> Void
)
}

class CardImageParser: CardImageParsing {
internal class CardImageParser: CardImageParsing {

private enum Constants {
static let expirationDateRegex = "\\d{2}\\/\\d{2,4}"
Expand All @@ -33,13 +33,13 @@ class CardImageParser: CardImageParsing {

// MARK: - Initializers

init(expirationDateFormatter: ExpirationDateFormatting) {
internal init(expirationDateFormatter: ExpirationDateFormatting) {
self.expirationDateFormatter = expirationDateFormatter
}

// MARK: - CardImageParsing

func parse(
internal func parse(
image: CIImage,
completion: @escaping (CreditCard) -> Void
) {
Expand Down
2 changes: 1 addition & 1 deletion AdyenCardScanner/Sources/CardScanner.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import Foundation
import UIKit

protocol CardScanning {
public protocol CardScanning {
static func createCardScanner(
completion: @escaping (Result<CreditCard, CardScannerError>) -> Void
) -> UIViewController?
Expand Down
10 changes: 5 additions & 5 deletions AdyenCardScanner/Sources/CardScannerAssembler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ import AVFoundation
import Foundation
import UIKit

protocol CardScannerAssembling {
internal protocol CardScannerAssembling {
func resolveCardScannerViewController(
completion: @escaping (Result<CreditCard, CardScannerError>) -> Void
) -> UIViewController?
}

class CardScannerAssembler: CardScannerAssembling {
internal class CardScannerAssembler: CardScannerAssembling {

// MARK: - Initializers

let captureDevice: AVCaptureDevice?
internal let captureDevice: AVCaptureDevice?

init() {
internal init() {
self.captureDevice = AVCaptureDevice.default(
.builtInWideAngleCamera,
for: .video,
Expand All @@ -30,7 +30,7 @@ class CardScannerAssembler: CardScannerAssembling {

// MARK: - CardScannerAssemblerProtocol

func resolveCardScannerViewController(
internal func resolveCardScannerViewController(
completion: @escaping (Result<CreditCard, CardScannerError>) -> Void
) -> UIViewController? {
guard let captureDevice else {
Expand Down
14 changes: 7 additions & 7 deletions AdyenCardScanner/Sources/CardScannerOverlayView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@

import UIKit

class CardScannerOverlayView: UIView {
internal class CardScannerOverlayView: UIView {

enum Style {
private enum Style {
static let backgroundColor = UIColor.black.withAlphaComponent(0.4)
}

enum Constants {
private enum Constants {
static let roiAspectRatio: CGFloat = 1.585 // Credit card aspect ratio
}

Expand All @@ -32,22 +32,22 @@ class CardScannerOverlayView: UIView {

// MARK: - Properties

@Published private(set) var roiFrame: CGRect = .zero
@Published internal private(set) var roiFrame: CGRect = .zero

// MARK: - Initializers

override init(frame: CGRect) {
override internal init(frame: CGRect) {
super.init(frame: frame)
setupMaskViews()
setupMasksLayout()
}

@available(*, unavailable)
required init?(coder: NSCoder) {
internal required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
override internal func layoutSubviews() {
super.layoutSubviews()
updateRoiLayout()
self.roiFrame = roiView.frame
Expand Down
14 changes: 7 additions & 7 deletions AdyenCardScanner/Sources/CardScannerViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import AVFoundation
import Combine
import UIKit

class CardScannerViewController: UIViewController {
internal class CardScannerViewController: UIViewController {

// MARK: - UI elements

Expand All @@ -27,20 +27,20 @@ class CardScannerViewController: UIViewController {

// MARK: - Initializers

init(viewModel: CardScannerViewModelProtocol) {
internal init(viewModel: CardScannerViewModelProtocol) {
self.viewModel = viewModel
self.previewLayer = viewModel.videoPreviewLayer
super.init(nibName: nil, bundle: nil)
}

@available(*, unavailable)
required init?(coder: NSCoder) {
internal required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: - View lifecycle

override func viewDidLoad() {
override internal func viewDidLoad() {
super.viewDidLoad()
setupPreviewLayer()
addOverlayView()
Expand All @@ -49,17 +49,17 @@ class CardScannerViewController: UIViewController {
viewModel.configureSession()
}

override func viewWillAppear(_ animated: Bool) {
override internal func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.startCaptureSession()
}

override func viewWillDisappear(_ animated: Bool) {
override internal func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
viewModel.stopCaptureSession()
}

override func viewDidLayoutSubviews() {
override internal func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
previewLayer.frame = view.bounds
viewModel.updateVideoOrientation()
Expand Down
28 changes: 14 additions & 14 deletions AdyenCardScanner/Sources/CardScannerViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import CoreImage
import Foundation
import QuartzCore

protocol CardScannerViewModelProtocol {
internal protocol CardScannerViewModelProtocol {
var videoPreviewLayer: CALayer { get }
func configureSession()
func startCaptureSession()
Expand All @@ -17,7 +17,7 @@ protocol CardScannerViewModelProtocol {
func update(previewLayerFrame: CGRect, roiInPreviewLayer: CGRect)
}

class CardScannerViewModel: CardScannerViewModelProtocol {
internal class CardScannerViewModel: CardScannerViewModelProtocol {

// MARK: - Properties

Expand All @@ -30,7 +30,7 @@ class CardScannerViewModel: CardScannerViewModelProtocol {

// MARK: - Initializers

init(
internal init(
cardImageParser: CardImageParsing,
captureSessionManager: CaptureSessionManaging,
completion: @escaping (Result<CreditCard, CardScannerError>) -> Void
Expand All @@ -43,34 +43,34 @@ class CardScannerViewModel: CardScannerViewModelProtocol {

// MARK: - CardScannerViewModelProtocol

var videoPreviewLayer: CALayer {
internal var videoPreviewLayer: CALayer {
captureSessionManager.videoPreviewLayer
}

func configureSession() {
internal func configureSession() {
captureSessionManager.configureSession()
}

func startCaptureSession() {
internal func startCaptureSession() {
captureSessionManager.startCaptureSession()
}

func stopCaptureSession() {
internal func stopCaptureSession() {
captureSessionManager.stopCaptureSession()
}

func updateVideoOrientation() {
internal func updateVideoOrientation() {
captureSessionManager.updateVideoOrientation()
}

func update(previewLayerFrame: CGRect, roiInPreviewLayer: CGRect) {
internal func update(previewLayerFrame: CGRect, roiInPreviewLayer: CGRect) {
self.previewFrame = previewLayerFrame
self.roiInPreviewFrame = roiInPreviewLayer
}

// MARK: - Private

private func getCardData(
private func fetchCardData(
from image: CIImage,
roiInPreviewFrame: CGRect,
previewFrame: CGRect
Expand All @@ -81,8 +81,8 @@ class CardScannerViewModel: CardScannerViewModelProtocol {
previewFrame: previewFrame
)

cardImageParser.parse(image: croppedImage) { creditCard in
self.completion(.success(creditCard))
cardImageParser.parse(image: croppedImage) { [weak self] creditCard in
self?.completion(.success(creditCard))
}
}

Expand Down Expand Up @@ -135,12 +135,12 @@ class CardScannerViewModel: CardScannerViewModelProtocol {

extension CardScannerViewModel: CaptureSessionDelegate {

func didCapture(image: CIImage?) {
internal func didCapture(image: CIImage?) {
guard let image else { return }

DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let self else { return }
getCardData(
fetchCardData(
from: image,
roiInPreviewFrame: roiInPreviewFrame,
previewFrame: previewFrame
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@

import Foundation

protocol ExpirationDateFormatting {
internal protocol ExpirationDateFormatting {
func date(from string: String) -> Date?
}

class ExpirationDateFormatter: ExpirationDateFormatting {
internal class ExpirationDateFormatter: ExpirationDateFormatting {

enum ExpirationDateFormat {
private enum ExpirationDateFormat {
static let short = "MM/yy"
static let long = "MM/yyyy"
}
Expand All @@ -24,7 +24,7 @@ class ExpirationDateFormatter: ExpirationDateFormatting {

// MARK: - Initializers

init() {
internal init() {
let locale = Locale.current
let timeZone = TimeZone(secondsFromGMT: 0)

Expand All @@ -39,7 +39,7 @@ class ExpirationDateFormatter: ExpirationDateFormatting {

// MARK: - ExpireDateFormatting

func date(from string: String) -> Date? {
internal func date(from string: String) -> Date? {
// First, try the short ("MM/YY") format
if let shortDate = shortDateFormatter.date(from: string) {
return shortDate
Expand Down
Loading
Loading