// Copyright 2024 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_COMPOSE_PROACTIVE_NUDGE_TRACKER_H_ #define CHROME_BROWSER_COMPOSE_PROACTIVE_NUDGE_TRACKER_H_ #include <map> #include <memory> #include <optional> #include <string> #include "base/functional/callback_forward.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/compose/proto/compose_optimization_guide.pb.h" #include "components/autofill/content/browser/scoped_autofill_managers_observation.h" #include "components/autofill/core/browser/ui/suggestion.h" #include "components/autofill/core/common/unique_ids.h" #include "components/compose/core/browser/compose_metrics.h" #include "components/segmentation_platform/public/segmentation_platform_service.h" namespace compose { // This class is a state machine tracking whether the proactive nudge should // show for Compose. It has the following states: // - kInitial, // - kWaitingForTimerToStop, // - kTimerCanceled, // - kWaitingForSegmentation, // - kWaitingForProactiveNudgeRequest, // - kBlockedBySegmentation, // - kShown // // Generally, states transition forward through the list (skipping states if // required). If the active form field changes (or the form loses focus), the // state is reset to `kInitial`. // // The state is represented by a unique pointer to a `State` struct that is // reset whenever a field loses focus. // * If the struct is `null` then the state is `kInitial`. // * The state remains in `kInitial` until any of the three delay times can be // triggered. // * If the struct has a value, the value of `show_state` differentiates between // the remaining states. // * The Delegate is called at the transition from `kWaitingForSegmentation` to // `kWaitingForProactiveNudgeRequest`. // * Unintuitively, `ProactiveNudgeRequestedForFormField` can cause a transition // from kWaitingForProactiveNudgeRequest to `kShown`. Compose interacts with // Autofill such that it cannot directly show the nudge; instead it requests // the Autofill Agent for the current frame to ask for values to fill. Thus, // the entry point is the same both for new nudge states, and for the final // step of actually showing the nudge. Thus, the only way to transition to // `kShown` is to call after the tracker has entered the state // `kWaitingForProactiveNudgeRequest`. class ProactiveNudgeTracker : public autofill::AutofillManager::Observer { … }; } // namespace compose #endif // CHROME_BROWSER_COMPOSE_PROACTIVE_NUDGE_TRACKER_H_