#ifndef CHROME_BROWSER_UI_COMMERCE_PRICE_TRACKING_PAGE_ACTION_CONTROLLER_H_
#define CHROME_BROWSER_UI_COMMERCE_PRICE_TRACKING_PAGE_ACTION_CONTROLLER_H_
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ui/commerce/commerce_page_action_controller.h"
#include "components/commerce/core/commerce_types.h"
#include "components/commerce/core/subscriptions/subscriptions_observer.h"
#include "components/image_fetcher/core/request_metadata.h"
#include "ui/gfx/image/image.h"
class GURL;
namespace feature_engagement {
class Tracker;
}
namespace image_fetcher {
class ImageFetcher;
}
namespace commerce {
struct CommerceSubscription;
class ShoppingService;
class PriceTrackingPageActionController : public CommercePageActionController,
public SubscriptionsObserver {
public:
PriceTrackingPageActionController(
base::RepeatingCallback<void()> notify_callback,
ShoppingService* shopping_service,
image_fetcher::ImageFetcher* image_fetcher,
feature_engagement::Tracker* tracker);
PriceTrackingPageActionController(const PriceTrackingPageActionController&) =
delete;
PriceTrackingPageActionController& operator=(
const PriceTrackingPageActionController&) = delete;
~PriceTrackingPageActionController() override;
std::optional<bool> ShouldShowForNavigation() override;
bool WantsExpandedUi() override;
void ResetForNewNavigation(const GURL& url) override;
void OnIconClicked();
void OnSubscribe(const CommerceSubscription& subscription,
bool succeeded) override;
void OnUnsubscribe(const CommerceSubscription& subscription,
bool succeeded) override;
const gfx::Image& GetLastFetchedImage();
const GURL& GetLastFetchedImageUrl();
bool IsPriceTrackingCurrentProduct();
void SetImageFetcherForTesting(image_fetcher::ImageFetcher* image_fetcher);
private:
void HandleProductInfoResponse(const GURL& url,
const std::optional<const ProductInfo>& info);
void MaybeDoProductImageFetch(const std::optional<ProductInfo>& info);
void UpdatePriceTrackingStateFromSubscriptions();
void HandleSubscriptionChange(const CommerceSubscription& sub);
void HandleImageFetcherResponse(
const GURL image_url,
const gfx::Image& image,
const image_fetcher::RequestMetadata& request_metadata);
void MaybeRecordPriceTrackingIconMetrics(bool from_icon_use);
GURL current_url_;
bool got_product_response_for_page_{false};
bool got_image_response_for_page_{false};
bool got_initial_subscription_status_for_page_{false};
bool is_cluster_id_tracked_by_user_{false};
std::optional<uint64_t> cluster_id_for_page_;
std::optional<ProductInfo> product_info_for_page_;
raw_ptr<ShoppingService> shopping_service_;
raw_ptr<image_fetcher::ImageFetcher> image_fetcher_;
raw_ptr<feature_engagement::Tracker> tracker_;
GURL last_fetched_image_url_;
gfx::Image last_fetched_image_;
bool expanded_ui_for_page_{false};
bool icon_use_recorded_for_page_{false};
base::ScopedObservation<ShoppingService, SubscriptionsObserver>
scoped_observation_{this};
base::WeakPtrFactory<PriceTrackingPageActionController> weak_ptr_factory_{
this};
};
}
#endif