blob: 1b65111ab4d80136156db549beb948ff1a652bb9 [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
10#include "ml/handwriting_proto_mojom_conversion.h"
charleszhao5a7050e2020-07-14 15:21:41 +100011#include "ml/request_metrics.h"
charleszhao17777f92020-04-23 12:53:11 +100012
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)
Charles Zhaoc882eb02020-07-27 10:02:35 +100044 : library_(ml::HandwritingLibrary::GetInstance()),
45 receiver_(this, std::move(receiver)) {
46 DCHECK(library_->GetStatus() == ml::HandwritingLibrary::Status::kOk)
charleszhao17777f92020-04-23 12:53:11 +100047 << "HandwritingRecognizerImpl should be created only if "
48 "HandwritingLibrary is initialized successfully.";
49
Charles Zhaoc882eb02020-07-27 10:02:35 +100050 recognizer_ = library_->CreateHandwritingRecognizer();
charleszhao05c5a4a2020-06-09 16:49:54 +100051
Charles Zhaoc882eb02020-07-27 10:02:35 +100052 successfully_loaded_ =
53 library_->LoadHandwritingRecognizer(recognizer_, std::move(spec));
charleszhao17777f92020-04-23 12:53:11 +100054}
55
56HandwritingRecognizerImpl::~HandwritingRecognizerImpl() {
Charles Zhaoc882eb02020-07-27 10:02:35 +100057 library_->DestroyHandwritingRecognizer(recognizer_);
charleszhao17777f92020-04-23 12:53:11 +100058}
59
60void HandwritingRecognizerImpl::Recognize(HandwritingRecognitionQueryPtr query,
61 RecognizeCallback callback) {
charleszhao5a7050e2020-07-14 15:21:41 +100062 RequestMetrics request_metrics("HandwritingModel", "Recognize");
63 request_metrics.StartRecordingPerformanceMetrics();
64
charleszhao17777f92020-04-23 12:53:11 +100065 chrome_knowledge::HandwritingRecognizerResult result_proto;
charleszhao17777f92020-04-23 12:53:11 +100066
Charles Zhaoc882eb02020-07-27 10:02:35 +100067 if (library_->RecognizeHandwriting(
charleszhao492441e2020-05-26 16:17:07 +100068 recognizer_, HandwritingRecognitionQueryToProto(std::move(query)),
69 &result_proto)) {
70 // Recognition succeeded, run callback on the result.
71 std::move(callback).Run(HandwritingRecognizerResultFromProto(result_proto));
charleszhao5a7050e2020-07-14 15:21:41 +100072 request_metrics.FinishRecordingPerformanceMetrics();
73 request_metrics.RecordRequestEvent(HandwritingRecognizerResult::Status::OK);
charleszhao492441e2020-05-26 16:17:07 +100074 } else {
75 // Recognition failed, run callback on empty result and status = ERROR.
76 std::move(callback).Run(HandwritingRecognizerResult::New(
77 HandwritingRecognizerResult::Status::ERROR,
78 std::vector<HandwritingRecognizerCandidatePtr>()));
charleszhao5a7050e2020-07-14 15:21:41 +100079 request_metrics.RecordRequestEvent(
80 HandwritingRecognizerResult::Status::ERROR);
charleszhao492441e2020-05-26 16:17:07 +100081 }
charleszhao17777f92020-04-23 12:53:11 +100082}
83
84} // namespace ml