blob: 4f6599588530a5420c337450c09313ec76b36f47 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// 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/print/print_controller.h"
#import "base/logging.h"
#import "base/metrics/user_metrics.h"
#import "base/strings/sys_string_conversions.h"
#import "ios/chrome/browser/tabs/tab_title_util.h"
#import "ios/web/public/web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface PrintController () <UIPrintInteractionControllerDelegate>
// The view controller the system print dialog should be presented from if not
// specified in the print* command.
@property(nonatomic, weak) UIViewController* defaultBaseViewController;
// The view controller the system print dialog should be presented from.
// This can be passed in the print* method or `defaultBaseViewController` will
// be used.
@property(nonatomic, weak) UIViewController* baseViewController;
@end
@implementation PrintController
#pragma mark - Public Methods
- (instancetype)initWithBaseViewController:
(UIViewController*)baseViewController {
self = [super init];
if (self) {
self.defaultBaseViewController = baseViewController;
}
return self;
}
- (void)printView:(UIView*)view
withTitle:(NSString*)title
baseViewController:baseViewController {
UIPrintPageRenderer* renderer = [[UIPrintPageRenderer alloc] init];
[renderer addPrintFormatter:[view viewPrintFormatter]
startingAtPageAtIndex:0];
[self printRenderer:renderer
orItem:nil
withTitle:title
baseViewController:baseViewController];
}
- (void)printImage:(UIImage*)image
title:(NSString*)title
baseViewController:baseViewController {
[self printRenderer:nil
orItem:image
withTitle:title
baseViewController:baseViewController];
}
- (void)dismissAnimated:(BOOL)animated {
[[UIPrintInteractionController sharedPrintController]
dismissAnimated:animated];
}
#pragma mark - WebStatePrinter
- (void)printWebState:(web::WebState*)webState {
[self printWebState:webState
baseViewController:self.defaultBaseViewController];
}
- (void)printWebState:(web::WebState*)webState
baseViewController:baseViewController {
[self printView:webState->GetView()
withTitle:tab_util::GetTabTitle(webState)
baseViewController:baseViewController];
}
#pragma mark - UIPrintInteractionControllerDelegate
- (UIViewController*)printInteractionControllerParentViewController:
(UIPrintInteractionController*)printInteractionController {
return self.baseViewController;
}
#pragma mark - Private methods
// Utility method to print either a renderer or a printable item (as documented
// in UIPrintInteractionController printingItem).
// Exactly one of `renderer` and `item` must be not nil.
- (void)printRenderer:(UIPrintPageRenderer*)renderer
orItem:(id)item
withTitle:(NSString*)title
baseViewController:(UIViewController*)baseViewController {
// Only one item must be passed.
DCHECK_EQ((renderer ? 1 : 0) + (item ? 1 : 0), 1);
DCHECK(baseViewController);
self.baseViewController = baseViewController;
base::RecordAction(base::UserMetricsAction("MobilePrintMenuAirPrint"));
UIPrintInteractionController* printInteractionController =
[UIPrintInteractionController sharedPrintController];
printInteractionController.delegate = self;
UIPrintInfo* printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = title;
printInteractionController.printInfo = printInfo;
printInteractionController.printPageRenderer = renderer;
printInteractionController.printingItem = item;
[printInteractionController
presentAnimated:YES
completionHandler:^(UIPrintInteractionController* controller,
BOOL completed, NSError* error) {
if (error)
DLOG(ERROR) << "Air printing error: "
<< base::SysNSStringToUTF8(error.description);
}];
}
@end