#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_EDITOR_PANEL_MANAGER_H_
#define CHROME_BROWSER_ASH_INPUT_METHOD_EDITOR_PANEL_MANAGER_H_
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chrome/browser/ash/input_method/editor_consent_enums.h"
#include "chrome/browser/ash/input_method/editor_metrics_recorder.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_consent_status.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_context.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_mode.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_text_selection_mode.h"
#include "chromeos/ash/services/orca/public/mojom/orca_service.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace ash::input_method {
using GetEditorPanelContextCallback =
base::OnceCallback<void(const chromeos::editor_menu::EditorContext&)>;
class EditorPanelManager {
public:
virtual ~EditorPanelManager() = default;
virtual void GetEditorPanelContext(
GetEditorPanelContextCallback callback) = 0;
virtual void OnPromoCardDismissed() = 0;
virtual void OnPromoCardDeclined() = 0;
virtual void OnConsentRejected() = 0;
virtual void StartEditingFlow() = 0;
virtual void StartEditingFlowWithPreset(const std::string& text_query_id) = 0;
virtual void StartEditingFlowWithFreeform(const std::string& text) = 0;
virtual void OnEditorMenuVisibilityChanged(bool visible) = 0;
virtual void LogEditorMode(chromeos::editor_menu::EditorMode mode) = 0;
virtual void OnConsentApproved() = 0;
virtual void OnMagicBoostPromoCardDeclined() = 0;
virtual bool ShouldOptInEditor() = 0;
};
class EditorPanelManagerImpl : public EditorPanelManager {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void BindEditorClient(
mojo::PendingReceiver<orca::mojom::EditorClient> pending_receiver) = 0;
virtual void OnPromoCardDeclined() = 0;
virtual void ProcessConsentAction(ConsentAction consent_action) = 0;
virtual void HandleTrigger(
std::optional<std::string_view> preset_query_id,
std::optional<std::string_view> freeform_text) = 0;
virtual chromeos::editor_menu::EditorMode GetEditorMode() const = 0;
virtual chromeos::editor_menu::EditorTextSelectionMode
GetEditorTextSelectionMode() const = 0;
virtual chromeos::editor_menu::EditorConsentStatus GetConsentStatus()
const = 0;
virtual EditorMetricsRecorder* GetMetricsRecorder() = 0;
virtual EditorOpportunityMode GetEditorOpportunityMode() const = 0;
virtual std::vector<EditorBlockedReason> GetBlockedReasons() const = 0;
virtual void CacheContext() = 0;
};
class Observer : public base::CheckedObserver {
public:
virtual void OnEditorModeChanged(
chromeos::editor_menu::EditorMode mode) = 0;
};
explicit EditorPanelManagerImpl(Delegate* delegate);
EditorPanelManagerImpl(const EditorPanelManagerImpl&) = delete;
EditorPanelManagerImpl& operator=(const EditorPanelManagerImpl&) = delete;
~EditorPanelManagerImpl() override;
void GetEditorPanelContext(GetEditorPanelContextCallback callback) override;
void OnPromoCardDismissed() override;
void OnPromoCardDeclined() override;
void OnConsentRejected() override;
void StartEditingFlow() override;
void StartEditingFlowWithPreset(const std::string& text_query_id) override;
void StartEditingFlowWithFreeform(const std::string& text) override;
void OnEditorMenuVisibilityChanged(bool visible) override;
void LogEditorMode(chromeos::editor_menu::EditorMode mode) override;
void BindEditorClient();
bool IsEditorMenuVisible() const;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void NotifyEditorModeChanged(chromeos::editor_menu::EditorMode mode);
void RequestCacheContext();
void OnConsentApproved() override;
void OnMagicBoostPromoCardDeclined() override;
bool ShouldOptInEditor() override;
void SetEditorClientForTesting(
mojo::PendingRemote<orca::mojom::EditorClient> client_for_testing);
private:
void OnGetPresetTextQueriesResult(
GetEditorPanelContextCallback callback,
chromeos::editor_menu::EditorMode panel_mode,
std::vector<orca::mojom::PresetTextQueryPtr> queries);
raw_ptr<Delegate> delegate_;
mojo::Remote<orca::mojom::EditorClient> editor_client_remote_;
bool is_editor_menu_visible_ = false;
base::ObserverList<EditorPanelManagerImpl::Observer> observers_;
base::WeakPtrFactory<EditorPanelManagerImpl> weak_ptr_factory_{this};
};
}
#endif