blob: 18bceb0466771c154cbf725c0edc63ccb68e1216 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/translate/ios/browser/language_detection_model_service.h"
#include <memory>
#import "base/task/sequenced_task_runner.h"
#include "base/task/sequenced_task_runner.h"
#include "components/translate/core/language_detection/language_detection_model.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace translate {
class LanguageDetectionModelContainer
: public base::RefCountedThreadSafe<LanguageDetectionModelContainer>,
public LanguageDetectionModel {
public:
LanguageDetectionModelContainer() {}
private:
// Allow destruction by RefCounted<>.
friend class RefCountedThreadSafe<LanguageDetectionModelContainer>;
// Destructor must be private/protected.
~LanguageDetectionModelContainer() = default;
};
namespace {
void SetLanguageDetectionModelModelFile(
scoped_refptr<translate::LanguageDetectionModelContainer>
language_detection_model,
base::File model_file) {
language_detection_model->UpdateWithFile(std::move(model_file));
}
} // namespace
LanguageDetectionModelService::LanguageDetectionModelService(
TranslateModelService* translate_model_service,
const scoped_refptr<base::SequencedTaskRunner>& background_task_runner)
: translate_model_service_(translate_model_service),
background_task_runner_(background_task_runner),
language_detection_model_(
base::MakeRefCounted<LanguageDetectionModelContainer>()) {
if (translate_model_service_) {
if (!language_detection_model_->IsAvailable()) {
translate_model_service_->NotifyOnModelFileAvailable(
base::BindOnce(&LanguageDetectionModelService::
OnLanguageModelFileAvailabilityChanged,
weak_ptr_factory_.GetWeakPtr()));
} else {
OnLanguageModelFileAvailabilityChanged(true);
}
}
}
LanguageDetectionModelService::~LanguageDetectionModelService() {}
LanguageDetectionModel*
LanguageDetectionModelService::GetLanguageDetectionModel() {
return language_detection_model_.get();
}
bool LanguageDetectionModelService::IsModelAvailable() {
return language_detection_model_->IsAvailable();
}
void LanguageDetectionModelService::OnLanguageModelFileAvailabilityChanged(
bool available) {
if (available) {
DCHECK(translate_model_service_);
base::File model_file =
translate_model_service_->GetLanguageDetectionModelFile();
background_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&SetLanguageDetectionModelModelFile,
language_detection_model_, std::move(model_file)));
}
}
} // namespace translate