blob: bb68d71da725d291a702a8a0f870c0ddcbf4a7ad [file] [log] [blame]
Shakti Sahu2ad79442020-03-25 01:51:251// 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
Shakti Sahuce57c7d92020-04-29 01:47:175#include "components/query_tiles/internal/tile_service_impl.h"
Shakti Sahu2ad79442020-03-25 01:51:256
Hesen Zhang53a7fd12020-04-23 01:04:567#include <string>
8#include <utility>
9
Hesen Zhang7e393682020-05-01 18:52:0710#include "base/bind.h"
danakjdb9ae7942020-11-11 16:01:3511#include "base/callback_helpers.h"
Hesen Zhangc34f49b2020-05-08 05:21:2512#include "base/guid.h"
Hesen Zhang07b5f6d2020-04-30 17:27:0113#include "base/rand_util.h"
Shakti Sahu1b246a02020-05-09 03:37:5014#include "base/threading/thread_task_runner_handle.h"
Hesen Zhangfff4f252020-05-04 19:49:4715#include "components/query_tiles/internal/proto_conversion.h"
Min Qinc81780f02020-05-07 01:13:3916#include "components/query_tiles/internal/tile_config.h"
Shakti Sahu2ad79442020-03-25 01:51:2517
Xing Liu6d873212020-05-13 22:33:4918namespace query_tiles {
Hesen Zhang07b5f6d2020-04-30 17:27:0119
20TileServiceImpl::TileServiceImpl(
Xing Liu72ab94c2020-05-14 02:36:5121 std::unique_ptr<ImagePrefetcher> image_prefetcher,
Hesen Zhang07b5f6d2020-04-30 17:27:0122 std::unique_ptr<TileManager> tile_manager,
Hesen Zhang70987282020-05-14 18:15:0323 std::unique_ptr<TileServiceScheduler> scheduler,
Hesen Zhangc34f49b2020-05-08 05:21:2524 std::unique_ptr<TileFetcher> tile_fetcher,
Hesen Zhang718959712020-07-08 00:59:1425 base::Clock* clock,
26 std::unique_ptr<Logger> logger)
Xing Liu72ab94c2020-05-14 02:36:5127 : image_prefetcher_(std::move(image_prefetcher)),
Hesen Zhang53a7fd12020-04-23 01:04:5628 tile_manager_(std::move(tile_manager)),
Hesen Zhang70987282020-05-14 18:15:0329 scheduler_(std::move(scheduler)),
Hesen Zhangc34f49b2020-05-08 05:21:2530 tile_fetcher_(std::move(tile_fetcher)),
Hesen Zhang718959712020-07-08 00:59:1431 clock_(clock),
32 logger_(std::move(logger)) {}
Shakti Sahu2ad79442020-03-25 01:51:2533
34TileServiceImpl::~TileServiceImpl() = default;
35
Xing Liu8a670da2020-05-06 23:18:2336void TileServiceImpl::Initialize(SuccessCallback callback) {
37 tile_manager_->Init(base::BindOnce(&TileServiceImpl::OnTileManagerInitialized,
38 weak_ptr_factory_.GetWeakPtr(),
39 std::move(callback)));
40}
41
42void TileServiceImpl::OnTileManagerInitialized(SuccessCallback callback,
43 TileGroupStatus status) {
Hesen Zhang70987282020-05-14 18:15:0344 bool success = (status == TileGroupStatus::kSuccess ||
45 status == TileGroupStatus::kNoTiles);
Xing Liu8a670da2020-05-06 23:18:2346 DCHECK(callback);
Hesen Zhangc6b1a262020-07-07 18:38:0947 scheduler_->SetDelegate(this);
Hesen Zhang70987282020-05-14 18:15:0348 scheduler_->OnTileManagerInitialized(status);
Xing Liu8a670da2020-05-06 23:18:2349 std::move(callback).Run(success);
50}
51
Shakti Sahu2ad79442020-03-25 01:51:2552void TileServiceImpl::GetQueryTiles(GetTilesCallback callback) {
Hesen Zhang4f42c282020-04-28 21:00:2453 tile_manager_->GetTiles(std::move(callback));
Shakti Sahu2ad79442020-03-25 01:51:2554}
55
Shakti Sahufe5a7bca2020-04-30 00:00:1456void TileServiceImpl::GetTile(const std::string& tile_id,
57 TileCallback callback) {
58 tile_manager_->GetTile(tile_id, std::move(callback));
59}
60
Hesen Zhang7e393682020-05-01 18:52:0761void TileServiceImpl::StartFetchForTiles(
Xing Liuf165f38d2020-05-12 19:27:1062 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:4763 BackgroundTaskFinishedCallback task_finished_callback) {
Hesen Zhang7e393682020-05-01 18:52:0764 DCHECK(tile_fetcher_);
Hesen Zhangfff4f252020-05-04 19:49:4765 tile_fetcher_->StartFetchForTiles(base::BindOnce(
66 &TileServiceImpl::OnFetchFinished, weak_ptr_factory_.GetWeakPtr(),
Xing Liu72ab94c2020-05-14 02:36:5167 is_from_reduced_mode, std::move(task_finished_callback)));
Hesen Zhangc6b1a262020-07-07 18:38:0968 scheduler_->OnFetchStarted();
Hesen Zhang7e393682020-05-01 18:52:0769}
70
Hesen Zhang70987282020-05-14 18:15:0371void TileServiceImpl::CancelTask() {
72 scheduler_->CancelTask();
73}
74
Hesen Zhangd4114042020-06-25 22:42:5075void TileServiceImpl::PurgeDb() {
76 auto status = tile_manager_->PurgeDb();
77 scheduler_->OnDbPurged(status);
78}
79
Min Qin755a41c2020-07-22 21:11:5880void TileServiceImpl::SetServerUrl(const std::string& base_url) {
81 if (base_url.empty())
82 return;
Min Qin45b7edc32021-03-25 21:48:0183 tile_fetcher_->SetServerUrl(
84 TileConfig::GetQueryTilesServerUrl(base_url, true));
Min Qin755a41c2020-07-22 21:11:5885}
86
Hesen Zhang7e393682020-05-01 18:52:0787void TileServiceImpl::OnFetchFinished(
Xing Liu72ab94c2020-05-14 02:36:5188 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:4789 BackgroundTaskFinishedCallback task_finished_callback,
Hesen Zhang7e393682020-05-01 18:52:0790 TileInfoRequestStatus status,
91 const std::unique_ptr<std::string> response_body) {
Hesen Zhangfff4f252020-05-04 19:49:4792 query_tiles::proto::ServerResponse response_proto;
93 if (status == TileInfoRequestStatus::kSuccess) {
94 bool parse_success = response_proto.ParseFromString(*response_body.get());
95 if (parse_success) {
96 TileGroup group;
97 TileGroupFromResponse(response_proto, &group);
Hesen Zhangc34f49b2020-05-08 05:21:2598 group.id = base::GenerateGUID();
99 group.last_updated_ts = clock_->Now();
Xing Liu72ab94c2020-05-14 02:36:51100 auto group_copy = std::make_unique<TileGroup>(group);
Hesen Zhangfff4f252020-05-04 19:49:47101 tile_manager_->SaveTiles(
Xing Liu72ab94c2020-05-14 02:36:51102 std::move(group_copy),
Hesen Zhangfff4f252020-05-04 19:49:47103 base::BindOnce(&TileServiceImpl::OnTilesSaved,
Xing Liu72ab94c2020-05-14 02:36:51104 weak_ptr_factory_.GetWeakPtr(), std::move(group),
105 is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:47106 std::move(task_finished_callback)));
Hesen Zhang70987282020-05-14 18:15:03107 } else {
108 status = TileInfoRequestStatus::kShouldSuspend;
Hesen Zhangfff4f252020-05-04 19:49:47109 }
110 } else {
111 std::move(task_finished_callback).Run(false /*reschedule*/);
112 }
Hesen Zhang70987282020-05-14 18:15:03113 scheduler_->OnFetchCompleted(status);
Hesen Zhangfff4f252020-05-04 19:49:47114}
115
116void TileServiceImpl::OnTilesSaved(
Xing Liu72ab94c2020-05-14 02:36:51117 TileGroup tile_group,
118 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:47119 BackgroundTaskFinishedCallback task_finished_callback,
120 TileGroupStatus status) {
Hesen Zhangc6b1a262020-07-07 18:38:09121 scheduler_->OnGroupDataSaved(status);
122
Xing Liu72ab94c2020-05-14 02:36:51123 if (status != TileGroupStatus::kSuccess) {
124 std::move(task_finished_callback).Run(false /*reschedule*/);
125 return;
126 }
127
128 image_prefetcher_->Prefetch(
129 std::move(tile_group), is_from_reduced_mode,
130 base::BindOnce(&TileServiceImpl::OnPrefetchImagesDone,
131 weak_ptr_factory_.GetWeakPtr(),
132 std::move(task_finished_callback)));
133}
134
135void TileServiceImpl::OnPrefetchImagesDone(
136 BackgroundTaskFinishedCallback task_finished_callback) {
137 DCHECK(task_finished_callback);
Hesen Zhangfff4f252020-05-04 19:49:47138 std::move(task_finished_callback).Run(false /*reschedule*/);
Hesen Zhang7e393682020-05-01 18:52:07139}
140
Hesen Zhangc6b1a262020-07-07 18:38:09141TileGroup* TileServiceImpl::GetTileGroup() {
142 return tile_manager_->GetTileGroup();
143}
144
Min Qin07119772020-09-22 02:37:59145void TileServiceImpl::OnTileClicked(const std::string& tile_id) {
146 tile_manager_->OnTileClicked(tile_id);
147}
148
Min Qin8e822ff22020-09-26 07:40:54149void TileServiceImpl::OnQuerySelected(
Anton Bikineev1156b5f2021-05-15 22:35:36150 const absl::optional<std::string>& parent_tile_id,
Jan Wilken Dörriefa241ba2021-03-11 17:57:01151 const std::u16string& query_text) {
Min Qin8e822ff22020-09-26 07:40:54152 tile_manager_->OnQuerySelected(std::move(parent_tile_id), query_text);
153}
154
Hesen Zhang718959712020-07-08 00:59:14155Logger* TileServiceImpl::GetLogger() {
156 return logger_.get();
157}
158
Xing Liu6d873212020-05-13 22:33:49159} // namespace query_tiles