blob: 93418bc0b4aac66b00b8d16ce40e84be4e029f83 [file] [log] [blame]
// 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.
#ifndef ASH_USER_EDUCATION_USER_EDUCATION_DELEGATE_H_
#define ASH_USER_EDUCATION_USER_EDUCATION_DELEGATE_H_
#include <memory>
#include <optional>
#include <string>
#include "ash/ash_export.h"
#include "base/functional/callback_forward.h"
class AccountId;
namespace ui {
class ElementContext;
class ElementIdentifier;
} // namespace ui
namespace user_education {
class HelpBubble;
struct HelpBubbleParams;
struct TutorialDescription;
} // namespace user_education
namespace ash {
enum class HelpBubbleId;
enum class SystemWebAppType;
enum class TutorialId;
// The delegate of the `UserEducationController` which facilitates communication
// between Ash and user education services in the browser.
class ASH_EXPORT UserEducationDelegate {
public:
virtual ~UserEducationDelegate() = default;
// Attempts to create a help bubble, identified by `help_bubble_id`, with the
// specified `help_bubble_params` for the tracked element associated with the
// specified `element_id` in the specified `element_context`. A help bubble
// may not be created under certain circumstances, e.g. if there is an ongoing
// tutorial running.
// NOTE: Currently only the primary user profile is supported.
virtual std::unique_ptr<user_education::HelpBubble> CreateHelpBubble(
const AccountId& account_id,
HelpBubbleId help_bubble_id,
user_education::HelpBubbleParams help_bubble_params,
ui::ElementIdentifier element_id,
ui::ElementContext element_context) = 0;
// Returns the identifier for an element associated with the specified
// `app_id`, or an absent value if no such identifier exists. Note that
// existence of an identifier does not imply the existence of an associated
// element.
virtual std::optional<ui::ElementIdentifier> GetElementIdentifierForAppId(
const std::string& app_id) const = 0;
// If present, indicates whether the user associated with the given
// `account_id` is considered new. A user is considered new if the first app
// list sync in the session was the first sync ever across all ChromeOS
// devices and sessions for the given user. As such, this value is absent
// until the first app list sync of the session is completed.
// NOTE: Currently only the primary user profile is supported.
virtual const std::optional<bool>& IsNewUser(
const AccountId& account_id) const = 0;
// Returns whether the tutorial specified by `tutorial_id` is registered for
// the user associated with the given `account_id`.
// NOTE: Currently only the primary user profile is supported.
virtual bool IsTutorialRegistered(const AccountId& account_id,
TutorialId tutorial_id) const = 0;
// Registers the tutorial defined by the specified `tutorial_id` and
// `tutorial_description` for the user associated with the given `account_id`.
// NOTE: Currently only the primary user profile is supported.
virtual void RegisterTutorial(
const AccountId& account_id,
TutorialId tutorial_id,
user_education::TutorialDescription tutorial_description) = 0;
// Starts the tutorial previously registered with the specified `tutorial_id`
// for the user associated with the given `account_id`. Any running tutorial
// is cancelled. One of either `completed_callback` or `aborted_callback` will
// be run on tutorial finish.
// NOTE: Currently only the primary user profile is supported.
virtual void StartTutorial(const AccountId& account_id,
TutorialId tutorial_id,
ui::ElementContext element_context,
base::OnceClosure completed_callback,
base::OnceClosure aborted_callback) = 0;
// Aborts the currently running tutorial. If `tutorial_id` is given, will only
// abort the tutorial if it matches the id. If no `tutorial_id` is given, it
// aborts any running tutorial whether it was started by this controller or
// not. Any `aborted_callback` passed in at the time of start will be called.
// NOTE: Currently only the primary user profile is supported.
virtual void AbortTutorial(
const AccountId& account_id,
std::optional<TutorialId> tutorial_id = std::nullopt) = 0;
// Attempts to launch the system web app associated with the given type on
// the display associated with the given ID asynchronously.
// NOTE: Currently only the primary user profile is supported.
virtual void LaunchSystemWebAppAsync(const AccountId& account_id,
SystemWebAppType system_web_app_type,
int64_t display_id) = 0;
// Returns true if there is a currently running tutorial for the user
// associated with `account_id`. If `tutorial_id` is specified, specifically
// returns whether *that* tutorial is running.
virtual bool IsRunningTutorial(
const AccountId& account_id,
std::optional<TutorialId> tutorial_id = std::nullopt) const = 0;
};
} // namespace ash
#endif // ASH_USER_EDUCATION_USER_EDUCATION_DELEGATE_H_