blob: 2743462489c038afbcaa475c360798fe1f724e1e [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/query_tiles/internal/init_aware_tile_service.h"
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/threading/thread_task_runner_handle.h"
namespace query_tiles {
InitAwareTileService::InitAwareTileService(
std::unique_ptr<InitializableTileService> tile_service)
: tile_service_(std::move(tile_service)) {
tile_service_->Initialize(
base::BindOnce(&InitAwareTileService::OnTileServiceInitialized,
weak_ptr_factory_.GetWeakPtr()));
}
void InitAwareTileService::OnTileServiceInitialized(bool success) {
DCHECK(!init_success_.has_value());
init_success_ = success;
// Flush all cached calls in FIFO sequence.
while (!cached_api_calls_.empty()) {
auto api_call = std::move(cached_api_calls_.front());
cached_api_calls_.pop_front();
std::move(api_call).Run();
}
}
void InitAwareTileService::GetQueryTiles(GetTilesCallback callback) {
if (IsReady()) {
tile_service_->GetQueryTiles(std::move(callback));
return;
}
if (IsFailed()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), TileList()));
return;
}
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::GetQueryTiles,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback)));
}
void InitAwareTileService::GetTile(const std::string& tile_id,
TileCallback callback) {
if (IsReady()) {
tile_service_->GetTile(tile_id, std::move(callback));
return;
}
if (IsFailed()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), base::nullopt));
return;
}
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::GetTile,
weak_ptr_factory_.GetWeakPtr(), tile_id,
std::move(callback)));
}
void InitAwareTileService::StartFetchForTiles(
bool is_from_reduced_mode,
BackgroundTaskFinishedCallback callback) {
if (IsReady()) {
tile_service_->StartFetchForTiles(is_from_reduced_mode,
std::move(callback));
return;
}
if (IsFailed()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(std::move(callback), false /*need_reschedule*/));
return;
}
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::StartFetchForTiles,
weak_ptr_factory_.GetWeakPtr(),
is_from_reduced_mode, std::move(callback)));
}
void InitAwareTileService::CancelTask() {
if (IsReady()) {
tile_service_->CancelTask();
} else if (!IsFailed()) {
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::CancelTask,
weak_ptr_factory_.GetWeakPtr()));
}
}
void InitAwareTileService::PurgeDb() {
if (IsReady()) {
tile_service_->PurgeDb();
} else if (!IsFailed()) {
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::PurgeDb,
weak_ptr_factory_.GetWeakPtr()));
}
}
void InitAwareTileService::SetServerUrl(const std::string& base_url) {
if (IsReady()) {
tile_service_->SetServerUrl(base_url);
} else if (!IsFailed()) {
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::SetServerUrl,
weak_ptr_factory_.GetWeakPtr(), base_url));
}
}
void InitAwareTileService::OnTileClicked(const std::string& tile_id) {
if (IsReady()) {
tile_service_->OnTileClicked(tile_id);
} else if (!IsFailed()) {
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::OnTileClicked,
weak_ptr_factory_.GetWeakPtr(), tile_id));
}
}
void InitAwareTileService::OnQuerySelected(
const base::Optional<std::string>& parent_tile_id,
const std::u16string& query_text) {
if (IsReady()) {
tile_service_->OnQuerySelected(std::move(parent_tile_id), query_text);
} else if (!IsFailed()) {
MaybeCacheApiCall(base::BindOnce(&InitAwareTileService::OnQuerySelected,
weak_ptr_factory_.GetWeakPtr(),
std::move(parent_tile_id), query_text));
}
}
Logger* InitAwareTileService::GetLogger() {
return tile_service_->GetLogger();
}
void InitAwareTileService::MaybeCacheApiCall(base::OnceClosure api_call) {
DCHECK(!init_success_.has_value())
<< "Only cache API calls before initialization.";
cached_api_calls_.emplace_back(std::move(api_call));
}
bool InitAwareTileService::IsReady() const {
return init_success_.has_value() && init_success_.value();
}
bool InitAwareTileService::IsFailed() const {
return init_success_.has_value() && !init_success_.value();
}
InitAwareTileService::~InitAwareTileService() = default;
} // namespace query_tiles