language_packs_impl.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright 2021 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. #include <string>
  5. #include "base/metrics/histogram_functions.h"
  6. #include "chromeos/language/language_packs/language_packs_impl.h"
  7. #include "base/no_destructor.h"
  8. #include "third_party/abseil-cpp/absl/types/optional.h"
  9. namespace chromeos::language_packs {
  10. using ::chromeos::language::mojom::BasePackInfo;
  11. using ::chromeos::language::mojom::FeatureId;
  12. using ::chromeos::language::mojom::LanguagePackInfo;
  13. using ::chromeos::language::mojom::LanguagePacks;
  14. using ::chromeos::language::mojom::PackState;
  15. namespace {
  16. absl::optional<std::string> ConvertMojoFeatureToPackId(FeatureId mojo_id) {
  17. switch (mojo_id) {
  18. case FeatureId::HANDWRITING_RECOGNITION:
  19. return kHandwritingFeatureId;
  20. case FeatureId::TTS:
  21. return kTtsFeatureId;
  22. // Catch all unknown cases here.
  23. default:
  24. return absl::nullopt;
  25. }
  26. }
  27. PackState GetPackStateFromStatusCode(const PackResult::StatusCode status_code) {
  28. switch (status_code) {
  29. case PackResult::NOT_INSTALLED:
  30. return PackState::NOT_INSTALLED;
  31. case PackResult::IN_PROGRESS:
  32. return PackState::INSTALLING;
  33. case PackResult::INSTALLED:
  34. return PackState::INSTALLED;
  35. // Catch all remaining cases as error.
  36. default:
  37. return PackState::ERROR;
  38. }
  39. }
  40. // Called when GetPackState() or InstallPack() functions from Language Packs
  41. // are complete.
  42. void OnOperationComplete(LanguagePacksImpl::GetPackInfoCallback mojo_callback,
  43. const PackResult& pack_result) {
  44. auto info = LanguagePackInfo::New();
  45. info->pack_state = GetPackStateFromStatusCode(pack_result.pack_state);
  46. if (pack_result.pack_state == PackResult::INSTALLED) {
  47. info->path = pack_result.path;
  48. }
  49. base::UmaHistogramEnumeration("ChromeOS.LanguagePacks.Mojo.PackStateResponse",
  50. info->pack_state);
  51. std::move(mojo_callback).Run(std::move(info));
  52. }
  53. // Called when InstallBasePack() from Language Packs is complete.
  54. void OnInstallBasePackComplete(
  55. LanguagePacksImpl::InstallBasePackCallback mojo_callback,
  56. const PackResult& pack_result) {
  57. auto info = BasePackInfo::New();
  58. info->pack_state = GetPackStateFromStatusCode(pack_result.pack_state);
  59. if (pack_result.pack_state == PackResult::INSTALLED) {
  60. info->path = pack_result.path;
  61. }
  62. base::UmaHistogramEnumeration(
  63. "ChromeOS.LanguagePacks.Mojo.BasePackStateResponse", info->pack_state);
  64. std::move(mojo_callback).Run(std::move(info));
  65. }
  66. } // namespace
  67. LanguagePacksImpl::LanguagePacksImpl() = default;
  68. LanguagePacksImpl::~LanguagePacksImpl() = default;
  69. LanguagePacksImpl& LanguagePacksImpl::GetInstance() {
  70. static base::NoDestructor<LanguagePacksImpl> impl;
  71. return *impl;
  72. }
  73. void LanguagePacksImpl::BindReceiver(
  74. mojo::PendingReceiver<language::mojom::LanguagePacks> receiver) {
  75. receivers_.Add(this, std::move(receiver));
  76. }
  77. void LanguagePacksImpl::GetPackInfo(FeatureId feature_id,
  78. const std::string& language,
  79. GetPackInfoCallback mojo_callback) {
  80. base::UmaHistogramEnumeration(
  81. "ChromeOS.LanguagePacks.Mojo.GetPackInfo.Feature", feature_id);
  82. LanguagePackManager* lp = LanguagePackManager::GetInstance();
  83. const absl::optional<std::string> pack_id =
  84. ConvertMojoFeatureToPackId(feature_id);
  85. if (pack_id.has_value()) {
  86. lp->GetPackState(
  87. pack_id.value(), language,
  88. base::BindOnce(&OnOperationComplete, std::move(mojo_callback)));
  89. } else {
  90. auto info = LanguagePackInfo::New();
  91. info->pack_state = PackState::ERROR;
  92. std::move(mojo_callback).Run(std::move(info));
  93. }
  94. }
  95. void LanguagePacksImpl::InstallPack(FeatureId feature_id,
  96. const std::string& language,
  97. InstallPackCallback mojo_callback) {
  98. base::UmaHistogramEnumeration(
  99. "ChromeOS.LanguagePacks.Mojo.InstallPack.Feature", feature_id);
  100. LanguagePackManager* lp = LanguagePackManager::GetInstance();
  101. const absl::optional<std::string> pack_id =
  102. ConvertMojoFeatureToPackId(feature_id);
  103. if (pack_id.has_value()) {
  104. lp->InstallPack(
  105. pack_id.value(), language,
  106. base::BindOnce(&OnOperationComplete, std::move(mojo_callback)));
  107. } else {
  108. auto info = LanguagePackInfo::New();
  109. info->pack_state = PackState::ERROR;
  110. std::move(mojo_callback).Run(std::move(info));
  111. }
  112. }
  113. void LanguagePacksImpl::InstallBasePack(FeatureId feature_id,
  114. InstallBasePackCallback mojo_callback) {
  115. base::UmaHistogramEnumeration(
  116. "ChromeOS.LanguagePacks.Mojo.InstallBasePack.Feature", feature_id);
  117. LanguagePackManager* lp = LanguagePackManager::GetInstance();
  118. const absl::optional<std::string> pack_id =
  119. ConvertMojoFeatureToPackId(feature_id);
  120. if (pack_id.has_value()) {
  121. lp->InstallBasePack(*pack_id, base::BindOnce(&OnInstallBasePackComplete,
  122. std::move(mojo_callback)));
  123. } else {
  124. auto info = BasePackInfo::New();
  125. info->pack_state = PackState::ERROR;
  126. std::move(mojo_callback).Run(std::move(info));
  127. }
  128. }
  129. } // namespace chromeos::language_packs