blob: 566bdf57457c864b90c866afa3a4f85ef9374ca7 [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"
Hesen Zhang07b5f6d2020-04-30 17:27:0111#include "base/rand_util.h"
Hesen Zhangfff4f252020-05-04 19:49:4712#include "components/query_tiles/internal/proto_conversion.h"
Shakti Sahu2ad79442020-03-25 01:51:2513
14namespace upboarding {
Hesen Zhang07b5f6d2020-04-30 17:27:0115namespace {
Shakti Sahu2ad79442020-03-25 01:51:2516
Hesen Zhang07b5f6d2020-04-30 17:27:0117// Default periodic interval of background task.
18constexpr base::TimeDelta kBackgroundTaskInterval =
19 base::TimeDelta::FromHours(16);
20
21// Default length of random window added to the periodic interval.
22constexpr base::TimeDelta kBackgroundTaskRandomWindow =
23 base::TimeDelta::FromHours(6);
24
25// Default flex time of background task.
26constexpr base::TimeDelta kBackgroundTaskFlexTime =
27 base::TimeDelta::FromHours(2);
28
29} // namespace
30
31TileServiceImpl::TileServiceImpl(
32 std::unique_ptr<ImageLoader> image_loader,
33 std::unique_ptr<TileManager> tile_manager,
34 std::unique_ptr<TileConfig> config,
Hesen Zhang09f367a62020-05-01 06:30:3035 background_task::BackgroundTaskScheduler* scheduler,
36 std::unique_ptr<TileFetcher> tile_fetcher)
Hesen Zhang53a7fd12020-04-23 01:04:5637 : image_loader_(std::move(image_loader)),
38 tile_manager_(std::move(tile_manager)),
Hesen Zhang07b5f6d2020-04-30 17:27:0139 config_(std::move(config)),
Hesen Zhang09f367a62020-05-01 06:30:3040 scheduler_(scheduler),
41 tile_fetcher_(std::move(tile_fetcher)) {
Hesen Zhangfff4f252020-05-04 19:49:4742 // TODO(crbug.com/1077172): Initialize tile_db within tile_manager from
43 // init_aware layer.
Hesen Zhang07b5f6d2020-04-30 17:27:0144 ScheduleDailyTask();
45}
Shakti Sahu2ad79442020-03-25 01:51:2546
47TileServiceImpl::~TileServiceImpl() = default;
48
49void TileServiceImpl::GetQueryTiles(GetTilesCallback callback) {
Hesen Zhang4f42c282020-04-28 21:00:2450 tile_manager_->GetTiles(std::move(callback));
Shakti Sahu2ad79442020-03-25 01:51:2551}
52
Shakti Sahufe5a7bca2020-04-30 00:00:1453void TileServiceImpl::GetTile(const std::string& tile_id,
54 TileCallback callback) {
55 tile_manager_->GetTile(tile_id, std::move(callback));
56}
57
Shakti Sahu2ad79442020-03-25 01:51:2558void TileServiceImpl::GetVisuals(const std::string& tile_id,
59 VisualsCallback callback) {
60 NOTIMPLEMENTED();
61}
62
Hesen Zhang07b5f6d2020-04-30 17:27:0163void TileServiceImpl::ScheduleDailyTask() {
64 background_task::PeriodicInfo periodic_info;
65 periodic_info.interval_ms =
66 kBackgroundTaskInterval.InMilliseconds() +
67 base::RandGenerator(kBackgroundTaskRandomWindow.InMilliseconds());
68 periodic_info.flex_ms = kBackgroundTaskFlexTime.InMilliseconds();
69
70 background_task::TaskInfo task_info(
71 static_cast<int>(background_task::TaskIds::QUERY_TILE_JOB_ID),
72 periodic_info);
73 task_info.is_persisted = true;
74 task_info.update_current = false;
75 task_info.network_type =
76 config_->is_unmetered_network_required
77 ? background_task::TaskInfo::NetworkType::UNMETERED
78 : background_task::TaskInfo::NetworkType::ANY;
79
80 scheduler_->Schedule(task_info);
81}
82
Hesen Zhang7e393682020-05-01 18:52:0783void TileServiceImpl::StartFetchForTiles(
Hesen Zhangfff4f252020-05-04 19:49:4784 BackgroundTaskFinishedCallback task_finished_callback) {
Hesen Zhang7e393682020-05-01 18:52:0785 DCHECK(tile_fetcher_);
Hesen Zhangfff4f252020-05-04 19:49:4786 tile_fetcher_->StartFetchForTiles(base::BindOnce(
87 &TileServiceImpl::OnFetchFinished, weak_ptr_factory_.GetWeakPtr(),
88 std::move(task_finished_callback)));
Hesen Zhang7e393682020-05-01 18:52:0789}
90
Hesen Zhangfff4f252020-05-04 19:49:4791// TODO(crbug.com/1077173): Handle the failures, retry mechanism and
92// related metrics.
Hesen Zhang7e393682020-05-01 18:52:0793void TileServiceImpl::OnFetchFinished(
Hesen Zhangfff4f252020-05-04 19:49:4794 BackgroundTaskFinishedCallback task_finished_callback,
Hesen Zhang7e393682020-05-01 18:52:0795 TileInfoRequestStatus status,
96 const std::unique_ptr<std::string> response_body) {
Hesen Zhangfff4f252020-05-04 19:49:4797 query_tiles::proto::ServerResponse response_proto;
98 if (status == TileInfoRequestStatus::kSuccess) {
99 bool parse_success = response_proto.ParseFromString(*response_body.get());
100 if (parse_success) {
101 TileGroup group;
102 TileGroupFromResponse(response_proto, &group);
103 // TODO(crbug.com/1077288): Validate tile group.
104 tile_manager_->SaveTiles(
105 std::move(group.tiles),
106 base::BindOnce(&TileServiceImpl::OnTilesSaved,
107 weak_ptr_factory_.GetWeakPtr(),
108 std::move(task_finished_callback)));
109 }
110 } else {
111 std::move(task_finished_callback).Run(false /*reschedule*/);
112 }
113}
114
115void TileServiceImpl::OnTilesSaved(
116 BackgroundTaskFinishedCallback task_finished_callback,
117 TileGroupStatus status) {
118 std::move(task_finished_callback).Run(false /*reschedule*/);
Hesen Zhang7e393682020-05-01 18:52:07119}
120
Shakti Sahu2ad79442020-03-25 01:51:25121} // namespace upboarding