chromium/ios/chrome/common/app_group/app_group_constants.h

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_COMMON_APP_GROUP_APP_GROUP_CONSTANTS_H_
#define IOS_CHROME_COMMON_APP_GROUP_APP_GROUP_CONSTANTS_H_

#import <Foundation/Foundation.h>

// Constants that are shared between apps belonging to the chrome iOS app group.
// They are mainly used for communication between applications in the group.
namespace app_group {

// An enum of the different application member of the Chrome app group.
// To ensure continuity in metrics log, applications can only be added at the
// end.
// Applications directly sending metrics must be added to this enum.
enum AppGroupApplications {
  APP_GROUP_CHROME = 0,
  APP_GROUP_TODAY_EXTENSION,
};

// The different types of outcome used for UMA and created by the open
// extension.
// The entries should not be removed or reordered.
// Also add the name of the enum and histogram.
enum class OpenExtensionOutcome : NSInteger {
  kSuccess = 0,
  kInvalid = 1,
  kFailureInvalidURL = 2,
  kFailureURLNotFound = 3,
  kFailureOpenInNotFound = 4,
  kFailureUnsupportedScheme = 5,
  kMaxValue = kFailureUnsupportedScheme,
};

// The different types of item that can be created by the share extension.
enum ShareExtensionItemType {
  READING_LIST_ITEM = 0,
  BOOKMARK_ITEM,
  OPEN_IN_CHROME_ITEM
};

// The key of a preference containing a dictionary of capabilities supported by
// the current version of Chrome.
extern NSString* const kChromeCapabilitiesPreference;

// ---- Chrome capabilities -----
// Show default browser promo capability.
extern NSString* const kChromeShowDefaultBrowserPromoCapability;

// The x-callback-url indicating that an application in the group requires a
// command.
extern const char kChromeAppGroupXCallbackCommand[];

// The key of a preference containing a dictionary of field trial values needed
// in extensions.
extern NSString* const kChromeExtensionFieldTrialPreference;

// The key of a preference containing a dictionary containing app group command
// parameters.
extern const char kChromeAppGroupCommandPreference[];

// The key in kChromeAppGroupCommandPreference containing the ID of the
// application requesting a x-callback-url command.
extern const char kChromeAppGroupCommandAppPreference[];

// The key in kChromeAppGroupCommandPreference containing the command requested
// by `kChromeAppGroupCommandAppPreference`.
extern const char kChromeAppGroupCommandCommandPreference[];

// The command to open a URL. Parameter must contain the URL.
extern const char kChromeAppGroupOpenURLCommand[];

// The command to search some text. Parameter must contain the text.
extern const char kChromeAppGroupSearchTextCommand[];

// The command to search an image. Data parameter must contain the image.
extern const char kChromeAppGroupSearchImageCommand[];

// The command to trigger a voice search.
extern const char kChromeAppGroupVoiceSearchCommand[];

// The command to open a new tab.
extern const char kChromeAppGroupNewTabCommand[];

// The command to focus the omnibox.
extern const char kChromeAppGroupFocusOmniboxCommand[];

// The command to open an incognito search.
extern const char kChromeAppGroupIncognitoSearchCommand[];

// The command to open the QR Code scanner.
extern const char kChromeAppGroupQRScannerCommand[];

// The command to open Lens.
extern const char kChromeAppGroupLensCommand[];

// The command to open the Password Manager's search page.
extern const char kChromeAppGroupSearchPasswordsCommand[];

// The key in kChromeAppGroupCommandPreference containing a NSDate at which
// `kChromeAppGroupCommandAppPreference` issued the command.
extern const char kChromeAppGroupCommandTimePreference[];

// The key in kChromeAppGroupCommandPreference containing the text use for the
// command if it requires one. This could be a URL, a string, etc.
extern const char kChromeAppGroupCommandTextPreference[];

// The key in kChromeAppGroupCommandPreference containing the data to use for
// the command if it requires one. This could be an image, etc.
extern const char kChromeAppGroupCommandDataPreference[];

// The key in kChromeAppGroupCommandPreference containing the index to open for
// if the command requires one.
extern const char kChromeAppGroupCommandIndexPreference[];

// The key of a preference containing whether the current default search engine
// supports Search by Image.
extern const char kChromeAppGroupSupportsSearchByImage[];

// The key of a preference containing whether Google is the default search
// engine.
extern const char kChromeAppGroupIsGoogleDefaultSearchEngine[];

// The key of a preference containing whether the home screen widget should show
// a shortcut to Lens instead of the QR scanner if Google is the default search
// provider.
extern const char kChromeAppGroupEnableLensInWidget[];

// The key of a preference containing whether the home screen widget should show
// the color Lens and voice icons if Lens is shown.
extern const char kChromeAppGroupEnableColorLensAndVoiceIconsInWidget[];

// The key of a preference containing Chrome client ID reported in the metrics
// client ID. If the user does not opt in, this value must be cleared from the
// shared user defaults.
extern const char kChromeAppClientID[];

// The key of a preference containing the timestamp when the user enabled
// metrics reporting.
extern const char kUserMetricsEnabledDate[];

// The six keys of the items sent by the share extension to Chrome (source, URL,
// title, date, cancel, type).
extern NSString* const kShareItemSource;
extern NSString* const kShareItemURL;
extern NSString* const kShareItemTitle;
extern NSString* const kShareItemDate;
extern NSString* const kShareItemCancel;
extern NSString* const kShareItemType;

// The value used by Chrome Share extension in `kShareItemSource`.
extern NSString* const kShareItemSourceShareExtension;

// The values used by Chrome extensions in
// `kChromeAppGroupCommandAppPreference`.
extern NSString* const kOpenCommandSourceTodayExtension;
extern NSString* const kOpenCommandSourceContentExtension;
extern NSString* const kOpenCommandSourceSearchExtension;
extern NSString* const kOpenCommandSourceShareExtension;
extern NSString* const kOpenCommandSourceCredentialsExtension;
extern NSString* const kOpenCommandSourceOpenExtension;

// The value of the key for the sharedDefaults used by the Content Widget.
extern NSString* const kSuggestedItems;

// The value of the key for the sharedDefaults last modification date used by
// the Shortcuts Widget.
extern NSString* const kSuggestedItemsLastModificationDate;

// The current epoch time, on the first run of chrome on this machine. It is set
// once and must be attached to metrics reports forever thereafter.
extern const char kInstallDate[];

// The brand code string associated with the install. This brand code will be
// added to metrics logs.
extern const char kBrandCode[];

// The five keys of the outcomes by the open extension to Chrome (Success,
// FailureInvalidURL, FailureURLNotFound, FailureOpenInNotFound,
// FailureUnsupportedScheme).
extern NSString* const kOpenExtensionOutcomeSuccess;
extern NSString* const kOpenExtensionOutcomeFailureInvalidURL;
extern NSString* const kOpenExtensionOutcomeFailureURLNotFound;
extern NSString* const kOpenExtensionOutcomeFailureOpenInNotFound;
extern NSString* const kOpenExtensionOutcomeFailureUnsupportedScheme;

// A key in the application group NSUserDefault that contains
// the outcomes of the Open Extension.
extern NSString* const kOpenExtensionOutcomes;

// Conversion helpers between keys and OpenExtensionOutcome.
NSString* KeyForOpenExtensionOutcomeType(OpenExtensionOutcome);
OpenExtensionOutcome OutcomeTypeFromKey(NSString*);

// Gets the application group.
NSString* ApplicationGroup();

// Gets the common application group.
NSString* CommonApplicationGroup();

// Gets the legacy share extension folder URL.
// This folder is deprecated and will be removed soon. Please do not add items
// to it.
// TODO(crbug.com/41303853): Remove this value.
NSURL* LegacyShareExtensionItemsFolder();

// Gets the shared folder URL containing commands from other applications.
NSURL* ExternalCommandsItemsFolder();

// Gets the shared folder URL in which favicons used by the content widget are
// stored.
NSURL* ContentWidgetFaviconsFolder();

// Gets the shared folder URL in which favicon attributes used by the credential
// provider extensions are stored.
NSURL* SharedFaviconAttributesFolder();

// Gets the shared folder URL in which Crashpad reports are stored.
NSURL* CrashpadFolder();

// Returns an autoreleased pointer to the shared user defaults if an
// application group is defined for the application and its extensions.
// If not (i.e. on simulator, or if entitlements do not allow it) returns
// [NSUserDefaults standardUserDefaults].
NSUserDefaults* GetGroupUserDefaults();

// Returns an autoreleased pointer to the shared user defaults if a group is
// defined for the application and other application of the same developer. If
// not (i.e. on simulator, or if entitlements do not allow it) returns
// [NSUserDefaults standardUserDefaults].
NSUserDefaults* GetCommonGroupUserDefaults();

// The application name of `application`.
NSString* ApplicationName(AppGroupApplications application);

}  // namespace app_group

#endif  // IOS_CHROME_COMMON_APP_GROUP_APP_GROUP_CONSTANTS_H_