blob: 94a7373c5f55f77bb78db5f9bb6b952e7d57572b [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_LENS_LENS_SESSION_METRICS_LOGGER_H_
#define CHROME_BROWSER_UI_LENS_LENS_SESSION_METRICS_LOGGER_H_
#include <optional>
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "components/lens/lens_overlay_dismissal_source.h"
#include "components/lens/lens_overlay_invocation_source.h"
#include "components/lens/lens_overlay_metrics.h"
#include "components/lens/lens_overlay_mime_type.h"
namespace content {
class WebContents;
}
namespace lens {
struct ContextualSearchboxSessionEndMetrics;
// This class is responsible for tracking session-specific metrics for the Lens
// overlay and logging them at appropriate times, primarily at the end of a
// session.
class LensSessionMetricsLogger {
public:
LensSessionMetricsLogger();
~LensSessionMetricsLogger();
LensSessionMetricsLogger(const LensSessionMetricsLogger&) = delete;
LensSessionMetricsLogger& operator=(const LensSessionMetricsLogger&) = delete;
// Call when a new Lens overlay session starts.
void OnSessionStart(LensOverlayInvocationSource invocation_source,
content::WebContents* tab_web_contents);
// Call to update navigation metrics.
void OnPageNavigation();
// Call when a search is performed within this session.
void OnSearchPerformed();
// Stores the type of the page content extracted from the page on invocation.
void OnInitialPageContentRetrieved(lens::MimeType page_content_type);
// Stores the type of the page content extracted from the page on follow up
// page content retrieval.
void OnFollowUpPageContentRetrieved(lens::MimeType page_content_type);
// Called when the contextual searchbox is shown.
void OnContextualSearchboxShown();
// Called when a contextual searchbox query is issued.
// `is_zero_prefix_suggestion` is true if the query was issued from a user
// selecting a zero prefix suggestion. `is_initial_query` is true if the query
// was issued from the initial state of the lens overlay, aka not from the
// side panel.
void OnContextualSearchboxQueryIssued(bool is_zero_prefix_suggestion,
bool is_initial_query);
// Called when the searchbox is focused. Used to log metrics relating to focus
// events of the CSB.
void OnSearchboxFocused();
// Called when the zero prefix suggestions are shown to the user.
void OnZeroSuggestShown(bool is_initial_query);
// Called when the AIM composebox is shown in the side panel.
void OnAimComposeboxShown();
// Called when the AIM handshake is received.
void OnAimHandshakeCompleted();
// Called when the AIM composebox is focused.
void OnAimComposeboxFocused();
// Called when a query is issued in the AIM searchbox.
void OnAimQueryIssued();
// Called when a query is submitted in the AIM searchbox.
void OnAimQuerySubmitted();
// Records Lens invocation.
void RecordInvocation();
// Records UMA and UKM metrics for time to first interaction. Not recorded
// when invocation source is an image's content area menu because in this
// case the time to first interaction is essentially zero.
void RecordTimeToFirstInteraction(
lens::LensOverlayFirstInteractionType interaction_type);
// Records UMA and UKM metrics for dismissal and end of session metrics.
// This includes dismissal source, session length, and whether a search was
// recorded in the session.
void RecordEndOfSessionMetrics(
lens::LensOverlayDismissalSource dismissal_source);
// Records the UMA for the first time the contextual searchbox is focused
// after the page has been navigated.
void RecordContextualSearchboxTimeToFocusAfterNavigation();
// Records the UMA for the first time the user interacts with the contextual
// searchbox after the page has been navigated.
void RecordContextualSearchboxTimeToInteractionAfterNavigation();
// Returns the time at which the overlay was invoked.
void GetInvocationTime();
// Returns the invocation source for the lens session.
lens::LensOverlayInvocationSource GetInvocationSource();
private:
// Invocation source for the lens overlay.
lens::LensOverlayInvocationSource invocation_source_ =
lens::LensOverlayInvocationSource::kAppMenu;
// The time at which the overlay was invoked. Used to compute timing metrics.
// Assumed to be when OnSessionStart is called.
base::TimeTicks invocation_time_;
// The time at which the live page navigated while in the contextual searchbox
// flow. Used to compute timing metrics. Is empty if the user is not in the
// contextual searchbox flow, or this navigation has already been recorded.
std::optional<base::TimeTicks> last_navigation_time_;
// Whether the contextual searchbox has been focused since the last page
// navigation.
bool contextual_searchbox_focused_after_navigation_ = false;
// Indicates whether a search has been performed in the current session. Used
// to record success/abandonment rate, as defined by whether or not a search
// was performed.
bool search_performed_in_session_ = false;
// The UKM source id of the tab Lens was invoked on.
ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId;
// The type of the page content extracted from the page when the lens overlay
// was initialized. This is used when recording contextual searchbox metrics
// at the end of sessions, since the initialization data can change on page
// contextualization updates and these metrics only want to record the initial
// invocation page content type.
lens::MimeType initial_page_content_type_ = lens::MimeType::kUnknown;
// The type of the document that the lens overlay was initialized on as
// determined by the mime type reported by the tab web contents. This differs
// from initial_page_content_type_ in that the document type is the type of
// the top level document, while the intial_page_content_type_ is the type of
// the content extracted from the page that we are contextualizing to. This is
// used when recording invocation document metrics, since the document type
// can change on page contextualization updates.
lens::MimeType initial_document_type_ = lens::MimeType::kUnknown;
// The type of the page content extracted from the page currently. Is kept up
// to date as the page content changes.
lens::MimeType current_page_content_type_ = lens::MimeType::kUnknown;
// Metrics for the contextual searchbox that will be recorded at the end of a
// session.
ContextualSearchboxSessionEndMetrics csb_session_end_metrics_;
// Metrics for the AIM searchbox that will be recorded at the end of a
// session.
AimSessionEndMetrics aim_session_end_metrics_;
// Must be the last member.
base::WeakPtrFactory<LensSessionMetricsLogger> weak_factory_{this};
};
} // namespace lens
#endif // CHROME_BROWSER_UI_LENS_LENS_SESSION_METRICS_LOGGER_H_