blob: fb7ca6d5a6f9c91086305ca7685127a4ea260e23 [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;
Andrew Moylanb481af72020-07-09 15:22:00 +100018using ::chromeos::machine_learning::mojom::HandwritingRecognizer;
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
Andrew Moylanb481af72020-07-09 15:22:00 +100024bool HandwritingRecognizerImpl::Create(
25 HandwritingRecognizerSpecPtr spec,
26 mojo::PendingReceiver<HandwritingRecognizer> receiver) {
charleszhao17777f92020-04-23 12:53:11 +100027 auto recognizer_impl =
Andrew Moylanb481af72020-07-09 15:22:00 +100028 new HandwritingRecognizerImpl(std::move(spec), std::move(receiver));
charleszhao17777f92020-04-23 12:53:11 +100029
Andrew Moylanb481af72020-07-09 15:22:00 +100030 // Set the disconnection handler to strongly bind `recognizer_impl` to delete
31 // `recognizer_impl` when the connection is gone.
32 recognizer_impl->receiver_.set_disconnect_handler(base::Bind(
charleszhao17777f92020-04-23 12:53:11 +100033 [](const HandwritingRecognizerImpl* const recognizer_impl) {
34 delete recognizer_impl;
35 },
36 base::Unretained(recognizer_impl)));
37
38 return recognizer_impl->successfully_loaded_;
39}
40
41HandwritingRecognizerImpl::HandwritingRecognizerImpl(
Andrew Moylanb481af72020-07-09 15:22:00 +100042 HandwritingRecognizerSpecPtr spec,
43 mojo::PendingReceiver<HandwritingRecognizer> receiver)
44 : receiver_(this, std::move(receiver)) {
charleszhao17777f92020-04-23 12:53:11 +100045 auto* const hwr_library = ml::HandwritingLibrary::GetInstance();
46 DCHECK(hwr_library->GetStatus() == ml::HandwritingLibrary::Status::kOk)
47 << "HandwritingRecognizerImpl should be created only if "
48 "HandwritingLibrary is initialized successfully.";
49
charleszhao05c5a4a2020-06-09 16:49:54 +100050 const auto model_path = GetModelPaths(std::move(spec));
51 if (!model_path.has_value()) {
52 successfully_loaded_ = false;
53 return;
54 }
55
charleszhao17777f92020-04-23 12:53:11 +100056 recognizer_ = hwr_library->CreateHandwritingRecognizer();
57
58 successfully_loaded_ = hwr_library->LoadHandwritingRecognizer(
59 recognizer_, chrome_knowledge::HandwritingRecognizerOptions(),
charleszhao05c5a4a2020-06-09 16:49:54 +100060 model_path.value());
charleszhao17777f92020-04-23 12:53:11 +100061}
62
63HandwritingRecognizerImpl::~HandwritingRecognizerImpl() {
64 ml::HandwritingLibrary::GetInstance()->DestroyHandwritingRecognizer(
65 recognizer_);
66}
67
68void HandwritingRecognizerImpl::Recognize(HandwritingRecognitionQueryPtr query,
69 RecognizeCallback callback) {
70 chrome_knowledge::HandwritingRecognizerResult result_proto;
charleszhao17777f92020-04-23 12:53:11 +100071
charleszhao492441e2020-05-26 16:17:07 +100072 if (ml::HandwritingLibrary::GetInstance()->RecognizeHandwriting(
73 recognizer_, HandwritingRecognitionQueryToProto(std::move(query)),
74 &result_proto)) {
75 // Recognition succeeded, run callback on the result.
76 std::move(callback).Run(HandwritingRecognizerResultFromProto(result_proto));
77 } else {
78 // Recognition failed, run callback on empty result and status = ERROR.
79 std::move(callback).Run(HandwritingRecognizerResult::New(
80 HandwritingRecognizerResult::Status::ERROR,
81 std::vector<HandwritingRecognizerCandidatePtr>()));
82 }
charleszhao17777f92020-04-23 12:53:11 +100083}
84
85} // namespace ml