Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Unified Diff: ios/chrome/browser/web/external_app_launcher.mm

Issue 2893743002: Removed a delay that is no longer necessary. (Closed)
Patch Set: addressed comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1ae217ad9bbe640f65b20b188dd7e56c600db7c7..6cc7ee5d44877e4d8537e4e7defa4c9d056a9240 100644
--- a/ios/chrome/browser/web/external_app_launcher.mm
+++ b/ios/chrome/browser/web/external_app_launcher.mm
@@ -25,8 +25,6 @@
namespace {
-typedef void (^AlertHandler)(UIAlertAction* action);
-
// Returns a set of NSStrings that are URL schemes for iTunes Stores.
NSSet<NSString*>* ITMSSchemes() {
static NSSet<NSString*>* schemes;
@@ -71,26 +69,17 @@ NSString* PromptActionString(NSString* scheme) {
return @"";
}
-// Keys for dictionary parameters passed into
-// -openExternalAppWithPromptWithParams:.
-NSString* const kAlertPrompt = @"prompt";
-NSString* const kAlertAction = @"action";
-NSString* const kAlertURL = @"url";
-
} // namespace
@interface ExternalAppLauncher ()
// Returns the Phone/FaceTime call argument from |URL|.
+ (NSString*)formatCallArgument:(NSURL*)URL;
-// Asks user for confirmation before moving to external app. |params| is a
-// dictionary keyed with values of kAlert* above.
-- (void)openExternalAppWithPromptWithParams:
- (NSDictionary<NSString*, id>*)params;
-// Presents a configured alert controller on the root view controller.
-- (void)presentAlertControllerWithMessage:(NSString*)message
- openTitle:(NSString*)openTitle
- openHandler:(AlertHandler)openHandler
- cancelHandler:(AlertHandler)cancelHandler;
+// Presents an alert controller with |prompt| and |openLabel| as button label
+// on the root view controller before launching an external app identified by
+// |URL|.
+- (void)openExternalAppWithURL:(NSURL*)URL
+ prompt:(NSString*)prompt
+ openLabel:(NSString*)openLabel;
@end
@implementation ExternalAppLauncher
@@ -111,39 +100,26 @@ NSString* const kAlertURL = @"url";
return prompt;
}
-- (void)openExternalAppWithPromptWithParams:
- (NSDictionary<NSString*, id>*)params {
- NSURL* URL = base::mac::ObjCCastStrict<NSURL>(params[kAlertURL]);
- NSString* prompt = base::mac::ObjCCastStrict<NSString>(params[kAlertPrompt]);
- NSString* actionTitle =
- base::mac::ObjCCastStrict<NSString>(params[kAlertAction]);
- [self presentAlertControllerWithMessage:prompt
- openTitle:actionTitle
- openHandler:^(UIAlertAction* action) {
- RecordExternalApplicationOpened(true);
- OpenUrlWithCompletionHandler(URL, nil);
- }
- cancelHandler:^(UIAlertAction* action) {
- RecordExternalApplicationOpened(false);
- }];
-}
-
-- (void)presentAlertControllerWithMessage:(NSString*)message
- openTitle:(NSString*)openTitle
- openHandler:(AlertHandler)openHandler
- cancelHandler:(AlertHandler)cancelHandler {
+- (void)openExternalAppWithURL:(NSURL*)URL
+ prompt:(NSString*)prompt
+ openLabel:(NSString*)openLabel {
UIAlertController* alertController =
[UIAlertController alertControllerWithTitle:nil
- message:message
+ message:prompt
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* openAction =
- [UIAlertAction actionWithTitle:openTitle
+ [UIAlertAction actionWithTitle:openLabel
style:UIAlertActionStyleDefault
- handler:openHandler];
+ handler:^(UIAlertAction* action) {
+ RecordExternalApplicationOpened(true);
+ OpenUrlWithCompletionHandler(URL, nil);
+ }];
UIAlertAction* cancelAction =
[UIAlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL)
style:UIAlertActionStyleCancel
- handler:cancelHandler];
+ handler:^(UIAlertAction* action) {
+ RecordExternalApplicationOpened(false);
+ }];
[alertController addAction:cancelAction];
[alertController addAction:openAction];
@@ -163,43 +139,35 @@ NSString* const kAlertURL = @"url";
return NO;
NSURL* URL = net::NSURLWithGURL(gURL);
- NSMutableDictionary<NSString*, id>* params = [NSMutableDictionary dictionary];
if (base::ios::IsRunningOnOrLater(10, 3, 0)) {
if (UrlHasAppStoreScheme(gURL)) {
- params[kAlertPrompt] =
- l10n_util::GetNSString(IDS_IOS_OPEN_IN_ANOTHER_APP);
- params[kAlertAction] =
+ NSString* prompt = l10n_util::GetNSString(IDS_IOS_OPEN_IN_ANOTHER_APP);
+ NSString* openLabel =
l10n_util::GetNSString(IDS_IOS_APP_LAUNCHER_OPEN_APP_BUTTON_LABEL);
+ [self openExternalAppWithURL:URL prompt:prompt openLabel:openLabel];
+ return YES;
}
} else {
// Prior to iOS 10.3, iOS does not prompt user when facetime: and
// facetime-audio: URL schemes are opened, so Chrome needs to present an
// alert before placing a phone call.
if (UrlHasPhoneCallScheme(gURL)) {
- params[kAlertPrompt] = [[self class] formatCallArgument:URL];
- params[kAlertAction] = PromptActionString([URL scheme]);
+ [self openExternalAppWithURL:URL
+ prompt:[[self class] formatCallArgument:URL]
+ openLabel:PromptActionString([URL scheme])];
+ return YES;
}
// Prior to iOS 10.3, Chrome prompts user with an alert before opening
// App Store when user did not tap on any links and an iTunes app URL is
// opened. This maintains parity with Safari in pre-10.3 environment.
if (!linkClicked && UrlHasAppStoreScheme(gURL)) {
- params[kAlertPrompt] =
- l10n_util::GetNSString(IDS_IOS_OPEN_IN_ANOTHER_APP);
- params[kAlertAction] =
+ NSString* prompt = l10n_util::GetNSString(IDS_IOS_OPEN_IN_ANOTHER_APP);
+ NSString* openLabel =
l10n_util::GetNSString(IDS_IOS_APP_LAUNCHER_OPEN_APP_BUTTON_LABEL);
+ [self openExternalAppWithURL:URL prompt:prompt openLabel:openLabel];
+ return YES;
}
}
- if ([params count] > 0) {
- params[kAlertURL] = URL;
- // Note: 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 using -performSelector:withObject:afterDelay:.
- [self performSelector:@selector(openExternalAppWithPromptWithParams:)
- withObject:params
- afterDelay:0.0];
- return YES;
- }
// Replaces |URL| with a rewritten URL if it is of mailto: scheme.
if (!experimental_flags::IsNativeAppLauncherEnabled() &&
@@ -207,9 +175,8 @@ NSString* const kAlertURL = @"url";
MailtoURLRewriter* rewriter =
[[MailtoURLRewriter alloc] initWithStandardHandlers];
NSString* launchURL = [rewriter rewriteMailtoURL:gURL];
- if (launchURL) {
+ if (launchURL)
URL = [NSURL URLWithString:launchURL];
- }
UMA_HISTOGRAM_BOOLEAN("IOS.MailtoURLRewritten", launchURL != nil);
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698