Skip to content

Commit 6e54daa

Browse files
committed
feat: define page_size in perf activity
1 parent d9b4c1f commit 6e54daa

File tree

10 files changed

+208
-17
lines changed

10 files changed

+208
-17
lines changed

app/src/main/java/com/osfans/trime/core/Rime.java

+79
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@
2626
import com.osfans.trime.data.DataManager;
2727
import com.osfans.trime.data.opencc.OpenCCDictManager;
2828
import com.osfans.trime.ime.core.Trime;
29+
import java.io.BufferedReader;
30+
import java.io.CharArrayWriter;
2931
import java.io.File;
32+
import java.io.FileReader;
33+
import java.io.FileWriter;
34+
import java.io.IOException;
3035
import java.util.ArrayList;
3136
import java.util.HashMap;
3237
import java.util.Iterator;
@@ -107,6 +112,7 @@ public int size() {
107112
}
108113

109114
public RimeCandidate[] getCandidates() {
115+
Timber.d("setWindow getCandidates() size()=" + size());
110116
return size() == 0 ? null : menu.candidates;
111117
}
112118
}
@@ -134,14 +140,20 @@ public static class RimeSchema {
134140
List<Map<String, Object>> switches = new ArrayList<Map<String, Object>>();
135141

136142
public RimeSchema(String schema_id) {
143+
Timber.d("RimeSchema() start");
137144
Object o;
138145
o = schema_get_value(schema_id, "schema");
139146
if (o == null || !(o instanceof Map)) return;
147+
Timber.d("RimeSchema() switch");
140148
schema = (Map<String, Object>) o;
141149
o = schema_get_value(schema_id, "switches");
142150
if (o == null || !(o instanceof List)) return;
143151
switches = (List<Map<String, Object>>) o;
144152
check(); // 檢查不在選單中顯示的選項
153+
Timber.d("RimeSchema() menu");
154+
o = schema_get_value(schema_id, "menu");
155+
if (o == null || !(o instanceof HashMap)) return;
156+
Timber.d("RimeSchema() menu.page_size=" + ((Map<Object, Object>) o).get("page_size"));
145157
}
146158

147159
public void check() {
@@ -296,8 +308,11 @@ public Rime(Context context, boolean full_check) {
296308
private static void initSchema() {
297309
mSchemaList = get_schema_list();
298310
String schema_id = getSchemaId();
311+
Timber.d("initSchema() RimeSchema");
299312
mSchema = new RimeSchema(schema_id);
313+
Timber.d("initSchema() getStatus");
300314
getStatus();
315+
Timber.d("initSchema() done");
301316
}
302317

303318
@SuppressWarnings("UnusedReturnValue")
@@ -367,6 +382,7 @@ public static boolean isVoidKeycode(int keycode) {
367382
private static boolean onKey(int keycode, int mask) {
368383
Timber.i("\t<TrimeInput>\tonkey()\tkeycode=%s, mask=%s", keycode, mask);
369384
if (isVoidKeycode(keycode)) return false;
385+
// 此处调用native方法是耗时操作
370386
final boolean b = process_key(keycode, mask);
371387
Timber.i(
372388
"\t<TrimeInput>\tonkey()\tkeycode=%s, mask=%s, process_key result=%s", keycode, mask, b);
@@ -500,11 +516,72 @@ public static String getSchemaName() {
500516
}
501517

502518
private static boolean selectSchema(String schema_id) {
519+
Timber.d("selectSchema() schema_id=" + schema_id);
520+
overWriteSchema(schema_id);
503521
boolean b = select_schema(schema_id);
504522
getContexts();
505523
return b;
506524
}
507525

526+
// 刷新当前输入方案
527+
public static void applySchemaChange() {
528+
String schema_id = getSchemaId();
529+
// 实测直接select_schema(schema_id)方案没有重新载入,切换到不存在的方案,再切回去(会产生1秒的额外耗时).需要找到更好的方法
530+
// 不发生覆盖则不生效
531+
if (overWriteSchema(schema_id)) {
532+
select_schema("nill");
533+
select_schema(schema_id);
534+
}
535+
getContexts();
536+
}
537+
// 临时修改scheme文件参数
538+
// 临时修改build后的scheme可以避免build过程的耗时
539+
// 另外实际上jni读入yaml、修改、导出的效率并不高
540+
private static boolean overWriteSchema(String schema_id) {
541+
Map<String, String> map = new HashMap<>();
542+
String page_size = AppPrefs.defaultInstance().getKeyboard().getCandidatePageSize();
543+
Timber.d("overWriteSchema() page_size=" + page_size);
544+
if (!page_size.equals("0")) {
545+
map.put("page_size", page_size);
546+
}
547+
if (map.isEmpty()) return false;
548+
return overWriteSchema(schema_id, map);
549+
}
550+
551+
private static boolean overWriteSchema(String schema_id, Map<String, String> map) {
552+
if (schema_id == null) schema_id = getSchemaId();
553+
File file =
554+
new File(Rime.get_user_data_dir() + File.separator + "build", schema_id + ".schema.yaml");
555+
try {
556+
FileReader in = new FileReader(file);
557+
BufferedReader bufIn = new BufferedReader(in);
558+
CharArrayWriter tempStream = new CharArrayWriter();
559+
String line = null;
560+
read:
561+
while ((line = bufIn.readLine()) != null) {
562+
for (String k : map.keySet()) {
563+
String key = k + ": ";
564+
if (line.contains(key)) {
565+
String value = ": " + map.get(k) + System.getProperty("line.separator");
566+
tempStream.write(line.replaceFirst(":.+", value));
567+
map.remove(k);
568+
continue read;
569+
}
570+
}
571+
tempStream.write(line);
572+
tempStream.append(System.getProperty("line.separator"));
573+
}
574+
bufIn.close();
575+
FileWriter out = new FileWriter(file);
576+
tempStream.writeTo(out);
577+
out.close();
578+
} catch (IOException e) {
579+
e.printStackTrace();
580+
return false;
581+
}
582+
return map.isEmpty();
583+
}
584+
508585
public static boolean selectSchema(int id) {
509586
int n = mSchemaList.size();
510587
if (id < 0 || id >= n) return false;
@@ -549,9 +626,11 @@ public static void handleRimeNotification(String message_type, String message_va
549626
// Timber.i("message: [%s] %s", message_type, message_value);
550627
Timber.i("Notification: %s", event);
551628
final Trime trime = Trime.getService();
629+
Timber.i("Notification: getService done, before det SchemaEvent");
552630
if (event instanceof RimeEvent.SchemaEvent) {
553631
initSchema();
554632
trime.initKeyboard();
633+
Timber.i("Notification: solve SchemaEvent");
555634
} else if (event instanceof RimeEvent.OptionEvent) {
556635
getStatus();
557636
getContexts(); // 切換中英文、簡繁體時更新候選

app/src/main/java/com/osfans/trime/data/AppPrefs.kt

+4
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class AppPrefs(
170170
const val SWITCHES_ENABLED = "keyboard__show_switches"
171171
const val SWITCH_ARROW_ENABLED = "keyboard__show_switch_arrow"
172172
const val FULLSCREEN_MODE = "keyboard__fullscreen_mode"
173+
const val CANDIDATE_PAGE_SIZE = "keyboard__candidate_page_size"
173174

174175
const val HOOK_FAST_INPUT = "keyboard__hook_fast_input"
175176
const val HOOK_CANDIDATE = "keyboard__hook_candidate"
@@ -219,6 +220,9 @@ class AppPrefs(
219220
var switchArrowEnabled: Boolean = false
220221
get() = prefs.getPref(SWITCH_ARROW_ENABLED, true)
221222
private set
223+
var candidatePageSize: String = "0"
224+
get() = prefs.getPref(CANDIDATE_PAGE_SIZE, "0")
225+
private set
222226

223227
var hookFastInput: Boolean = false
224228
get() = prefs.getPref(HOOK_FAST_INPUT, false)

app/src/main/java/com/osfans/trime/ime/core/Trime.java

+1
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,7 @@ private boolean handleBack(int keyCode) {
914914

915915
public boolean onRimeKey(int[] event) {
916916
updateRimeOption();
917+
// todo 改为异步处理按键事件、刷新UI
917918
final boolean ret = Rime.onKey(event);
918919
activeEditorInstance.commitRimeText();
919920
return ret;

app/src/main/java/com/osfans/trime/ime/text/Composition.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class Composition extends AppCompatTextView {
6464
private int max_entries = Candidate.getMaxCandidateCount();
6565
private boolean candidate_use_cursor, show_comment;
6666
private int highlightIndex;
67-
private List<Map<String, Object>> components;
67+
private List<Map<String, Object>> windows_comps;
6868
private SpannableStringBuilder ss;
6969
private final int span = 0;
7070
private String movable;
@@ -212,7 +212,7 @@ public void setShowComment(boolean value) {
212212

213213
public void reset(Context context) {
214214
final Config config = Config.get(context);
215-
components = (List<Map<String, Object>>) config.getValue("window");
215+
windows_comps = (List<Map<String, Object>>) config.getValue("window");
216216
if (config.hasKey("layout/max_entries")) max_entries = config.getInt("layout/max_entries");
217217
candidate_use_cursor = config.getBoolean("candidate_use_cursor");
218218
text_size = config.getPixel("text_size");
@@ -331,9 +331,11 @@ private void appendComposition(Map<String, ?> m) {
331331
* @return j
332332
*/
333333
private int calcStartNum(int min_length, int min_check) {
334+
Timber.d("setWindow calcStartNum() getCandidates");
334335
final Rime.RimeCandidate[] candidates = Rime.getCandidates();
335336
if (candidates == null) return 0;
336337

338+
Timber.d("setWindow calcStartNum() getCandidates finish, size=" + candidates.length);
337339
int j = min_check > max_entries ? (max_entries - 1) : (min_check - 1);
338340
if (j >= candidates.length) j = candidates.length - 1;
339341
for (; j >= 0; j--) {
@@ -512,14 +514,24 @@ private void appendMove(Map<?, ?> m) {
512514

513515
public int setWindow(int length, int min_check) {
514516
if (getVisibility() != View.VISIBLE) return 0;
517+
StackTraceElement[] stacks = new Throwable().getStackTrace();
518+
Timber.d(
519+
"setWindow Rime.getComposition()"
520+
+ ", [1]"
521+
+ stacks[1].toString()
522+
+ ", [2]"
523+
+ stacks[2].toString()
524+
+ ", [3]"
525+
+ stacks[3].toString());
515526
Rime.RimeComposition r = Rime.getComposition();
516527
if (r == null) return 0;
517528
String s = r.getText();
518529
if (TextUtils.isEmpty(s)) return 0;
519530
setSingleLine(true); // 設置單行
520531
ss = new SpannableStringBuilder();
521532
int start_num = 0;
522-
for (Map<String, ?> m : components) {
533+
534+
for (Map<String, ?> m : windows_comps) {
523535
if (m.containsKey("composition")) appendComposition(m);
524536
else if (m.containsKey("candidate")) {
525537
start_num = calcStartNum(length, min_check);

app/src/main/java/com/osfans/trime/settings/fragments/KeyboardFragment.kt

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ class KeyboardFragment :
4545
"keyboard__show_switches" -> {
4646
Rime.setShowSwitches(prefs.keyboard.switchesEnabled)
4747
}
48+
"keyboard__candidate_page_size" -> {
49+
Rime.applySchemaChange()
50+
}
4851
}
4952
}
5053
override fun onPreferenceTreeClick(preference: Preference?): Boolean {

app/src/main/res/values-zh-rCN/strings.xml

+23-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<string name="keyboard__key_repeat_interval_title">重复按键的重复间隔</string>
6666
<string name="keyboard__show_switches_title">在候选栏中显示状态</string>
6767
<string name="keyboard__show_key_popup_title">按键时弹出显示字符</string>
68-
<string name="keyboard__show_window_title">显示悬浮窗口</string>
68+
<string name="keyboard__show_window_title">显示悬浮窗</string>
6969
<string name="keyboard__inline_preedit_title">嵌入式编辑模式</string>
7070
<string-array name="keyboard__inline_entries">
7171
<item>首选</item>
@@ -78,7 +78,7 @@
7878
<item name="light">亮色</item>
7979
<item name="dark">暗色</item>
8080
</string-array>
81-
<string name="keyboard__soft_cursor_title">编码区使用插入符号(^)</string>
81+
<string name="keyboard__soft_cursor_title">悬浮窗编码区使用插入符号(^)</string>
8282
<string name="pref_deploy">部署</string>
8383
<string name="pref_deploy_summary">修改设置后需要再次部署同文输入法平台</string>
8484
<string name="conf__synchronize_title">同步</string>
@@ -129,7 +129,7 @@
129129
<item name="1000">1000</item>
130130
<item name="-1">全部</item>
131131
</string-array>
132-
<string name="keyboard__show_switche_arrow_title">在候选栏中显示状态时带箭头符号</string>
132+
<string name="keyboard__show_switche_arrow_title">候选栏上的开关显示箭头符号(→)</string>
133133
<string name="keyboard__fullscreen_mode_title">横屏时全屏编辑</string>
134134
<string name="deploy_finish">部署完成</string>
135135
<string-array name="keyboard__fullscreen_mode_entries">
@@ -198,4 +198,24 @@
198198
<string name="keyboard__key_swipe_velocity_hi">连续击键时触发滑动手势的速度</string>
199199
<string name="about__buildinfo">编译信息</string>
200200
<string name="pref_trime_custom_qq">修改版QQ群</string>
201+
<string name="keyboard__use_mini_keyboard_title">连接实体键盘时,显示迷你软键盘</string>
202+
<string name="pref_keyboard__candidate">候选栏</string>
203+
<string name="keyboard__candidate_page_size">每页显示候选词数量</string>
204+
<string-array name="keyboard__candidate_page_size_entries" >
205+
<item name="10000">自动填满候选栏</item>
206+
<item name="0">由方案指定(需删除build目录中的方案并重新部署)</item>
207+
<item name="5">5</item>
208+
<item name="6">6</item>
209+
<item name="7">7</item>
210+
<item name="8">8</item>
211+
<item name="9">9</item>
212+
<item name="10">10</item>
213+
<item name="11">11</item>
214+
<item name="12">12</item>
215+
<item name="15">15</item>
216+
<item name="20">20</item>
217+
<item name="30">30</item>
218+
<item name="50">50</item>
219+
<item name="100">100</item>
220+
</string-array>
201221
</resources>

app/src/main/res/values-zh-rTW/strings.xml

+23-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
<string name="keyboard__key_repeat_interval_title">重複按鍵的重複間隔</string>
6767
<string name="keyboard__show_switches_title">在候選欄中顯示狀態</string>
6868
<string name="keyboard__show_key_popup_title">按鍵時彈出顯示字符</string>
69-
<string name="keyboard__show_window_title">顯示懸浮窗口</string>
69+
<string name="keyboard__show_window_title">顯示懸浮窗</string>
7070
<string name="keyboard__inline_preedit_title">嵌入式編輯模式</string>
7171
<string-array name="keyboard__inline_entries">
7272
<item>首選</item>
@@ -79,7 +79,7 @@
7979
<item name="light">亮色</item>
8080
<item name="dark">暗色</item>
8181
</string-array>
82-
<string name="keyboard__soft_cursor_title">編碼區使用插入符號(^)</string>
82+
<string name="keyboard__soft_cursor_title">懸浮窗編碼區使用插入符號(^)</string>
8383
<string name="pref_deploy">部署</string>
8484
<string name="pref_deploy_summary">修改設定後需要再次部署同文輸入法平臺</string>
8585
<string name="conf__synchronize_title">同步</string>
@@ -130,7 +130,7 @@
130130
<item name="1000">1000</item>
131131
<item name="-1">全部</item>
132132
</string-array>
133-
<string name="keyboard__show_switche_arrow_title">在候選欄中顯示狀態時帶箭頭符號</string>
133+
<string name="keyboard__show_switche_arrow_title">候選欄上的開關顯示箭頭符號(→)</string>
134134
<string name="keyboard__fullscreen_mode_title">橫屏時全屏編輯</string>
135135
<string name="deploy_finish">部署完成</string>
136136
<string-array name="keyboard__fullscreen_mode_entries">
@@ -199,4 +199,24 @@
199199
<string name="keyboard__key_swipe_velocity_hi">連續擊鍵時觸發滑動手勢的速度</string>
200200
<string name="about__buildinfo">編譯信息</string>
201201
<string name="pref_trime_custom_qq">修改版QQ羣</string>
202+
<string name="keyboard__use_mini_keyboard_title">連接實體鍵盤時,顯示迷你軟鍵盤</string>
203+
<string name="pref_keyboard__candidate">候選欄</string>
204+
<string name="keyboard__candidate_page_size">每頁顯示候選詞數量</string>
205+
<string-array name="keyboard__candidate_page_size_entries" >
206+
<item name="10000">自動填滿候選欄</item>
207+
<item name="0">由方案指定(需刪除build目錄中的方案並重新部署)</item>
208+
<item name="5">5</item>
209+
<item name="6">6</item>
210+
<item name="7">7</item>
211+
<item name="8">8</item>
212+
<item name="9">9</item>
213+
<item name="10">10</item>
214+
<item name="11">11</item>
215+
<item name="12">12</item>
216+
<item name="15">15</item>
217+
<item name="20">20</item>
218+
<item name="30">30</item>
219+
<item name="50">50</item>
220+
<item name="100">100</item>
221+
</string-array>
202222
</resources>

app/src/main/res/values/donottranslate.xml

+17
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,21 @@
5151
</string-array>
5252
<string name="default_shared_data_dir" translatable="false">/sdcard/rime</string>
5353
<string name="conf__default_user_data_dir" translatable="false">/sdcard/rime</string>
54+
<string-array name="keyboard__candidate_page_size_values">
55+
<item>10000</item>
56+
<item>0</item>
57+
<item>5</item>
58+
<item>6</item>
59+
<item>7</item>
60+
<item>8</item>
61+
<item>9</item>
62+
<item>10</item>
63+
<item>11</item>
64+
<item>12</item>
65+
<item>15</item>
66+
<item>20</item>
67+
<item>30</item>
68+
<item>50</item>
69+
<item>100</item>
70+
</string-array>
5471
</resources>

app/src/main/res/values/strings.xml

+21-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
<item name="1000">1000</item>
131131
<item name="-1">All</item>
132132
</string-array>
133-
<string name="keyboard__show_switche_arrow_title">Show arrow for candidate switch</string>
133+
<string name="keyboard__show_switche_arrow_title">Show arrow for candidate switch (→)</string>
134134
<string name="keyboard__fullscreen_mode_title">Landscape fullscreen input</string>
135135
<string name="deploy_finish">Deploy finish</string>
136136
<string-array name="keyboard__fullscreen_mode_entries">
@@ -202,4 +202,24 @@
202202
<string name="pref_trime_custom_qq">Custom QQ Group</string>
203203
<string name="pref_trime_custom_qq_summary" translatable="false"> </string>
204204
<string name="pref_trime_custom_qq_data" translatable="false"> </string>
205+
<string name="keyboard__use_mini_keyboard_title">Show mini keyboard when real keyboard linked</string>
206+
<string name="pref_keyboard__candidate">Candidate</string>
207+
<string name="keyboard__candidate_page_size">Candidate item count for each page</string>
208+
<string-array name="keyboard__candidate_page_size_entries" >
209+
<item name="10000">Fill candidate</item>
210+
<item name="0">Scheme define (Need delete scheme in build path and depoly)</item>
211+
<item name="5">5</item>
212+
<item name="6">6</item>
213+
<item name="7">7</item>
214+
<item name="8">8</item>
215+
<item name="9">9</item>
216+
<item name="10">10</item>
217+
<item name="11">11</item>
218+
<item name="12">12</item>
219+
<item name="15">15</item>
220+
<item name="20">20</item>
221+
<item name="30">30</item>
222+
<item name="50">50</item>
223+
<item name="100">100</item>
224+
</string-array>
205225
</resources>

0 commit comments

Comments
 (0)