diff --git a/app/src/main/java/com/osfans/trime/core/Structs.kt b/app/src/main/java/com/osfans/trime/core/Structs.kt index 240a25258f..f7560baf43 100644 --- a/app/src/main/java/com/osfans/trime/core/Structs.kt +++ b/app/src/main/java/com/osfans/trime/core/Structs.kt @@ -10,6 +10,6 @@ data class SchemaItem( ) data class CandidateItem( - val comment: String, val text: String, + val comment: String = "", ) diff --git a/app/src/main/java/com/osfans/trime/ime/candidates/compact/CompactCandidateModule.kt b/app/src/main/java/com/osfans/trime/ime/candidates/compact/CompactCandidateModule.kt index 59649c1223..75ce9983a3 100644 --- a/app/src/main/java/com/osfans/trime/ime/candidates/compact/CompactCandidateModule.kt +++ b/app/src/main/java/com/osfans/trime/ime/candidates/compact/CompactCandidateModule.kt @@ -109,7 +109,7 @@ class CompactCandidateModule( } override fun onInputContextUpdate(ctx: RimeProto.Context) { - val candidates = ctx.menu.candidates.map { CandidateItem(it.comment ?: "", it.text) } + val candidates = ctx.menu.candidates.map { CandidateItem(it.text, it.comment ?: "") } val isLastPage = ctx.menu.isLastPage val previous = ctx.menu.run { pageSize * pageNumber } val highlightedIdx = ctx.menu.highlightedCandidateIndex diff --git a/app/src/main/jni/librime_jni/helper-types.h b/app/src/main/jni/librime_jni/helper-types.h index 2802c03ff4..ed8724a4e0 100644 --- a/app/src/main/jni/librime_jni/helper-types.h +++ b/app/src/main/jni/librime_jni/helper-types.h @@ -23,3 +23,13 @@ class SchemaItem { return std::move(result); } }; + +class CandidateItem { + public: + std::string text; + std::string comment; + + explicit CandidateItem(const RimeCandidate &candidate) + : text(candidate.text), + comment(candidate.comment ? candidate.comment : "") {} +}; diff --git a/app/src/main/jni/librime_jni/objconv.h b/app/src/main/jni/librime_jni/objconv.h index 8006bd8ff9..0282b58e6d 100644 --- a/app/src/main/jni/librime_jni/objconv.h +++ b/app/src/main/jni/librime_jni/objconv.h @@ -117,4 +117,22 @@ inline std::vector stringArrayToStringVector(JNIEnv *env, return std::move(result); } +inline jobject rimeCandidateItemToJObject(JNIEnv *env, + const CandidateItem &item) { + return env->NewObject(GlobalRef->CandidateItem, GlobalRef->CandidateItemInit, + *JString(env, item.text), *JString(env, item.comment)); +} + +inline jobjectArray rimeCandidateListToJObjectArray( + JNIEnv *env, const std::vector &list) { + jobjectArray array = env->NewObjectArray(static_cast(list.size()), + GlobalRef->CandidateItem, nullptr); + int i = 0; + for (const auto &item : list) { + auto jItem = JRef(env, rimeCandidateItemToJObject(env, item)); + env->SetObjectArrayElement(array, i++, jItem); + } + return array; +} + #endif // TRIME_OBJCONV_H diff --git a/app/src/main/jni/librime_jni/rime_jni.cc b/app/src/main/jni/librime_jni/rime_jni.cc index 6bcadbe2d3..1bce325fa5 100644 --- a/app/src/main/jni/librime_jni/rime_jni.cc +++ b/app/src/main/jni/librime_jni/rime_jni.cc @@ -132,24 +132,16 @@ class Rime { return rime->change_page(session, backward); } - using CandidateItem = std::pair; - using CandidateList = std::vector; - - CandidateList getCandidates(int startIndex, int limit) { - CandidateList result; + std::vector getCandidates(int startIndex, int limit) { + std::vector result; result.reserve(limit); - RimeCandidateListIterator iter{nullptr}; + RimeCandidateListIterator iter{}; if (rime->candidate_list_from_index(session, &iter, startIndex)) { int count = 0; while (rime->candidate_list_next(&iter)) { if (count >= limit) break; - std::string text(iter.candidate.text); - std::string comment; - if (iter.candidate.comment) { - comment = iter.candidate.comment; - } - auto item = std::make_pair(text, comment); - result.emplace_back(std::move(item)); + const CandidateItem item(iter.candidate); + result.emplace_back(item); ++count; } rime->candidate_list_end(&iter); @@ -435,17 +427,6 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_com_osfans_trime_core_Rime_getRimeCandidates(JNIEnv *env, jclass clazz, jint start_index, jint limit) { - auto candidates = Rime::Instance().getCandidates(start_index, limit); - int size = static_cast(candidates.size()); - jobjectArray array = - env->NewObjectArray(size, GlobalRef->CandidateItem, nullptr); - for (int i = 0; i < size; i++) { - auto &candidate = candidates[i]; - auto item = JRef<>(env, env->NewObject(GlobalRef->CandidateItem, - GlobalRef->CandidateItemInit, - *JString(env, candidate.second), - *JString(env, candidate.first))); - env->SetObjectArrayElement(array, i, item); - } - return array; + return rimeCandidateListToJObjectArray( + env, Rime::Instance().getCandidates(start_index, limit)); }