| Index: ios/chrome/browser/web/external_app_launcher.mm
|
| diff --git a/ios/chrome/browser/web/external_app_launcher.mm b/ios/chrome/browser/web/external_app_launcher.mm
|
| index 74b5023071bb45c8beaa45d4cd80a0a928d74629..631e34042e7e42bb00a5b5859feb13f5b00b8503 100644
|
| --- a/ios/chrome/browser/web/external_app_launcher.mm
|
| +++ b/ios/chrome/browser/web/external_app_launcher.mm
|
| @@ -4,6 +4,7 @@
|
|
|
| #import "ios/chrome/browser/web/external_app_launcher.h"
|
|
|
| +#include "base/ios/ios_util.h"
|
| #include "base/ios/weak_nsobject.h"
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram_macros.h"
|
| @@ -47,13 +48,30 @@ void RecordExternalApplicationOpened(bool opened) {
|
| UMA_HISTOGRAM_BOOLEAN("Tab.ExternalApplicationOpened", opened);
|
| }
|
|
|
| +// Returns whether gURL has the scheme of a URL that initiates a call.
|
| +BOOL UrlHasPhoneCallScheme(const GURL& gURL) {
|
| + return gURL.SchemeIs("tel") || gURL.SchemeIs("facetime") ||
|
| + gURL.SchemeIs("facetime-audio");
|
| +}
|
| +
|
| +// Returns a string to be used as the label for the prompt's action button.
|
| +NSString* PromptActionString(NSString* scheme) {
|
| + if ([scheme isEqualToString:@"facetime"])
|
| + return l10n_util::GetNSString(IDS_IOS_FACETIME_BUTTON);
|
| + else if ([scheme isEqualToString:@"tel"] ||
|
| + [scheme isEqualToString:@"facetime-audio"])
|
| + return l10n_util::GetNSString(IDS_IOS_PHONE_CALL_BUTTON);
|
| + NOTREACHED();
|
| + return @"";
|
| +}
|
| +
|
| } // namespace
|
|
|
| @interface ExternalAppLauncher ()
|
| // Returns the Phone/FaceTime call argument from |URL|.
|
| + (NSString*)formatCallArgument:(NSURL*)URL;
|
| -// Ask user for confirmation before dialing FaceTime destination.
|
| -- (void)openFaceTimePromptForURL:(NSURL*)telURL;
|
| +// Ask user for confirmation before dialing Phone or FaceTime destinations.
|
| +- (void)openPromptForURL:(NSURL*)URL;
|
| // Ask user for confirmation before moving to external app.
|
| - (void)openExternalAppWithPromptForURL:(NSURL*)URL;
|
| // Presents a configured alert controller on the root view controller.
|
| @@ -96,10 +114,9 @@ void RecordExternalApplicationOpened(bool opened) {
|
| }];
|
| }
|
|
|
| -- (void)openFaceTimePromptForURL:(NSURL*)URL {
|
| - NSString* openTitle = l10n_util::GetNSString(IDS_IOS_FACETIME_BUTTON);
|
| +- (void)openPromptForURL:(NSURL*)URL {
|
| [self presentAlertControllerWithMessage:[[self class] formatCallArgument:URL]
|
| - openTitle:openTitle
|
| + openTitle:PromptActionString(URL.scheme)
|
| openHandler:^(UIAlertAction* action) {
|
| OpenUrlWithCompletionHandler(URL, nil);
|
| }
|
| @@ -136,26 +153,20 @@ void RecordExternalApplicationOpened(bool opened) {
|
| return NO;
|
| NSURL* URL = net::NSURLWithGURL(gURL);
|
|
|
| - if (gURL.SchemeIs("facetime") || gURL.SchemeIs("facetime-audio")) {
|
| + // iOS 10.3.2 introduced new prompts when facetime: and facetime-audio:
|
| + // URL schemes are opened. It is no longer necessary for Chrome to present
|
| + // another prompt before the system-provided prompt.
|
| + if (!base::ios::IsRunningOnOrLater(10, 3, 2) && UrlHasPhoneCallScheme(gURL)) {
|
| // Showing an alert view immediately has a side-effect where focus is
|
| // taken from the UIWebView so quickly that mouseup events are lost and
|
| // buttons get 'stuck' in the on position. The solution is to defer
|
| // showing the view.
|
| - [self performSelector:@selector(openFaceTimePromptForURL:)
|
| + [self performSelector:@selector(openPromptForURL:)
|
| withObject:URL
|
| afterDelay:0.0];
|
| return YES;
|
| }
|
|
|
| - // Use telprompt instead of tel because telprompt returns user back to
|
| - // Chrome after phone call is completed/aborted.
|
| - if (gURL.SchemeIs("tel")) {
|
| - GURL::Replacements replacements;
|
| - replacements.SetSchemeStr("telprompt");
|
| - URL = net::NSURLWithGURL(gURL.ReplaceComponents(replacements));
|
| - DCHECK([[URL scheme] isEqualToString:@"telprompt"]);
|
| - }
|
| -
|
| // Don't open external application if chrome is not active.
|
| if ([[UIApplication sharedApplication] applicationState] !=
|
| UIApplicationStateActive)
|
|
|