#ifndef CHROME_BROWSER_CONTEXTUAL_TASKS_ACTIVE_TASK_CONTEXT_PROVIDER_IMPL_H_
#define CHROME_BROWSER_CONTEXTUAL_TASKS_ACTIVE_TASK_CONTEXT_PROVIDER_IMPL_H_
#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "base/unguessable_token.h"
#include "base/uuid.h"
#include "chrome/browser/contextual_tasks/active_task_context_provider.h"
#include "components/contextual_tasks/public/contextual_tasks_service.h"
#include "components/tabs/public/tab_interface.h"
#include "content/public/browser/web_contents_observer.h"
class BrowserWindowInterface;
namespace contextual_tasks {
class ContextualTask;
struct ContextualTaskContext;
class ActiveTaskContextProviderImpl : public ActiveTaskContextProvider,
public ContextualTasksService::Observer,
public content::WebContentsObserver {
public:
explicit ActiveTaskContextProviderImpl(
BrowserWindowInterface* browser_window,
ContextualTasksService* contextual_tasks_service);
~ActiveTaskContextProviderImpl() override;
ActiveTaskContextProviderImpl(const ActiveTaskContextProviderImpl&) = delete;
ActiveTaskContextProviderImpl& operator=(
const ActiveTaskContextProviderImpl&) = delete;
void OnSidePanelStateUpdated() override;
void SetSessionHandleGetter(
SessionHandleGetter session_handle_getter) override;
void AddObserver(ActiveTaskContextProvider::Observer* observer) override;
void RemoveObserver(ActiveTaskContextProvider::Observer* observer) override;
void OnTaskAdded(const ContextualTask& task,
ContextualTasksService::TriggerSource source) override;
void OnTaskUpdated(const ContextualTask& task,
ContextualTasksService::TriggerSource source) override;
void OnTaskRemoved(const base::Uuid& task_id,
ContextualTasksService::TriggerSource source) override;
void OnTaskAssociatedToTab(const base::Uuid& task_id,
SessionID tab_id) override;
void OnTaskDisassociatedFromTab(const base::Uuid& task_id,
SessionID tab_id) override;
void PrimaryPageChanged(content::Page& page) override;
private:
void RefreshContext();
void OnGetContextForTask(int callback_id,
std::unique_ptr<ContextualTaskContext> context);
void ResetStateAndNotifyObservers();
void OnActiveTabChanged(BrowserWindowInterface* browser_window_interface);
raw_ptr<BrowserWindowInterface> browser_window_;
raw_ptr<ContextualTasksService> contextual_tasks_service_;
std::optional<SessionHandleGetter> session_handle_getter_;
std::optional<base::Uuid> active_task_id_;
int callback_id_ = 0;
base::ObserverList<ActiveTaskContextProvider::Observer> observers_;
base::ScopedObservation<ContextualTasksService,
ContextualTasksService::Observer>
contextual_tasks_service_observation_{this};
base::CallbackListSubscription active_tab_change_subscription_;
base::WeakPtrFactory<ActiveTaskContextProviderImpl> weak_ptr_factory_{this};
};
}
#endif