1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/query_tiles/tile_service_factory_helper.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "base/command_line.h"
11 #include "base/sequenced_task_runner.h"
12 #include "base/task/post_task.h"
13 #include "base/task/thread_pool.h"
14 #include "base/time/default_clock.h"
15 #include "base/time/default_tick_clock.h"
16 #include "components/background_task_scheduler/background_task_scheduler.h"
17 #include "components/image_fetcher/core/image_fetcher_service.h"
18 #include "components/keyed_service/core/keyed_service.h"
19 #include "components/leveldb_proto/public/proto_database_provider.h"
20 #include "components/leveldb_proto/public/shared_proto_database_client_list.h"
21 #include "components/prefs/pref_service.h"
22 #include "components/query_tiles/internal/cached_image_loader.h"
23 #include "components/query_tiles/internal/image_prefetcher.h"
24 #include "components/query_tiles/internal/init_aware_tile_service.h"
25 #include "components/query_tiles/internal/logger_impl.h"
26 #include "components/query_tiles/internal/tile_config.h"
27 #include "components/query_tiles/internal/tile_fetcher.h"
28 #include "components/query_tiles/internal/tile_manager.h"
29 #include "components/query_tiles/internal/tile_service_impl.h"
30 #include "components/query_tiles/internal/tile_service_scheduler_impl.h"
31 #include "components/query_tiles/switches.h"
32 #include "services/network/public/cpp/shared_url_loader_factory.h"
33 
34 namespace query_tiles {
35 namespace {
36 const base::FilePath::CharType kTileDbName[] =
37     FILE_PATH_LITERAL("UpboardingQueryTileDatabase");
38 
BuildBackoffPolicy(net::BackoffEntry::Policy * policy)39 void BuildBackoffPolicy(net::BackoffEntry::Policy* policy) {
40   policy->num_errors_to_ignore = 0;
41   policy->initial_delay_ms =
42       TileConfig::GetBackoffPolicyArgsInitDelayInMs();  // 30 seconds.
43   policy->maximum_backoff_ms =
44       TileConfig::GetBackoffPolicyArgsMaxDelayInMs();  // 1 day.
45   policy->multiply_factor = 2;
46   policy->jitter_factor = 0.33;
47   policy->entry_lifetime_ms = -1;
48   policy->always_use_initial_delay = false;
49 }
50 
51 }  // namespace
52 
CreateTileService(image_fetcher::ImageFetcherService * image_fetcher_service,leveldb_proto::ProtoDatabaseProvider * db_provider,const base::FilePath & storage_dir,background_task::BackgroundTaskScheduler * scheduler,const std::string & accepted_language,const std::string & country_code,const std::string & api_key,const std::string & client_version,scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,PrefService * pref_service)53 std::unique_ptr<TileService> CreateTileService(
54     image_fetcher::ImageFetcherService* image_fetcher_service,
55     leveldb_proto::ProtoDatabaseProvider* db_provider,
56     const base::FilePath& storage_dir,
57     background_task::BackgroundTaskScheduler* scheduler,
58     const std::string& accepted_language,
59     const std::string& country_code,
60     const std::string& api_key,
61     const std::string& client_version,
62     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
63     PrefService* pref_service) {
64   // Create image loader.
65   auto* cached_image_fetcher = image_fetcher_service->GetImageFetcher(
66       image_fetcher::ImageFetcherConfig::kDiskCacheOnly);
67   auto* reduced_mode_image_fetcher = image_fetcher_service->GetImageFetcher(
68       image_fetcher::ImageFetcherConfig::kReducedMode);
69   auto image_loader = std::make_unique<CachedImageLoader>(
70       cached_image_fetcher, reduced_mode_image_fetcher);
71   auto image_prefetcher = ImagePrefetcher::Create(
72       TileConfig::GetImagePrefetchMode(), std::move(image_loader));
73 
74   auto* clock = base::DefaultClock::GetInstance();
75   auto logger = std::make_unique<LoggerImpl>();
76 
77   // Create tile store and manager.
78   auto task_runner = base::ThreadPool::CreateSequencedTaskRunner(
79       {base::MayBlock(), base::TaskPriority::USER_VISIBLE});
80   base::FilePath tile_store_dir = storage_dir.Append(kTileDbName);
81   auto tile_db = db_provider->GetDB<query_tiles::proto::TileGroup, TileGroup>(
82       leveldb_proto::ProtoDbType::UPBOARDING_QUERY_TILE_STORE, tile_store_dir,
83       task_runner);
84   auto tile_store = std::make_unique<TileStore>(std::move(tile_db));
85   auto tile_manager =
86       TileManager::Create(std::move(tile_store), clock, accepted_language);
87 
88   // Create fetcher.
89   auto tile_fetcher = TileFetcher::Create(
90       TileConfig::GetQueryTilesServerUrl(), country_code, accepted_language,
91       api_key, TileConfig::GetExperimentTag(), client_version,
92       url_loader_factory);
93 
94   // Wrap background task scheduler.
95   auto policy = std::make_unique<net::BackoffEntry::Policy>();
96   BuildBackoffPolicy(policy.get());
97   auto tile_background_task_scheduler =
98       std::make_unique<TileServiceSchedulerImpl>(
99           scheduler, pref_service, clock, base::DefaultTickClock::GetInstance(),
100           std::move(policy), logger.get());
101   logger->SetLogSource(tile_background_task_scheduler.get());
102 
103   auto tile_service_impl = std::make_unique<TileServiceImpl>(
104       std::move(image_prefetcher), std::move(tile_manager),
105       std::move(tile_background_task_scheduler), std::move(tile_fetcher), clock,
106       std::move(logger));
107   return std::make_unique<InitAwareTileService>(std::move(tile_service_impl));
108 }
109 
110 }  // namespace query_tiles
111