| // Copyright 2019 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/common/app_group/app_group_command.h" |
| |
| #import "base/apple/bundle_locations.h" |
| #import "base/apple/foundation_util.h" |
| #import "base/strings/sys_string_conversions.h" |
| #import "ios/chrome/common/app_group/app_group_constants.h" |
| |
| namespace { |
| // Using GURL in the extension is not wanted as it includes ICU which makes the |
| // extension binary much larger; therefore, ios/chrome/common/x_callback_url.h |
| // cannot be used. This class makes a very basic use of x-callback-url, so no |
| // full implementation is required. |
| NSString* const kXCallbackURLHost = @"x-callback-url"; |
| |
| void PutCommandInNSUserDefault(NSDictionary* command) { |
| NSUserDefaults* shared_defaults = app_group::GetGroupUserDefaults(); |
| NSString* defaults_key = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandPreference); |
| |
| [shared_defaults setObject:command forKey:defaults_key]; |
| [shared_defaults synchronize]; |
| } |
| } // namespace |
| |
| @interface AppGroupCommand () |
| // The identifier of the extension that sent the order. |
| @property(nonatomic, strong) NSString* sourceApp; |
| |
| // A block that can be used to open a URL. |
| @property(nonatomic, strong) URLOpenerBlock opener; |
| @end |
| |
| @implementation AppGroupCommand |
| - (instancetype)initWithSourceApp:(NSString*)sourceApp |
| URLOpenerBlock:(URLOpenerBlock)opener { |
| self = [super init]; |
| if (self) { |
| _sourceApp = sourceApp; |
| _opener = opener; |
| } |
| return self; |
| } |
| |
| - (NSMutableDictionary*)baseCommandDictionary:(NSString*)command { |
| NSString* timePrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandTimePreference); |
| NSString* appPrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandAppPreference); |
| NSString* commandPrefKey = base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupCommandCommandPreference); |
| |
| return [NSMutableDictionary dictionaryWithDictionary:@{ |
| timePrefKey : [NSDate date], |
| appPrefKey : _sourceApp, |
| commandPrefKey : command, |
| }]; |
| } |
| |
| - (void)prepareWithCommandID:(NSString*)commandID { |
| PutCommandInNSUserDefault([self baseCommandDictionary:commandID]); |
| } |
| |
| - (void)prepareToOpenURL:(NSURL*)URL { |
| NSMutableDictionary* command = [self |
| baseCommandDictionary:base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupOpenURLCommand)]; |
| NSString* textPrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandTextPreference); |
| command[textPrefKey] = URL.absoluteString; |
| PutCommandInNSUserDefault(command); |
| } |
| |
| - (void)prepareToSearchText:(NSString*)text { |
| NSMutableDictionary* command = [self |
| baseCommandDictionary:base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupSearchTextCommand)]; |
| NSString* textPrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandTextPreference); |
| command[textPrefKey] = text; |
| PutCommandInNSUserDefault(command); |
| } |
| |
| - (void)prepareToSearchImage:(UIImage*)image { |
| NSMutableDictionary* command = [self |
| baseCommandDictionary:base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupSearchImageCommand)]; |
| NSString* dataPrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandDataPreference); |
| command[dataPrefKey] = UIImageJPEGRepresentation(image, 1.0); |
| PutCommandInNSUserDefault(command); |
| } |
| |
| - (void)prepareToOpenItem:(NSURL*)URL index:(NSNumber*)index { |
| NSMutableDictionary* command = [self |
| baseCommandDictionary:base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupOpenURLCommand)]; |
| NSString* textPrefKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandTextPreference); |
| NSString* indexKey = |
| base::SysUTF8ToNSString(app_group::kChromeAppGroupCommandIndexPreference); |
| command[textPrefKey] = URL.absoluteString; |
| command[indexKey] = index; |
| PutCommandInNSUserDefault(command); |
| } |
| |
| - (void)executeInApp { |
| NSString* scheme = |
| base::apple::ObjCCast<NSString>([base::apple::FrameworkBundle() |
| objectForInfoDictionaryKey:@"KSChannelChromeScheme"]); |
| if (!scheme) |
| return; |
| |
| NSURLComponents* urlComponents = [[NSURLComponents alloc] init]; |
| urlComponents.scheme = scheme; |
| urlComponents.host = kXCallbackURLHost; |
| urlComponents.path = [@"/" |
| stringByAppendingString:base::SysUTF8ToNSString( |
| app_group::kChromeAppGroupXCallbackCommand)]; |
| |
| NSURL* openURL = [urlComponents URL]; |
| _opener(openURL); |
| } |
| |
| @end |