// Copyright 2023 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/intents/intents_donation_helper.h"
#import "base/feature_list.h"
#import "base/metrics/histogram_functions.h"
#import "base/notreached.h"
#import "base/task/thread_pool.h"
#import "ios/chrome/browser/shared/public/features/features.h"
#import "ios/chrome/common/intents/ClearBrowsingDataIntent.h"
#import "ios/chrome/common/intents/OpenBookmarksIntent.h"
#import "ios/chrome/common/intents/OpenLatestTabIntent.h"
#import "ios/chrome/common/intents/OpenLensIntent.h"
#import "ios/chrome/common/intents/OpenNewTabIntent.h"
#import "ios/chrome/common/intents/OpenReadingListIntent.h"
#import "ios/chrome/common/intents/OpenRecentTabsIntent.h"
#import "ios/chrome/common/intents/OpenTabGridIntent.h"
#import "ios/chrome/common/intents/PlayDinoGameIntent.h"
#import "ios/chrome/common/intents/SearchInChromeIntent.h"
#import "ios/chrome/common/intents/SearchWithVoiceIntent.h"
#import "ios/chrome/common/intents/SetChromeDefaultBrowserIntent.h"
#import "ios/chrome/common/intents/ViewHistoryIntent.h"
#import "ios/chrome/grit/ios_branded_strings.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util.h"
@implementation IntentDonationHelper
+ (void)donateIntent:(IntentType)intentType {
base::UmaHistogramEnumeration("IOS.Spotlight.DonatedIntentType", intentType);
base::ThreadPool::PostTask(
FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
base::BindOnce(^{
INInteraction* interaction = [self interactionForIntentType:intentType];
[interaction donateInteractionWithCompletion:nil];
}));
}
+ (INInteraction*)interactionForIntentType:(IntentType)intentType {
switch (intentType) {
case IntentType::kSearchInChrome: {
SearchInChromeIntent* searchInChromeIntent =
[[SearchInChromeIntent alloc] init];
// SiriKit requires the intent parameter to be set to a non-empty
// string in order to accept the intent donation. Set it to a single
// space, to be later trimmed by the intent handler, which will result
// in the shortcut being treated as if no search phrase was supplied.
searchInChromeIntent.searchPhrase = @" ";
searchInChromeIntent.suggestedInvocationPhrase = l10n_util::GetNSString(
IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:searchInChromeIntent
response:nil];
return interaction;
}
case IntentType::kOpenReadingList: {
OpenReadingListIntent* openReadingListIntent =
[[OpenReadingListIntent alloc] init];
openReadingListIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_READING_LIST_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:openReadingListIntent
response:nil];
return interaction;
}
case IntentType::kOpenBookmarks: {
OpenBookmarksIntent* openBookmarksIntent =
[[OpenBookmarksIntent alloc] init];
openBookmarksIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_BOOKMARKS_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:openBookmarksIntent
response:nil];
return interaction;
}
case IntentType::kOpenRecentTabs: {
OpenRecentTabsIntent* openRecentTabsIntent =
[[OpenRecentTabsIntent alloc] init];
openRecentTabsIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_RECENT_TABS_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:openRecentTabsIntent
response:nil];
return interaction;
}
case IntentType::kOpenTabGrid: {
OpenTabGridIntent* openTabGridIntent = [[OpenTabGridIntent alloc] init];
openTabGridIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_TAB_GRID_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:openTabGridIntent response:nil];
return interaction;
}
case IntentType::kOpenVoiceSearch: {
SearchWithVoiceIntent* searchWithVoiceIntent =
[[SearchWithVoiceIntent alloc] init];
searchWithVoiceIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_SEARCH_WITH_VOICE_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:searchWithVoiceIntent
response:nil];
return interaction;
}
case IntentType::kOpenNewTab: {
OpenNewTabIntent* openNewTabIntent = [[OpenNewTabIntent alloc] init];
openNewTabIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_NEW_TAB_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:openNewTabIntent response:nil];
return interaction;
}
case IntentType::kPlayDinoGame: {
PlayDinoGameIntent* playDinoGameIntent =
[[PlayDinoGameIntent alloc] init];
playDinoGameIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_PLAY_DINO_GAME_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:playDinoGameIntent
response:nil];
return interaction;
}
case IntentType::kSetDefaultBrowser: {
SetChromeDefaultBrowserIntent* setChromeDefaultBrowserIntent =
[[SetChromeDefaultBrowserIntent alloc] init];
setChromeDefaultBrowserIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(
IDS_IOS_INTENTS_SET_CHROME_DEFAULT_BROWSER_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:setChromeDefaultBrowserIntent
response:nil];
return interaction;
}
case IntentType::kViewHistory: {
ViewHistoryIntent* viewHistoryIntent = [[ViewHistoryIntent alloc] init];
viewHistoryIntent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_VIEW_CHROME_HISTORY_TITLE);
INInteraction* interaction =
[[INInteraction alloc] initWithIntent:viewHistoryIntent response:nil];
return interaction;
}
case IntentType::kOpenLatestTab: {
OpenLatestTabIntent* intent = [[OpenLatestTabIntent alloc] init];
intent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_LATEST_TAB_TITLE);
INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
response:nil];
return interaction;
}
case IntentType::kStartLens: {
OpenLensIntent* intent = [[OpenLensIntent alloc] init];
intent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_OPEN_LENS_TITLE);
INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
response:nil];
return interaction;
}
case IntentType::kClearBrowsingData: {
ClearBrowsingDataIntent* intent = [[ClearBrowsingDataIntent alloc] init];
intent.suggestedInvocationPhrase =
l10n_util::GetNSString(IDS_IOS_INTENTS_CLEAR_BROWSING_DATA_TITLE);
INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
response:nil];
return interaction;
}
default: {
NOTREACHED_IN_MIGRATION();
return nil;
}
}
}
@end