blob: 99fc1757f9454cf14b82152123554871461177f3 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_mediator.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
#import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_image_processor.h"
#import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_mediator_delegate.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using base::UserMetricsAction;
@interface CreditCardScannerMediator ()
// Delegate notified when a card has been scanned.
@property(nonatomic, weak) id<CreditCardScannerMediatorDelegate>
creditCardScannerMediatorDelegate;
// This property is for an interface which notfies the credit card consumer.
@property(nonatomic, weak) id<CreditCardConsumer> creditCardConsumer;
// The card number set after |textRecognitionRequest| from recognised text on
// the card.
@property(nonatomic, strong) NSString* cardNumber;
// The card expiration month set after |textRecognitionRequest| from recognised
// text on the card.
@property(nonatomic, strong) NSString* expirationMonth;
// The card expiration year set after |textRecognitionRequest| from recognised
// text on the card.
@property(nonatomic, strong) NSString* expirationYear;
// Object to Perform image processing and return the text on the image.
@property(nonatomic, strong)
CreditCardScannerImageProcessor* creditCardImageScanner;
@end
@implementation CreditCardScannerMediator
#pragma mark - Lifecycle
- (instancetype)initWithDelegate:(id<CreditCardScannerMediatorDelegate>)
creditCardScannerMediatorDelegate
creditCardConsumer:(id<CreditCardConsumer>)creditCardConsumer {
self = [super init];
if (self) {
_creditCardScannerMediatorDelegate = creditCardScannerMediatorDelegate;
_creditCardConsumer = creditCardConsumer;
_creditCardImageScanner =
[[CreditCardScannerImageProcessor alloc] initWithConsumer:self];
}
return self;
}
#pragma mark - CreditCardScannerImageDelegate
- (void)processOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
viewport:(CGRect)viewport {
// Current thread is unknown background thread as is a callback from UIKit.
DCHECK(!NSThread.isMainThread);
[self.creditCardImageScanner processOutputSampleBuffer:sampleBuffer
viewport:viewport];
}
#pragma mark - CreditCardConsumer
- (void)setCreditCardNumber:(NSString*)cardNumber
expirationMonth:(NSString*)expirationMonth
expirationYear:(NSString*)expirationYear {
[self.creditCardConsumer setCreditCardNumber:cardNumber
expirationMonth:expirationMonth
expirationYear:expirationYear];
self.creditCardImageScanner = nil;
[self dismissScannerOnCardScanned];
}
#pragma mark - Helper Methods
// Dismisses the scanner when credit card number is found.
- (void)dismissScannerOnCardScanned {
base::RecordAction(UserMetricsAction("MobileCreditCardScannerScannedCard"));
[self.creditCardScannerMediatorDelegate
creditCardScannerMediatorDidFinishScan:self];
}
@end