Skip to content

Commit 390ee07

Browse files
authoredOct 29, 2024
fix: 新增日志打印输出不同Strategy计算的亲和度值,修复mask和unmask接口可能会由于空指针闪退的问题 (#7)
1 parent 267765b commit 390ee07

File tree

5 files changed

+354
-328
lines changed

5 files changed

+354
-328
lines changed
 

Diff for: ‎harmony/text_input_mask.har

18.2 KB
Binary file not shown.

Diff for: ‎harmony/text_input_mask/src/main/cpp/RNTextInputMask.cpp

+43-21
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#pragma once
12
#include "RNTextInputMask.h"
23
#include "RNOH/arkui/TextInputNode.h"
34
#include "RNOH/ComponentInstance.h"
@@ -49,19 +50,17 @@ void myEventReceiver(ArkUI_NodeEvent *event) {
4950
: std::make_shared<CaretString::CaretGravity>(CaretString::Forward(useAutocomplete));
5051
CaretString text(content, content.length(), caretGravity);
5152
try {
52-
// if (!isDelete) {
53-
auto maskObj = self->pickMask(text, userData->maskOptions, userData->primaryFormat);
54-
auto result = maskObj->apply(text);
55-
std::string resultString = result.formattedText.string;
56-
DLOG(INFO) << "mask result complete: " << result.complete;
57-
userData->lastInputText = resultString;
58-
std::string finalString = isDelete ? content : resultString;
59-
ArkUI_AttributeItem item{.string = finalString.c_str()};
60-
userData->lastInputText = finalString;
61-
maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item));
62-
//}
53+
auto maskObj = self->pickMask(text, userData->maskOptions, userData->primaryFormat);
54+
auto result = maskObj->apply(text);
55+
std::string resultString = result.formattedText.string;
56+
DLOG(INFO) << "mask result complete: " << result.complete;
57+
userData->lastInputText = resultString;
58+
std::string finalString = isDelete ? content : resultString;
59+
ArkUI_AttributeItem item{.string = finalString.c_str()};
60+
userData->lastInputText = finalString;
61+
maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item));
6362
} catch (FormatError e) {
64-
DLOG(ERROR) << " mask complier error " << e.what();
63+
DLOG(ERROR) << " mask compiler error " << e.what();
6564
}
6665
}
6766
// onFocus 事件
@@ -73,11 +72,11 @@ void myEventReceiver(ArkUI_NodeEvent *event) {
7372
CaretString string(text, text.length(),
7473
std::make_shared<CaretString::Forward>(userData->maskOptions.autocomplete.value()));
7574
auto maskObj = self->pickMask(string, userData->maskOptions, userData->primaryFormat);
76-
std::string resultString = maskObj->apply(string).formattedText.string;
75+
std::string resultString = maskObj.get()->apply(string).formattedText.string;
7776
ArkUI_AttributeItem item{.string = resultString.c_str()};
7877
maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item));
7978
} catch (FormatError e) {
80-
DLOG(ERROR) << " mask complier error " << e.what();
79+
DLOG(ERROR) << " mask compiler error " << e.what();
8180
}
8281
}
8382
}
@@ -94,7 +93,9 @@ int calculateAffinity(Mask mask, const CaretString &text, std::string affinityCa
9493
} else {
9594
strategy = AffinityCalculationStrategy::EXTRACTED_VALUE_CAPACITY;
9695
}
97-
return AffinityCalculator::calculateAffinityOfMask(strategy, mask, text);
96+
int affinity = AffinityCalculator::calculateAffinityOfMask(strategy, mask, text);
97+
98+
return affinity;
9899
}
99100
// 获取或创建 Mask
100101
std::shared_ptr<Mask> maskGetOrCreate(const std::string &format, const std::vector<Notation> &customNotations,
@@ -109,8 +110,13 @@ std::shared_ptr<Mask> maskGetOrCreate(const std::string &format, const std::vect
109110
std::shared_ptr<Mask> RNTextInputMask::pickMask(const CaretString &text, MaskOptions maskOptions,
110111
std::string primaryMask) {
111112
// 如果 affineFormats 为空,直接返回 primaryMask
112-
if (maskOptions.affineFormats->size() <= 0)
113-
return maskGetOrCreate(primaryMask, maskOptions.customNotations.value(), maskOptions.rightToLeft.value());
113+
if (maskOptions.affineFormats->size() <= 0) {
114+
auto mask = maskGetOrCreate(primaryMask, maskOptions.customNotations.value(), maskOptions.rightToLeft.value());
115+
int affinity = calculateAffinity(*mask, text, maskOptions.affinityCalculationStrategy.value());
116+
DLOG(INFO) << " ======= pickMask calculateAffinity value: " << affinity
117+
<< "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value();
118+
return mask;
119+
}
114120
// 定义 MaskAffinity 结构体,用于存储 Mask 和相应的亲和度
115121
struct MaskAffinity {
116122
Mask mask; // Mask 对象
@@ -120,7 +126,8 @@ std::shared_ptr<Mask> RNTextInputMask::pickMask(const CaretString &text, MaskOpt
120126

121127
// 计算 primaryMask 的亲和度
122128
int primaryAffinity = calculateAffinity(primaryMask, text, maskOptions.affinityCalculationStrategy.value());
123-
129+
DLOG(INFO) << " ======= pickMask calculateAffinity value: " << primaryAffinity << " \n mask: " << primaryMask
130+
<< "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value();
124131
// 存储所有 mask 和亲和度的列表
125132
std::vector<MaskAffinity> masksAndAffinities;
126133

@@ -129,6 +136,8 @@ std::shared_ptr<Mask> RNTextInputMask::pickMask(const CaretString &text, MaskOpt
129136
std::shared_ptr<Mask> mask =
130137
maskGetOrCreate(format, maskOptions.customNotations.value(), maskOptions.rightToLeft.value());
131138
int affinity = calculateAffinity(*mask, text, maskOptions.affinityCalculationStrategy.value());
139+
DLOG(INFO) << " ======= pickMask calculateAffinity value: " << affinity << "\n affineFormat: " << format
140+
<< "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value();
132141
masksAndAffinities.emplace_back(*mask, affinity);
133142
}
134143

@@ -187,11 +196,13 @@ void RNTextInputMask::setMask(int reactNode, std::string primaryFormat, MaskOpti
187196
NativeNodeApi::getInstance()->addNodeEventReceiver(textInputNode->getArkUINodeHandle(), myEventReceiver);
188197
};
189198
this->m_ctx.taskExecutor->runTask(TaskThread::MAIN, std::move(task));
199+
190200
}
191201
std::string getString(std::string maskValue, std::string value, bool autocomplete, bool isMask) {
192-
Mask maskObj(maskValue);
202+
203+
auto maskObj = Mask::MaskFactory::getOrCreate(maskValue, {});
193204
CaretString text(value, value.length(), std::make_shared<CaretString::Forward>(autocomplete));
194-
auto r = maskObj.apply(text);
205+
auto r = maskObj->apply(text);
195206
std::string result;
196207
if (isMask) {
197208
result = r.formattedText.string;
@@ -208,24 +219,35 @@ static jsi::Value __hostFunction_RNTextInputMask_unmask(jsi::Runtime &rt, react:
208219
return createPromiseAsJSIValue(
209220
rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr<facebook::react::Promise> promise) {
210221
try {
222+
auto start = std::chrono::high_resolution_clock::now();
211223
std::string result = getString(maskValue, value, autocomplete, 0);
212224
promise->resolve(jsi::String::createFromUtf8(rt2, result));
225+
// 获取结束时间点
226+
auto end = std::chrono::high_resolution_clock::now();
227+
// 计算延迟
228+
std::chrono::duration<double, std::milli> latency = end - start;
229+
DLOG(INFO) << "=======unmask 响应时长: " << latency.count() << " 毫秒" << std::endl;
213230
} catch (FormatError e) {
214231
promise->reject(e.what());
215232
}
216233
});
217234
}
218235
static jsi::Value __hostFunction_RNTextInputMask_mask(jsi::Runtime &rt, react::TurboModule &turboModule,
219236
const jsi::Value *args, size_t count) {
220-
221237
std::string maskValue = args[0].getString(rt).utf8(rt);
222238
std::string value = args[1].getString(rt).utf8(rt);
223239
bool autocomplete = args[2].getBool();
224240
return createPromiseAsJSIValue(
225241
rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr<facebook::react::Promise> promise) {
226242
try {
243+
auto start = std::chrono::high_resolution_clock::now();
227244
std::string result = getString(maskValue, value, autocomplete, 1);
228245
promise->resolve(jsi::String::createFromUtf8(rt2, result));
246+
// 获取结束时间点
247+
auto end = std::chrono::high_resolution_clock::now();
248+
// 计算延迟
249+
std::chrono::duration<double, std::milli> latency = end - start;
250+
DLOG(INFO) << "=======mask 响应时长: " << latency.count() << " 毫秒" << std::endl;
229251
} catch (FormatError e) {
230252
promise->reject(e.what());
231253
}

Diff for: ‎harmony/text_input_mask/src/main/cpp/common/Compiler.h

+4
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,17 @@ class Compiler {
105105
}
106106

107107
std::unique_ptr<State> compileWithCustomNotations(char c, const std::string &str) {
108+
DLOG(ERROR) << "====== compileWithCustomNotations customNotations size: " << customNotations.size();
108109
for (const auto &customNotation : customNotations) {
109110
if (customNotation.character == c) {
110111
std::shared_ptr<State> compiledState = compile(str.substr(1), true, false, c);
111112
if (customNotation.isOptional) {
113+
DLOG(ERROR) << "====== compileWithCustomNotations customNotations isOptional :" << customNotation.isOptional;
112114
return std::make_unique<OptionalValueState>(
113115
std::move(compiledState),
114116
std::make_shared<OptionalValueState::Custom>(c, customNotation.characterSet));
115117
} else {
118+
DLOG(ERROR) << "======= compileWithCustomNotations customNotations isOptional :" << customNotation.isOptional;
116119
return std::make_unique<ValueState>(
117120
std::move(compiledState), std::make_shared<ValueState::Custom>(c, customNotation.characterSet));
118121
}
@@ -150,6 +153,7 @@ class Compiler {
150153
if (!lastCharacter.has_value()) {
151154
throw FormatError(); // 处理空字符情况,抛出异常
152155
}
156+
DLOG(INFO) << "======determineTypeWithCustomNotations customNotations size: "<<customNotations.size();
153157
char character = lastCharacter.value();
154158
for (const auto &customNotation : customNotations) {
155159
if (customNotation.character == character) {

Diff for: ‎harmony/text_input_mask/src/main/cpp/common/Mask.h

+307-306
Large diffs are not rendered by default.

Diff for: ‎harmony/text_input_mask/src/main/cpp/common/model/AffinityCalculationStrategy.h

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class AffinityCalculator {
3030
? std::numeric_limits<int>::min()
3131
: extractedValue.length() - mask.totalValueLength();
3232
}
33-
3433
default:
3534
throw std::invalid_argument("Unknown AffinityCalculationStrategy");
3635
}

0 commit comments

Comments
 (0)
Please sign in to comment.