| |
| |
| |
|
|
| #include "chromeos/services/machine_learning/cpp/ash/handwriting_model_loader.h" |
|
|
| #include <string> |
| #include <utility> |
|
|
| #include "ash/constants/ash_switches.h" |
| #include "base/callback_helpers.h" |
| #include "base/command_line.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "chromeos/services/machine_learning/public/cpp/service_connection.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
|
|
| namespace ash { |
| namespace machine_learning { |
| namespace { |
|
|
| using ::chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr; |
| using ::chromeos::machine_learning::mojom::LoadHandwritingModelResult; |
| using HandwritingRecognizer = mojo::PendingReceiver< |
| ::chromeos::machine_learning::mojom::HandwritingRecognizer>; |
| using LoadHandwritingModelCallback = ::chromeos::machine_learning::mojom:: |
| MachineLearningService::LoadHandwritingModelCallback; |
|
|
| |
| void RecordLoadHandwritingModelResult(const LoadHandwritingModelResult val) { |
| UMA_HISTOGRAM_ENUMERATION( |
| "MachineLearningService.HandwritingModel.LoadModelResult.Event", val, |
| LoadHandwritingModelResult::LOAD_MODEL_FILES_ERROR); |
| } |
|
|
| constexpr char kLibHandwritingDlcId[] = "libhandwriting"; |
| |
| constexpr char kLanguageCodeEn[] = "en"; |
| constexpr char kLanguageCodeGesture[] = "gesture_in_context"; |
|
|
| |
| |
| bool HandwritingSwitchHasValue(const std::string& value) { |
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| return command_line->HasSwitch(ash::switches::kOndeviceHandwritingSwitch) && |
| command_line->GetSwitchValueASCII( |
| ash::switches::kOndeviceHandwritingSwitch) == value; |
| } |
|
|
| |
| bool IsLibHandwritingRootfsEnabled() { |
| return HandwritingSwitchHasValue("use_rootfs"); |
| } |
|
|
| |
| bool IsLibHandwritingDlcEnabled() { |
| return HandwritingSwitchHasValue("use_dlc"); |
| } |
|
|
| |
| |
| |
| void OnInstallDlcComplete( |
| HandwritingRecognizerSpecPtr spec, |
| HandwritingRecognizer receiver, |
| LoadHandwritingModelCallback callback, |
| const chromeos::DlcserviceClient::InstallResult& result) { |
| |
| if (result.error == dlcservice::kErrorNone) { |
| chromeos::machine_learning::ServiceConnection::GetInstance() |
| ->GetMachineLearningService() |
| .LoadHandwritingModel(std::move(spec), std::move(receiver), |
| std::move(callback)); |
| return; |
| } |
|
|
| RecordLoadHandwritingModelResult( |
| LoadHandwritingModelResult::DLC_INSTALL_ERROR); |
| std::move(callback).Run(LoadHandwritingModelResult::DLC_INSTALL_ERROR); |
| } |
|
|
| |
| |
| |
| void OnGetExistingDlcsComplete( |
| HandwritingRecognizerSpecPtr spec, |
| HandwritingRecognizer receiver, |
| LoadHandwritingModelCallback callback, |
| chromeos::DlcserviceClient* const dlc_client, |
| const std::string& err, |
| const dlcservice::DlcsWithContent& dlcs_with_content) { |
| |
| |
| |
| for (const auto& dlc_info : dlcs_with_content.dlc_infos()) { |
| if (dlc_info.id() == kLibHandwritingDlcId) { |
| dlc_client->Install( |
| kLibHandwritingDlcId, |
| base::BindOnce(&OnInstallDlcComplete, std::move(spec), |
| std::move(receiver), std::move(callback)), |
| base::DoNothing()); |
| return; |
| } |
| } |
|
|
| |
| RecordLoadHandwritingModelResult( |
| LoadHandwritingModelResult::DLC_DOES_NOT_EXIST); |
| std::move(callback).Run(LoadHandwritingModelResult::DLC_DOES_NOT_EXIST); |
| } |
|
|
| } |
|
|
| void LoadHandwritingModelFromRootfsOrDlc( |
| HandwritingRecognizerSpecPtr spec, |
| HandwritingRecognizer receiver, |
| LoadHandwritingModelCallback callback, |
| chromeos::DlcserviceClient* const dlc_client) { |
| |
| if (!IsLibHandwritingRootfsEnabled() && !IsLibHandwritingDlcEnabled()) { |
| RecordLoadHandwritingModelResult( |
| LoadHandwritingModelResult::FEATURE_NOT_SUPPORTED_ERROR); |
| std::move(callback).Run( |
| LoadHandwritingModelResult::FEATURE_NOT_SUPPORTED_ERROR); |
| return; |
| } |
|
|
| |
| if (spec->language != kLanguageCodeEn && |
| spec->language != kLanguageCodeGesture) { |
| RecordLoadHandwritingModelResult( |
| LoadHandwritingModelResult::LANGUAGE_NOT_SUPPORTED_ERROR); |
| std::move(callback).Run( |
| LoadHandwritingModelResult::LANGUAGE_NOT_SUPPORTED_ERROR); |
| return; |
| } |
|
|
| |
| if (IsLibHandwritingRootfsEnabled()) { |
| chromeos::machine_learning::ServiceConnection::GetInstance() |
| ->GetMachineLearningService() |
| .LoadHandwritingModel(std::move(spec), std::move(receiver), |
| std::move(callback)); |
| return; |
| } |
|
|
| |
| |
| dlc_client->GetExistingDlcs( |
| base::BindOnce(&OnGetExistingDlcsComplete, std::move(spec), |
| std::move(receiver), std::move(callback), dlc_client)); |
| } |
|
|
| } |
| } |
|
|