blob: e24b1b9224a4d91ad699c318f67eb1c2fbf81fc9 [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"
Shakti Sahu1b246a02020-05-09 03:37:5011#include "base/bind_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,
25 base::Clock* clock)
Xing Liu72ab94c2020-05-14 02:36:5126 : image_prefetcher_(std::move(image_prefetcher)),
Hesen Zhang53a7fd12020-04-23 01:04:5627 tile_manager_(std::move(tile_manager)),
Hesen Zhang70987282020-05-14 18:15:0328 scheduler_(std::move(scheduler)),
Hesen Zhangc34f49b2020-05-08 05:21:2529 tile_fetcher_(std::move(tile_fetcher)),
Hesen Zhang70987282020-05-14 18:15:0330 clock_(clock) {}
Shakti Sahu2ad79442020-03-25 01:51:2531
32TileServiceImpl::~TileServiceImpl() = default;
33
Xing Liu8a670da2020-05-06 23:18:2334void TileServiceImpl::Initialize(SuccessCallback callback) {
35 tile_manager_->Init(base::BindOnce(&TileServiceImpl::OnTileManagerInitialized,
36 weak_ptr_factory_.GetWeakPtr(),
37 std::move(callback)));
38}
39
40void TileServiceImpl::OnTileManagerInitialized(SuccessCallback callback,
41 TileGroupStatus status) {
Hesen Zhang70987282020-05-14 18:15:0342 bool success = (status == TileGroupStatus::kSuccess ||
43 status == TileGroupStatus::kNoTiles);
Xing Liu8a670da2020-05-06 23:18:2344 DCHECK(callback);
Hesen Zhangc6b1a262020-07-07 18:38:0945 scheduler_->SetDelegate(this);
Hesen Zhang70987282020-05-14 18:15:0346 scheduler_->OnTileManagerInitialized(status);
Xing Liu8a670da2020-05-06 23:18:2347 std::move(callback).Run(success);
48}
49
Shakti Sahu2ad79442020-03-25 01:51:2550void TileServiceImpl::GetQueryTiles(GetTilesCallback callback) {
Hesen Zhang4f42c282020-04-28 21:00:2451 tile_manager_->GetTiles(std::move(callback));
Shakti Sahu2ad79442020-03-25 01:51:2552}
53
Shakti Sahufe5a7bca2020-04-30 00:00:1454void TileServiceImpl::GetTile(const std::string& tile_id,
55 TileCallback callback) {
56 tile_manager_->GetTile(tile_id, std::move(callback));
57}
58
Hesen Zhang7e393682020-05-01 18:52:0759void TileServiceImpl::StartFetchForTiles(
Xing Liuf165f38d2020-05-12 19:27:1060 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:4761 BackgroundTaskFinishedCallback task_finished_callback) {
Hesen Zhang7e393682020-05-01 18:52:0762 DCHECK(tile_fetcher_);
Hesen Zhangfff4f252020-05-04 19:49:4763 tile_fetcher_->StartFetchForTiles(base::BindOnce(
64 &TileServiceImpl::OnFetchFinished, weak_ptr_factory_.GetWeakPtr(),
Xing Liu72ab94c2020-05-14 02:36:5165 is_from_reduced_mode, std::move(task_finished_callback)));
Hesen Zhangc6b1a262020-07-07 18:38:0966 scheduler_->OnFetchStarted();
Hesen Zhang7e393682020-05-01 18:52:0767}
68
Hesen Zhang70987282020-05-14 18:15:0369void TileServiceImpl::CancelTask() {
70 scheduler_->CancelTask();
71}
72
Hesen Zhangd4114042020-06-25 22:42:5073void TileServiceImpl::PurgeDb() {
74 auto status = tile_manager_->PurgeDb();
75 scheduler_->OnDbPurged(status);
76}
77
Hesen Zhang7e393682020-05-01 18:52:0778void TileServiceImpl::OnFetchFinished(
Xing Liu72ab94c2020-05-14 02:36:5179 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:4780 BackgroundTaskFinishedCallback task_finished_callback,
Hesen Zhang7e393682020-05-01 18:52:0781 TileInfoRequestStatus status,
82 const std::unique_ptr<std::string> response_body) {
Hesen Zhangfff4f252020-05-04 19:49:4783 query_tiles::proto::ServerResponse response_proto;
84 if (status == TileInfoRequestStatus::kSuccess) {
85 bool parse_success = response_proto.ParseFromString(*response_body.get());
86 if (parse_success) {
87 TileGroup group;
88 TileGroupFromResponse(response_proto, &group);
Hesen Zhangc34f49b2020-05-08 05:21:2589 group.id = base::GenerateGUID();
90 group.last_updated_ts = clock_->Now();
Xing Liu72ab94c2020-05-14 02:36:5191 auto group_copy = std::make_unique<TileGroup>(group);
Hesen Zhangfff4f252020-05-04 19:49:4792 tile_manager_->SaveTiles(
Xing Liu72ab94c2020-05-14 02:36:5193 std::move(group_copy),
Hesen Zhangfff4f252020-05-04 19:49:4794 base::BindOnce(&TileServiceImpl::OnTilesSaved,
Xing Liu72ab94c2020-05-14 02:36:5195 weak_ptr_factory_.GetWeakPtr(), std::move(group),
96 is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:4797 std::move(task_finished_callback)));
Hesen Zhang70987282020-05-14 18:15:0398 } else {
99 status = TileInfoRequestStatus::kShouldSuspend;
Hesen Zhangfff4f252020-05-04 19:49:47100 }
101 } else {
102 std::move(task_finished_callback).Run(false /*reschedule*/);
103 }
Hesen Zhang70987282020-05-14 18:15:03104 scheduler_->OnFetchCompleted(status);
Hesen Zhangfff4f252020-05-04 19:49:47105}
106
107void TileServiceImpl::OnTilesSaved(
Xing Liu72ab94c2020-05-14 02:36:51108 TileGroup tile_group,
109 bool is_from_reduced_mode,
Hesen Zhangfff4f252020-05-04 19:49:47110 BackgroundTaskFinishedCallback task_finished_callback,
111 TileGroupStatus status) {
Hesen Zhangc6b1a262020-07-07 18:38:09112 scheduler_->OnGroupDataSaved(status);
113
Xing Liu72ab94c2020-05-14 02:36:51114 if (status != TileGroupStatus::kSuccess) {
115 std::move(task_finished_callback).Run(false /*reschedule*/);
116 return;
117 }
118
119 image_prefetcher_->Prefetch(
120 std::move(tile_group), is_from_reduced_mode,
121 base::BindOnce(&TileServiceImpl::OnPrefetchImagesDone,
122 weak_ptr_factory_.GetWeakPtr(),
123 std::move(task_finished_callback)));
124}
125
126void TileServiceImpl::OnPrefetchImagesDone(
127 BackgroundTaskFinishedCallback task_finished_callback) {
128 DCHECK(task_finished_callback);
Hesen Zhangfff4f252020-05-04 19:49:47129 std::move(task_finished_callback).Run(false /*reschedule*/);
Hesen Zhang7e393682020-05-01 18:52:07130}
131
Hesen Zhangc6b1a262020-07-07 18:38:09132TileGroup* TileServiceImpl::GetTileGroup() {
133 return tile_manager_->GetTileGroup();
134}
135
Xing Liu6d873212020-05-13 22:33:49136} // namespace query_tiles