#ifndef IOS_CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_SERVICE_H_
#define IOS_CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_SERVICE_H_
#include <vector>
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/optimization_guide/core/new_optimization_guide_decider.h"
#include "components/optimization_guide/core/optimization_guide_decision.h"
#include "components/optimization_guide/core/optimization_guide_model_provider.h"
#include "components/optimization_guide/core/optimization_metadata.h"
#include "components/optimization_guide/proto/hints.pb.h"
#include "ios/chrome/browser/download/background_service/background_download_service_factory.h"
#include "url/gurl.h"
namespace leveldb_proto {
class ProtoDatabaseProvider;
}
namespace network {
class SharedURLLoaderFactory;
}
namespace optimization_guide {
class TabUrlProvider;
class TopHostProvider;
class OptimizationGuideStore;
class OptimizationTargetModelObserver;
class PredictionManager;
class HintsManager;
}
class BrowserList;
class OptimizationGuideLogger;
class OptimizationGuideNavigationData;
class PrefService;
namespace web {
class BrowserState;
class NavigationContext;
}
class OptimizationGuideService
: public KeyedService,
public optimization_guide::NewOptimizationGuideDecider,
public optimization_guide::OptimizationGuideModelProvider {
public:
using BackgroundDownloadServiceProvider =
base::OnceCallback<download::BackgroundDownloadService*(void)>;
OptimizationGuideService(
leveldb_proto::ProtoDatabaseProvider* proto_db_provider,
const base::FilePath& profile_path,
bool off_the_record,
const std::string& application_locale,
base::WeakPtr<optimization_guide::OptimizationGuideStore> hint_store,
base::WeakPtr<optimization_guide::OptimizationGuideStore>
prediction_model_and_features_store,
PrefService* pref_service,
BrowserList* browser_list,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
BackgroundDownloadServiceProvider background_download_service_provider);
~OptimizationGuideService() override;
OptimizationGuideService(const OptimizationGuideService&) = delete;
OptimizationGuideService& operator=(const OptimizationGuideService&) = delete;
void DoFinalInit();
void RegisterOptimizationTypes(
const std::vector<optimization_guide::proto::OptimizationType>&
optimization_types) override;
void CanApplyOptimization(
const GURL& url,
optimization_guide::proto::OptimizationType optimization_type,
optimization_guide::OptimizationGuideDecisionCallback callback) override;
optimization_guide::OptimizationGuideDecision CanApplyOptimization(
const GURL& url,
optimization_guide::proto::OptimizationType optimization_type,
optimization_guide::OptimizationMetadata* optimization_metadata) override;
void CanApplyOptimizationAsync(
web::NavigationContext* navigation_context,
optimization_guide::proto::OptimizationType optimization_type,
optimization_guide::OptimizationGuideDecisionCallback callback);
void AddObserverForOptimizationTargetModel(
optimization_guide::proto::OptimizationTarget optimization_target,
const absl::optional<optimization_guide::proto::Any>& model_metadata,
optimization_guide::OptimizationTargetModelObserver* observer) override;
void RemoveObserverForOptimizationTargetModel(
optimization_guide::proto::OptimizationTarget optimization_target,
optimization_guide::OptimizationTargetModelObserver* observer) override;
void OnBrowsingDataRemoved();
optimization_guide::HintsManager* GetHintsManager();
optimization_guide::PredictionManager* GetPredictionManager();
OptimizationGuideLogger* GetOptimizationGuideLogger() {
return optimization_guide_logger_.get();
}
private:
friend class OptimizationGuideServiceTest;
friend class OptimizationGuideTabHelper;
friend class OptimizationGuideTestAppInterfaceWrapper;
void OnNavigationStartOrRedirect(
OptimizationGuideNavigationData* navigation_data);
void OnNavigationFinish(const std::vector<GURL>& navigation_redirect_chain);
void Shutdown() override;
void CanApplyOptimizationOnDemand(
const std::vector<GURL>& urls,
const base::flat_set<optimization_guide::proto::OptimizationType>&
optimization_types,
optimization_guide::proto::RequestContext request_context,
optimization_guide::OnDemandOptimizationGuideDecisionRepeatingCallback
callback) override;
std::unique_ptr<optimization_guide::OptimizationGuideStore> hint_store_;
std::unique_ptr<optimization_guide::HintsManager> hints_manager_;
std::unique_ptr<optimization_guide::TopHostProvider> top_host_provider_;
std::unique_ptr<optimization_guide::TabUrlProvider> tab_url_provider_;
std::unique_ptr<OptimizationGuideLogger> optimization_guide_logger_;
std::unique_ptr<optimization_guide::OptimizationGuideStore>
prediction_model_and_features_store_;
std::unique_ptr<optimization_guide::PredictionManager> prediction_manager_;
PrefService* const pref_service_ = nullptr;
const bool off_the_record_ = false;
SEQUENCE_CHECKER(sequence_checker_);
};
#endif