chromium/ios/web_view/shell/shell_translation_delegate.m

// Copyright 2014 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/web_view/shell/shell_translation_delegate.h"

#import <UIKit/UIKit.h>

@interface ShellTranslationDelegate ()
// Action Sheet to prompt user whether or not the page should be translated.
@property(nonatomic, strong) UIAlertController* beforeTranslateActionSheet;
@end

@implementation ShellTranslationDelegate

@synthesize beforeTranslateActionSheet = _beforeTranslateActionSheet;

- (void)dealloc {
  [_beforeTranslateActionSheet dismissViewControllerAnimated:YES
                                                  completion:nil];
}

#pragma mark - CWVTranslationDelegate methods

- (void)translationController:(CWVTranslationController*)controller
    canOfferTranslationFromLanguage:(CWVTranslationLanguage*)pageLanguage
                         toLanguage:(CWVTranslationLanguage*)userLanguage {
  NSLog(@"%@:%@:%@", NSStringFromSelector(_cmd), pageLanguage, userLanguage);
  __weak ShellTranslationDelegate* weakSelf = self;

  self.beforeTranslateActionSheet = [UIAlertController
      alertControllerWithTitle:nil
                       message:@"Pick Translate Action"
                preferredStyle:UIAlertControllerStyleActionSheet];
  _beforeTranslateActionSheet.popoverPresentationController.sourceView =
      [self anyKeyWindow];
  CGRect bounds = [self anyKeyWindow].bounds;
  _beforeTranslateActionSheet.popoverPresentationController.sourceRect =
      CGRectMake(CGRectGetWidth(bounds) / 2, 60, 1, 1);
  UIAlertAction* cancelAction =
      [UIAlertAction actionWithTitle:@"Nope."
                               style:UIAlertActionStyleCancel
                             handler:^(UIAlertAction* action) {
                               weakSelf.beforeTranslateActionSheet = nil;
                             }];
  [_beforeTranslateActionSheet addAction:cancelAction];

  NSString* translateTitle = [NSString
      stringWithFormat:@"Translate to %@", userLanguage.localizedName];
  UIAlertAction* translateAction = [UIAlertAction
      actionWithTitle:translateTitle
                style:UIAlertActionStyleDefault
              handler:^(UIAlertAction* action) {
                weakSelf.beforeTranslateActionSheet = nil;
                if (!weakSelf) {
                  return;
                }
                CWVTranslationLanguage* source = pageLanguage;
                CWVTranslationLanguage* target = userLanguage;
                [controller translatePageFromLanguage:source
                                           toLanguage:target
                                        userInitiated:YES];
              }];
  [_beforeTranslateActionSheet addAction:translateAction];

  UIAlertAction* alwaysTranslateAction = [UIAlertAction
      actionWithTitle:@"Always Translate"
                style:UIAlertActionStyleDefault
              handler:^(UIAlertAction* action) {
                weakSelf.beforeTranslateActionSheet = nil;
                if (!weakSelf) {
                  return;
                }
                CWVTranslationPolicy* policy = [CWVTranslationPolicy
                    translationPolicyAutoTranslateToLanguage:userLanguage];
                [controller setTranslationPolicy:policy
                                 forPageLanguage:pageLanguage];
              }];
  [_beforeTranslateActionSheet addAction:alwaysTranslateAction];

  UIAlertAction* neverTranslateAction = [UIAlertAction
      actionWithTitle:@"Never Translate"
                style:UIAlertActionStyleDefault
              handler:^(UIAlertAction* action) {
                weakSelf.beforeTranslateActionSheet = nil;
                if (!weakSelf) {
                  return;
                }
                CWVTranslationPolicy* policy =
                    [CWVTranslationPolicy translationPolicyNever];
                [controller setTranslationPolicy:policy
                                 forPageLanguage:pageLanguage];
              }];
  [_beforeTranslateActionSheet addAction:neverTranslateAction];

  [[self anyKeyWindow].rootViewController
      presentViewController:_beforeTranslateActionSheet
                   animated:YES
                 completion:nil];
}

- (void)translationController:(CWVTranslationController*)controller
    didStartTranslationFromLanguage:(CWVTranslationLanguage*)sourceLanguage
                         toLanguage:(CWVTranslationLanguage*)targetLanguage
                      userInitiated:(BOOL)userInitiated {
  NSLog(@"%@:%@:%@:%@", NSStringFromSelector(_cmd), sourceLanguage,
        targetLanguage, @(userInitiated));
}

- (void)translationController:(CWVTranslationController*)controller
    didFinishTranslationFromLanguage:(CWVTranslationLanguage*)sourceLanguage
                          toLanguage:(CWVTranslationLanguage*)targetLanguage
                               error:(nullable NSError*)error {
  NSLog(@"%@:%@:%@:%@", NSStringFromSelector(_cmd), sourceLanguage,
        targetLanguage, error);
}

#pragma mark - Private

- (UIWindow*)anyKeyWindow {
  for (UIWindowScene* windowScene in UIApplication.sharedApplication
           .connectedScenes) {
    NSAssert([windowScene isKindOfClass:[UIWindowScene class]],
             @"UIScene is not a UIWindowScene: %@", windowScene);
    for (UIWindow* window in windowScene.windows) {
      if (window.isKeyWindow) {
        return window;
      }
    }
  }

  return nil;
}

@end