blob: 28d1fe1e4bdcf63c1d3543212d350e9199fba26e [file] [log] [blame]
charleszhao17777f92020-04-23 12:53:11 +10001// Copyright 2020 The Chromium OS 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
5#include "ml/handwriting_recognizer_impl.h"
6
7#include <utility>
charleszhao492441e2020-05-26 16:17:07 +10008#include <vector>
charleszhao17777f92020-04-23 12:53:11 +10009
charleszhao05c5a4a2020-06-09 16:49:54 +100010#include "ml/handwriting_path.h"
charleszhao17777f92020-04-23 12:53:11 +100011#include "ml/handwriting_proto_mojom_conversion.h"
12
13namespace ml {
14namespace {
15
16using ::chromeos::machine_learning::mojom::HandwritingRecognitionQueryPtr;
charleszhao492441e2020-05-26 16:17:07 +100017using ::chromeos::machine_learning::mojom::HandwritingRecognizerCandidatePtr;
charleszhao17777f92020-04-23 12:53:11 +100018using ::chromeos::machine_learning::mojom::HandwritingRecognizerRequest;
charleszhao492441e2020-05-26 16:17:07 +100019using ::chromeos::machine_learning::mojom::HandwritingRecognizerResult;
charleszhao05c5a4a2020-06-09 16:49:54 +100020using ::chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr;
charleszhao17777f92020-04-23 12:53:11 +100021
22} // namespace
23
charleszhao05c5a4a2020-06-09 16:49:54 +100024bool HandwritingRecognizerImpl::Create(HandwritingRecognizerSpecPtr spec,
25 HandwritingRecognizerRequest request) {
charleszhao17777f92020-04-23 12:53:11 +100026 auto recognizer_impl =
charleszhao05c5a4a2020-06-09 16:49:54 +100027 new HandwritingRecognizerImpl(std::move(spec), std::move(request));
charleszhao17777f92020-04-23 12:53:11 +100028
Andrew Moylan79b34a42020-07-08 11:13:11 +100029 // Set the connection error handler to strongly bind `recognizer_impl` to
30 // delete `recognizer_impl` when the connection is gone.
charleszhao17777f92020-04-23 12:53:11 +100031 recognizer_impl->binding_.set_connection_error_handler(base::Bind(
32 [](const HandwritingRecognizerImpl* const recognizer_impl) {
33 delete recognizer_impl;
34 },
35 base::Unretained(recognizer_impl)));
36
37 return recognizer_impl->successfully_loaded_;
38}
39
40HandwritingRecognizerImpl::HandwritingRecognizerImpl(
charleszhao05c5a4a2020-06-09 16:49:54 +100041 HandwritingRecognizerSpecPtr spec, HandwritingRecognizerRequest request)
charleszhao17777f92020-04-23 12:53:11 +100042 : binding_(this, std::move(request)) {
43 auto* const hwr_library = ml::HandwritingLibrary::GetInstance();
44 DCHECK(hwr_library->GetStatus() == ml::HandwritingLibrary::Status::kOk)
45 << "HandwritingRecognizerImpl should be created only if "
46 "HandwritingLibrary is initialized successfully.";
47
charleszhao05c5a4a2020-06-09 16:49:54 +100048 const auto model_path = GetModelPaths(std::move(spec));
49 if (!model_path.has_value()) {
50 successfully_loaded_ = false;
51 return;
52 }
53
charleszhao17777f92020-04-23 12:53:11 +100054 recognizer_ = hwr_library->CreateHandwritingRecognizer();
55
56 successfully_loaded_ = hwr_library->LoadHandwritingRecognizer(
57 recognizer_, chrome_knowledge::HandwritingRecognizerOptions(),
charleszhao05c5a4a2020-06-09 16:49:54 +100058 model_path.value());
charleszhao17777f92020-04-23 12:53:11 +100059}
60
61HandwritingRecognizerImpl::~HandwritingRecognizerImpl() {
62 ml::HandwritingLibrary::GetInstance()->DestroyHandwritingRecognizer(
63 recognizer_);
64}
65
66void HandwritingRecognizerImpl::Recognize(HandwritingRecognitionQueryPtr query,
67 RecognizeCallback callback) {
68 chrome_knowledge::HandwritingRecognizerResult result_proto;
charleszhao17777f92020-04-23 12:53:11 +100069
charleszhao492441e2020-05-26 16:17:07 +100070 if (ml::HandwritingLibrary::GetInstance()->RecognizeHandwriting(
71 recognizer_, HandwritingRecognitionQueryToProto(std::move(query)),
72 &result_proto)) {
73 // Recognition succeeded, run callback on the result.
74 std::move(callback).Run(HandwritingRecognizerResultFromProto(result_proto));
75 } else {
76 // Recognition failed, run callback on empty result and status = ERROR.
77 std::move(callback).Run(HandwritingRecognizerResult::New(
78 HandwritingRecognizerResult::Status::ERROR,
79 std::vector<HandwritingRecognizerCandidatePtr>()));
80 }
charleszhao17777f92020-04-23 12:53:11 +100081}
82
83} // namespace ml