#ifndef CHROME_BROWSER_GLIC_PUBLIC_CONTEXT_GLIC_SHARING_MANAGER_H_
#define CHROME_BROWSER_GLIC_PUBLIC_CONTEXT_GLIC_SHARING_MANAGER_H_
#include <optional>
#include "base/containers/span.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/glic/glic_metrics.h"
#include "chrome/browser/glic/host/context/glic_focused_browser_manager_interface.h"
#include "chrome/browser/glic/host/context/glic_tab_data.h"
#include "components/tabs/public/tab_interface.h"
namespace glic {
struct GlicGetContextError {
GlicGetContextFromTabError error_code;
std::string message;
};
using GlicGetContextResult =
base::expected<mojom::GetContextResultPtr, GlicGetContextError>;
enum class GlicPinTrigger {
kUnknown,
kInstanceCreation,
kDaisyChain,
kNewTabDaisyChain,
kConversationChange,
kRestore,
kContextMenu,
kCandidatesToggle,
kAtMention,
kActuation,
kWebClientUnknown
};
enum class GlicUnpinTrigger {
kUnknown,
kInstanceDestruction,
kConversationChangeBeforeContextShared,
kContextMenu,
kTabClose,
kTabNavigationWhileInstanceFrozen,
kCandidatesToggle,
kChip,
kActuation,
kWebClientUnknown
};
struct GlicPinEvent {
GlicPinEvent(GlicPinTrigger trigger, base::TimeTicks timestamp);
~GlicPinEvent();
GlicPinTrigger trigger = GlicPinTrigger::kUnknown;
base::TimeTicks timestamp;
};
struct GlicContextSharingStats {
int times_requested = 0;
int times_returned = 0;
base::TimeTicks last_requested_timestamp;
base::TimeTicks last_returned_timestamp;
};
struct GlicPinnedTabUsage {
explicit GlicPinnedTabUsage(GlicPinEvent pin_event);
GlicPinnedTabUsage(GlicPinTrigger trigger, base::TimeTicks timestamp);
GlicPinnedTabUsage(GlicPinnedTabUsage&& other);
GlicPinnedTabUsage(const GlicPinnedTabUsage&);
GlicPinnedTabUsage& operator=(GlicPinnedTabUsage&& other);
GlicPinnedTabUsage& operator=(const GlicPinnedTabUsage&);
~GlicPinnedTabUsage();
GlicPinEvent pin_event;
int times_conversation_turn_submitted_while_pinned = 0;
int times_navigated_across_origin_while_pinned = 0;
GlicContextSharingStats overall_stats;
GlicContextSharingStats apc_stats;
GlicContextSharingStats inner_text_stats;
GlicContextSharingStats screenshot_stats;
GlicContextSharingStats pdf_stats;
};
struct GlicUnpinEvent {
GlicUnpinEvent(GlicUnpinTrigger trigger,
GlicPinnedTabUsage usage,
base::TimeTicks timestamp);
~GlicUnpinEvent();
GlicUnpinTrigger trigger = GlicUnpinTrigger::kUnknown;
GlicPinnedTabUsage usage;
base::TimeTicks timestamp;
};
using GlicPinningStatusEvent = std::variant<GlicPinEvent, GlicUnpinEvent>;
class GlicSharingManager {
public:
GlicSharingManager() = default;
virtual ~GlicSharingManager() = default;
GlicSharingManager(const GlicSharingManager&) = delete;
GlicSharingManager& operator=(const GlicSharingManager&) = delete;
using FocusedTabChangedCallback =
base::RepeatingCallback<void(const FocusedTabData&)>;
virtual base::CallbackListSubscription AddFocusedTabChangedCallback(
FocusedTabChangedCallback callback) = 0;
using FocusedTabDataChangedCallback =
base::RepeatingCallback<void(const mojom::TabData*)>;
virtual base::CallbackListSubscription AddFocusedTabDataChangedCallback(
FocusedTabDataChangedCallback callback) = 0;
virtual FocusedTabData GetFocusedTabData() = 0;
using FocusedBrowserChangedCallback =
base::RepeatingCallback<void(BrowserWindowInterface*)>;
virtual base::CallbackListSubscription AddFocusedBrowserChangedCallback(
FocusedBrowserChangedCallback callback) = 0;
virtual BrowserWindowInterface* GetFocusedBrowser() const = 0;
virtual GlicFocusedBrowserManagerInterface& focused_browser_manager() = 0;
using TabPinningStatusChangedCallback =
base::RepeatingCallback<void(tabs::TabInterface*, bool)>;
virtual base::CallbackListSubscription AddTabPinningStatusChangedCallback(
TabPinningStatusChangedCallback callback) = 0;
using TabPinningStatusEventCallback =
base::RepeatingCallback<void(tabs::TabInterface*,
GlicPinningStatusEvent)>;
virtual base::CallbackListSubscription AddTabPinningStatusEventCallback(
TabPinningStatusEventCallback callback) = 0;
using PinnedTabsChangedCallback =
base::RepeatingCallback<void(const std::vector<content::WebContents*>&)>;
virtual base::CallbackListSubscription AddPinnedTabsChangedCallback(
PinnedTabsChangedCallback callback) = 0;
using PinnedTabDataChangedCallback =
base::RepeatingCallback<void(const TabDataChange&)>;
virtual base::CallbackListSubscription AddPinnedTabDataChangedCallback(
PinnedTabDataChangedCallback callback) = 0;
virtual bool PinTabs(base::span<const tabs::TabHandle> tab_handles,
GlicPinTrigger trigger) = 0;
bool PinTabs(base::span<const tabs::TabHandle> tab_handles);
virtual bool UnpinTabs(base::span<const tabs::TabHandle> tab_handles,
GlicUnpinTrigger trigger) = 0;
bool UnpinTabs(base::span<const tabs::TabHandle> tab_handles);
virtual void UnpinAllTabs(GlicUnpinTrigger trigger) = 0;
void UnpinAllTabs();
virtual int32_t GetMaxPinnedTabs() const = 0;
virtual int32_t GetNumPinnedTabs() const = 0;
virtual int32_t SetMaxPinnedTabs(uint32_t max_pinned_tabs) = 0;
virtual std::vector<content::WebContents*> GetPinnedTabs() const = 0;
virtual bool IsTabPinned(tabs::TabHandle tab_handle) const = 0;
virtual std::optional<GlicPinnedTabUsage> GetPinnedTabUsage(
tabs::TabHandle tab_handle) = 0;
virtual void GetContextFromTab(
tabs::TabHandle tab_handle,
const mojom::GetTabContextOptions& options,
base::OnceCallback<void(GlicGetContextResult)> callback) = 0;
virtual void GetContextForActorFromTab(
tabs::TabHandle tab_handle,
const mojom::GetTabContextOptions& options,
base::OnceCallback<void(GlicGetContextResult)> callback) = 0;
virtual void SubscribeToPinCandidates(
mojom::GetPinCandidatesOptionsPtr options,
mojo::PendingRemote<mojom::PinCandidatesObserver> observer) = 0;
virtual void OnConversationTurnSubmitted() = 0;
virtual base::WeakPtr<GlicSharingManager> GetWeakPtr() = 0;
};
}
#endif