#ifndef COMPONENTS_COMPOSE_CORE_BROWSER_COMPOSE_METRICS_H_
#define COMPONENTS_COMPOSE_CORE_BROWSER_COMPOSE_METRICS_H_
#include "base/time/time.h"
#include "components/compose/core/browser/compose_enums.mojom.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
namespace base {
class TimeDelta;
}
namespace compose {
extern const char kComposeDialogOpenLatency[];
extern const char kComposeDialogSelectionLength[];
extern const char kComposeRequestReason[];
extern const char kComposeRequestDurationOkSuffix[];
extern const char kComposeRequestDurationErrorSuffix[];
extern const char kComposeRequestStatus[];
extern const char kComposeSessionComposeCount[];
extern const char kComposeSessionCloseReason[];
extern const char kComposeSessionDialogShownCount[];
extern const char kComposeSessionEventCounts[];
extern const char kComposeSessionDuration[];
extern const char kComposeSessionOverOneDay[];
extern const char kComposeSessionUndoCount[];
extern const char kComposeSessionUpdateInputCount[];
extern const char kComposeShowStatus[];
extern const char kComposeFirstRunSessionCloseReason[];
extern const char kComposeFirstRunSessionDialogShownCount[];
extern const char kComposeMSBBSessionCloseReason[];
extern const char kComposeMSBBSessionDialogShownCount[];
extern const char kInnerTextNodeOffsetFound[];
extern const char kComposeContextMenuCtr[];
extern const char kComposeProactiveNudgeCtr[];
extern const char kComposeSelectionNudgeCtr[];
extern const char kComposeProactiveNudgeShowStatus[];
extern const char kOpenComposeDialogResult[];
extern const char kComposeStartSessionEntryPoint[];
extern const char kComposeResumeSessionEntryPoint[];
enum class ComposeContextMenuCtrEvent {
kMenuItemDisplayed = 0,
kMenuItemClicked = 1,
kMaxValue = kMenuItemClicked,
};
enum class ComposeRequestReason {
kFirstRequest = 0,
kRetryRequest = 1,
kUpdateRequest = 2,
kLengthShortenRequest = 3,
kLengthElaborateRequest = 4,
kToneCasualRequest = 5,
kToneFormalRequest = 6,
kFirstRequestPolishMode = 7,
kFirstRequestElaborateMode = 8,
kFirstRequestFormalizeMode = 9,
kMaxValue = kFirstRequestFormalizeMode,
};
enum class ComposeFreOrMsbbSessionCloseReason {
kAbandoned = 0,
kCloseButtonPressed = 1,
kAckedOrAcceptedWithoutInsert = 2,
kAckedOrAcceptedWithInsert = 3,
kReplacedWithNewSession = 4,
kExceededMaxDuration = 5,
kMaxValue = kExceededMaxDuration,
};
enum class ComposeSessionCloseReason {
kInsertedResponse = 0,
kCloseButtonPressed = 1,
kAbandoned = 2,
kReplacedWithNewSession = 3,
kCanceledBeforeResponseReceived =
4,
kExceededMaxDuration = 5,
kEndedAtFre = 6,
kAckedFreEndedAtMsbb = 7,
kEndedAtMsbb = 8,
kMaxValue = kEndedAtMsbb,
};
enum class ComposeSessionEventTypes {
kMainDialogShown = 0,
kFREShown = 1,
kFREAccepted = 2,
kMSBBShown = 3,
kMSBBSettingsOpened = 4,
kMSBBEnabled = 5,
kStartedWithSelection = 6,
kCreateClicked = 7,
kUpdateClicked = 8,
kRetryClicked = 9,
kUndoClicked = 10,
kShortenClicked = 11,
kElaborateClicked = 12,
kCasualClicked = 13,
kFormalClicked = 14,
kThumbsDown = 15,
kThumbsUp = 16,
kInsertClicked = 17,
kCloseClicked = 18,
kEditClicked = 19,
kCancelEditClicked = 20,
kAnyModifierUsed = 21,
kRedoClicked = 22,
kResultEdited = 23,
kEditedResultInserted = 24,
kSuccessfulRequest = 25,
kFailedRequest = 26,
kComposeDialogOpened = 27,
kMaxValue = kComposeDialogOpened,
};
enum class ComposeShowStatus {
kShouldShow = 0,
kGenericBlocked = 1,
kIncompatibleFieldType = 2,
kSignedOut = 4,
kUnsupportedLanguage = 5,
kFormFieldInCrossOriginFrame = 6,
kPerUrlChecksFailed = 7,
kUserNotAllowedByOptimizationGuide = 8,
kNotComposeEligible = 9,
kIncorrectScheme = 10,
kFormFieldNestedInFencedFrame = 11,
kComposeFeatureFlagDisabled = 12,
kDisabledOnChromeOS = 13,
kAutocompleteOff = 14,
kWritingSuggestionsFalse = 15,
kProactiveNudgeFeatureDisabled = 16,
kProactiveNudgeDisabledGloballyByUserPreference = 17,
kProactiveNudgeDisabledForSiteByUserPreference = 18,
kProactiveNudgeDisabledByServerConfig = 19,
kProactiveNudgeUnknownServerConfig = 20,
kProactiveNudgeDisabledByMSBB = 22,
kProactiveNudgeBlockedBySegmentationPlatform = 23,
kComposeNotEnabledInCountry = 24,
kUndefinedCountry = 25,
kMaxValue = kUndefinedCountry,
};
enum class ComposeNudgeCtrEvent {
kNudgeDisplayed = 0,
kDialogOpened = 1,
kUserDisabledProactiveNudge = 2,
kUserDisabledSite = 3,
kOpenSettings = 4,
kMaxValue = kOpenSettings,
};
enum class ComposeEntryPoint {
kContextMenu = 0,
kProactiveNudge = 1,
kSelectionNudge = 2,
kSavedStateNudge = 3,
kSavedStateNotification = 4,
kMaxValue = kSavedStateNotification,
};
enum class EvalLocation : int {
kServer,
kOnDevice,
};
enum class SessionEvalLocation {
kNone = 0,
kServer = 1,
kOnDevice = 2,
kMixed = 3,
kMaxValue = kMixed,
};
enum class ComposeRequestFeedback {
kNoFeedback = 0,
kPositiveFeedback = 1,
kNegativeFeedback = 2,
kRequestError = 3,
kMaxValue = kRequestError,
};
enum class ProactiveNudgeDerivedEngagement {
kIgnored,
kNudgeDisabledOnSingleSite,
kNudgeDisabledOnAllSites,
kOpenedComposeMinimalUse,
kGeneratedComposeSuggestion,
kAcceptedComposeSuggestion,
kMaxValue = kAcceptedComposeSuggestion,
};
struct ComposeSessionEvents {
ComposeSessionEvents();
ComposeSessionEvents(ComposeSessionEvents& e) = delete;
ComposeSessionEvents& operator=(ComposeSessionEvents& e) = delete;
~ComposeSessionEvents() = default;
unsigned int compose_dialog_open_count = 0;
unsigned int compose_prompt_view_count = 0;
unsigned int compose_requests_count = 0;
unsigned int successful_requests_count = 0;
unsigned int failed_requests_count = 0;
unsigned int fre_view_count = 0;
unsigned int msbb_view_count = 0;
unsigned int undo_count = 0;
unsigned int redo_count = 0;
unsigned int result_edit_count = 0;
unsigned int update_input_count = 0;
unsigned int regenerate_count = 0;
unsigned int shorten_count = 0;
unsigned int lengthen_count = 0;
unsigned int formal_count = 0;
unsigned int casual_count = 0;
bool fre_completed_in_session = false;
bool msbb_settings_opened = false;
bool msbb_enabled_in_session = false;
bool started_with_proactive_nudge = false;
bool has_initial_text = false;
bool has_thumbs_up = false;
bool has_thumbs_down = false;
bool inserted_results = false;
bool edited_result_inserted = false;
bool close_clicked = false;
bool did_click_edit = false;
bool did_click_cancel_on_edit = false;
unsigned int on_device_responses = 0;
unsigned int server_responses = 0;
bool session_contained_filtered_response = false;
bool session_contained_any_error = false;
};
enum class OpenComposeDialogResult {
kSuccess = 0,
kNoChromeComposeClient = 1,
kNoRenderFrameHost = 2,
kNoContentAutofillDriver = 3,
kAutofillFormDataNotFound = 4,
kAutofillFormFieldDataNotFound = 5,
kNoWebContents = 6,
kFailedCreatingComposeDialogView = 7,
kAutofillFormDataNotFoundAfterSelectAll = 8,
kMaxValue = kAutofillFormDataNotFoundAfterSelectAll
};
enum class ComposeInnerTextNodeOffset {
kNoOffsetFound = 0,
kOffsetFound = 1,
kMaxValue = kOffsetFound
};
enum class ComposeSelectAllStatus {
kNoSelectAll = 0,
kSelectedAll = 1,
kMaxValue = kSelectedAll
};
class PageUkmTracker {
public:
PageUkmTracker(ukm::SourceId source_id);
~PageUkmTracker();
void MenuItemShown();
void MenuItemClicked();
void ComposeTextInserted();
void ComposeProactiveNudgeShouldShow();
void ProactiveNudgeShown();
void ProactiveNudgeOpened();
void ProactiveNudgeDisabledGlobally();
void ProactiveNudgeDisabledForSite();
void ShowDialogAbortedDueToMissingFormData();
void ShowDialogAbortedDueToMissingFormFieldData();
void MaybeLogUkm();
private:
bool event_was_recorded_ = false;
unsigned int menu_item_shown_count_ = 0;
unsigned int menu_item_clicked_count_ = 0;
unsigned int compose_text_inserted_count_ = 0;
unsigned int proactive_nudge_should_show_count_ = 0;
unsigned int proactive_nudge_shown_count_ = 0;
unsigned int proactive_nudge_opened_count_ = 0;
bool proactive_nudge_disabled_globally_ = false;
bool proactive_nudge_disabled_for_site_ = false;
unsigned int missing_form_data_count_ = 0;
unsigned int missing_form_field_data_count_ = 0;
ukm::SourceId source_id;
};
void LogComposeContextMenuCtr(ComposeContextMenuCtrEvent event);
void LogComposeContextMenuShowStatus(ComposeShowStatus status);
void LogComposeProactiveNudgeCtr(ComposeNudgeCtrEvent event);
void LogComposeSelectionNudgeCtr(ComposeNudgeCtrEvent event);
void LogComposeProactiveNudgeShowStatus(ComposeShowStatus status);
void LogOpenComposeDialogResult(OpenComposeDialogResult result);
void LogStartSessionEntryPoint(ComposeEntryPoint entry_point);
void LogResumeSessionEntryPoint(ComposeEntryPoint entry_point);
void LogComposeRequestReason(ComposeRequestReason reason);
void LogComposeRequestReason(EvalLocation eval_location,
ComposeRequestReason reason);
void LogComposeRequestStatus(bool page_language_supported,
compose::mojom::ComposeStatus status);
void LogComposeRequestStatus(EvalLocation eval_location,
bool page_language_supported,
compose::mojom::ComposeStatus status);
void LogComposeRequestDuration(base::TimeDelta duration,
EvalLocation eval_location,
bool is_ok);
void LogComposeSessionCloseReason(ComposeSessionCloseReason reason);
void LogComposeFirstRunSessionCloseReason(
ComposeFreOrMsbbSessionCloseReason reason);
void LogComposeFirstRunSessionDialogShownCount(
ComposeFreOrMsbbSessionCloseReason reason,
int dialog_shown_count);
void LogComposeMSBBSessionCloseReason(
ComposeFreOrMsbbSessionCloseReason reason);
void LogComposeMSBBSessionDialogShownCount(
ComposeFreOrMsbbSessionCloseReason reason,
int dialog_shown_count);
SessionEvalLocation GetSessionEvalLocationFromEvents(
const ComposeSessionEvents& session_events);
std::optional<EvalLocation> GetEvalLocationFromEvents(
const ComposeSessionEvents& session_events);
void LogComposeSessionCloseMetrics(ComposeSessionCloseReason reason,
const ComposeSessionEvents& session_events);
void LogComposeSessionCloseUkmMetrics(
ukm::SourceId source_id,
const ComposeSessionEvents& session_events);
void LogComposeDialogInnerTextShortenedBy(int shortened_by);
void LogComposeDialogInnerTextSize(int size);
void LogComposeDialogInnerTextOffsetFound(bool inner_offset_found);
void LogComposeDialogOpenLatency(base::TimeDelta duration);
void LogComposeDialogSelectionLength(int length);
void LogComposeSessionDuration(
base::TimeDelta session_duration,
std::string session_suffix = "",
std::optional<EvalLocation> eval_location = std::nullopt);
void LogComposeRequestFeedback(EvalLocation eval_location,
ComposeRequestFeedback feedback);
void LogComposeSelectAllStatus(ComposeSelectAllStatus select_all_status);
void LogComposeSessionEventCounts(std::optional<EvalLocation> eval_location,
const ComposeSessionEvents& session_events);
}
#endif