Commit MetaInfo

Revisionf3e8c9f56aa83aa139edf63833feb8b789eaee81 (tree)
Zeit2020-07-01 08:50:03
AutorAng Iongchun <ang@iong...>
CommiterAng Iongchun

Log Message

flow: Merged <release> '1.6.0' to <master> ('default').

Ändern Zusammenfassung

Diff

diff -r 011141c2d5f6 -r f3e8c9f56aa8 .idea/gradle.xml
--- a/.idea/gradle.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/.idea/gradle.xml Wed Jul 01 07:50:03 2020 +0800
@@ -3,9 +3,8 @@
33 <component name="GradleSettings">
44 <option name="linkedExternalProjectsSettings">
55 <GradleProjectSettings>
6- <compositeConfiguration>
7- <compositeBuild compositeDefinitionSource="SCRIPT" />
8- </compositeConfiguration>
6+ <option name="delegatedBuild" value="false" />
7+ <option name="testRunner" value="PLATFORM" />
98 <option name="distributionType" value="DEFAULT_WRAPPED" />
109 <option name="externalProjectPath" value="$PROJECT_DIR$" />
1110 <option name="modules">
@@ -18,4 +17,4 @@
1817 </GradleProjectSettings>
1918 </option>
2019 </component>
21-</project>
\ No newline at end of file
20+</project>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 .idea/misc.xml
--- a/.idea/misc.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/.idea/misc.xml Wed Jul 01 07:50:03 2020 +0800
@@ -5,32 +5,36 @@
55 <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
66 <option name="myNullables">
77 <value>
8- <list size="10">
8+ <list size="12">
99 <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
1010 <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
1111 <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
1212 <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
1313 <item index="4" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
1414 <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
15- <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
16- <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
17- <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
18- <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
15+ <item index="6" class="java.lang.String" itemvalue="android.annotation.Nullable" />
16+ <item index="7" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
17+ <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
18+ <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
19+ <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
20+ <item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
1921 </list>
2022 </value>
2123 </option>
2224 <option name="myNotNulls">
2325 <value>
24- <list size="9">
26+ <list size="11">
2527 <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
2628 <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
2729 <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
2830 <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
2931 <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
30- <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
31- <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
32- <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
33- <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
32+ <item index="5" class="java.lang.String" itemvalue="android.annotation.NonNull" />
33+ <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
34+ <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
35+ <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
36+ <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
37+ <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
3438 </list>
3539 </value>
3640 </option>
@@ -56,4 +60,4 @@
5660 </state>
5761 </states>
5862 </component>
59-</project>
\ No newline at end of file
63+</project>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 .idea/modules.xml
--- a/.idea/modules.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/.idea/modules.xml Wed Jul 01 07:50:03 2020 +0800
@@ -2,8 +2,8 @@
22 <project version="4">
33 <component name="ProjectModuleManager">
44 <modules>
5- <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
6- <module fileurl="file://$PROJECT_DIR$/simsik-khipoo.iml" filepath="$PROJECT_DIR$/simsik-khipoo.iml" />
5+ <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" group="simsik-khipoo/app" />
6+ <module fileurl="file://$PROJECT_DIR$/simsik-khipoo.iml" filepath="$PROJECT_DIR$/simsik-khipoo.iml" group="simsik-khipoo" />
77 </modules>
88 </component>
99 </project>
\ No newline at end of file
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/build.gradle
--- a/app/build.gradle Sat Aug 24 21:38:33 2019 +0800
+++ b/app/build.gradle Wed Jul 01 07:50:03 2020 +0800
@@ -10,15 +10,15 @@
1010 }
1111
1212 android {
13- compileSdkVersion 28
14- buildToolsVersion '28.0.3'
13+ compileSdkVersion 29
14+ buildToolsVersion '29.0.2'
1515 defaultConfig {
1616 applicationId "tw.iongchun.taigikbd"
1717 minSdkVersion 14
18- targetSdkVersion 28
19- versionCode 30
20- versionName "1.5.6"
21- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
18+ targetSdkVersion 29
19+ versionCode 35
20+ versionName "1.6.0"
21+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
2222 vectorDrawables.useSupportLibrary = true
2323 }
2424 signingConfigs {
@@ -40,20 +40,20 @@
4040
4141 dependencies {
4242 api fileTree(include: ['*.jar'], dir: 'libs')
43- androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
43+ androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0', {
4444 exclude group: 'com.android.support', module: 'support-annotations'
4545 })
46- api 'com.android.support:appcompat-v7:28.0.0'
47- api 'com.android.support:support-v4:28.0.0'
48- api 'com.android.support:support-vector-drawable:28.0.0'
49- implementation 'com.android.support:design:28.0.0'
50- implementation 'com.android.support.constraint:constraint-layout:1.1.2'
51- api 'org.pcollections:pcollections:2.1.2'
46+ api 'androidx.appcompat:appcompat:1.1.0'
47+ api 'androidx.legacy:legacy-support-v4:1.0.0'
48+ api 'androidx.vectordrawable:vectordrawable:1.1.0'
49+ implementation 'com.google.android.material:material:1.1.0'
50+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
51+ api 'org.pcollections:pcollections:3.1.3'
5252 api 'net.sf.supercsv:super-csv:2.4.0'
53- testImplementation 'junit:junit:4.12'
54- testImplementation 'org.mockito:mockito-core:2.8.47'
53+ testImplementation 'junit:junit:4.13'
54+ testImplementation 'org.mockito:mockito-core:2.28.2'
5555 // AndroidJUnitRunner and JUnit Rules
56- androidTestImplementation 'com.android.support.test:runner:1.0.2'
57- androidTestImplementation 'com.android.support.test:rules:1.0.2'
56+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
57+ androidTestImplementation 'androidx.test:rules:1.2.0'
5858 androidTestImplementation 'org.mockito:mockito-android:2.28.2'
5959 }
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/AutoCorrectionTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/AutoCorrectionTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/AutoCorrectionTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/AutoDashTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/AutoDashTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/AutoDashTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnDeleteTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnDeleteTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnDeleteTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnInputTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnInputTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnInputTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnSelectionTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnSelectionTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/ComposingOnSelectionTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/ExampleInstrumentedTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/ExampleInstrumentedTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/ExampleInstrumentedTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -19,8 +19,8 @@
1919 package tw.iongchun.taigikbd;
2020
2121 import android.content.Context;
22-import android.support.test.InstrumentationRegistry;
23-import android.support.test.runner.AndroidJUnit4;
22+import androidx.test.platform.app.InstrumentationRegistry;
23+import androidx.test.ext.junit.runners.AndroidJUnit4;
2424
2525 import org.junit.Test;
2626 import org.junit.runner.RunWith;
@@ -37,7 +37,7 @@
3737 @Test
3838 public void useAppContext() throws Exception {
3939 // Context of the app under test.
40- Context appContext = InstrumentationRegistry.getTargetContext();
40+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
4141
4242 String myPackage = "tw.iongchun.taigikbd";
4343 assertEquals(myPackage, appContext.getPackageName().substring(0, myPackage.length()));
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/InputMethodSwitchTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/InputMethodSwitchTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/InputMethodSwitchTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/PhoneticInputTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/PhoneticInputTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/PhoneticInputTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,7 +21,7 @@
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
2323 import android.content.res.Resources;
24-import android.support.test.runner.AndroidJUnit4;
24+import androidx.test.ext.junit.runners.AndroidJUnit4;
2525 import android.text.InputType;
2626 import android.view.inputmethod.EditorInfo;
2727 import android.view.inputmethod.InputConnection;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/PreferenceTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/PreferenceTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/PreferenceTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -19,8 +19,8 @@
1919 package tw.iongchun.taigikbd;
2020
2121 import android.content.SharedPreferences;
22-import android.support.annotation.Nullable;
23-import android.support.test.runner.AndroidJUnit4;
22+import androidx.annotation.Nullable;
23+import androidx.test.ext.junit.runners.AndroidJUnit4;
2424
2525 import org.junit.Before;
2626 import org.junit.Test;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/androidTest/java/tw/iongchun/taigikbd/SimpleAndroidStateTest.java
--- a/app/src/androidTest/java/tw/iongchun/taigikbd/SimpleAndroidStateTest.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/androidTest/java/tw/iongchun/taigikbd/SimpleAndroidStateTest.java Wed Jul 01 07:50:03 2020 +0800
@@ -20,7 +20,7 @@
2020
2121 import android.content.Context;
2222 import android.content.SharedPreferences;
23-import android.support.test.runner.AndroidJUnit4;
23+import androidx.test.ext.junit.runners.AndroidJUnit4;
2424
2525 import org.junit.Before;
2626 import org.junit.Test;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKBackgroundService.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKBackgroundService.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKBackgroundService.java Wed Jul 01 07:50:03 2020 +0800
@@ -25,8 +25,8 @@
2525 import android.content.Intent;
2626 import android.database.Cursor;
2727 import android.database.sqlite.SQLiteDatabase;
28-import android.support.v4.app.NotificationCompat;
29-import android.support.v4.content.LocalBroadcastManager;
28+import androidx.core.app.NotificationCompat;
29+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
3030
3131 import org.supercsv.io.CsvListReader;
3232 import org.supercsv.prefs.CsvPreference;
@@ -39,7 +39,7 @@
3939 import java.util.StringTokenizer;
4040 import java.util.concurrent.atomic.AtomicBoolean;
4141
42-import static android.support.v4.app.NotificationCompat.PRIORITY_MIN;
42+import static androidx.core.app.NotificationCompat.PRIORITY_MIN;
4343
4444 /**
4545 * Created by iongchun on 9/21/17.
@@ -240,7 +240,8 @@
240240 String phrases = data.get(3);
241241 if (phrases == null)
242242 continue;
243- updatePhrases(phraseId, phrases, stats);
243+ String hans = data.get(2);
244+ updatePhrases(phraseId, phrases, hans, stats);
244245
245246 if (alt == null) {
246247 while (true) {
@@ -252,14 +253,14 @@
252253 continue;
253254 if (altPhraseId == phraseId) {
254255 phrases = alt.get(2);
255- updatePhrases(phraseId, phrases, stats);
256+ updatePhrases(phraseId, phrases, hans, stats);
256257 alt = null;
257258 }
258259 break;
259260 }
260261 } else if (altPhraseId == phraseId) {
261262 phrases = alt.get(2);
262- updatePhrases(phraseId, phrases, stats);
263+ updatePhrases(phraseId, phrases, hans, stats);
263264 alt = null;
264265 }
265266 cntWords = curWords + stats[1] + stats[2];
@@ -271,6 +272,8 @@
271272 notifBuilder.setContentText(getResources().getString(R.string.dict_db_cancel));
272273 return;
273274 }
275+ migrateTable("words");
276+ migrateTable("words_poj");
274277 notifBuilder.setContentText(getResources().getString(R.string.dict_db_done));
275278 } catch (IOException ex) {
276279 log("read phrases error: ", ex);
@@ -311,7 +314,7 @@
311314 broadcastDatabaseReady();
312315 }
313316
314- private void updatePhrases(int phraseId, String phrases, int[] stats) {
317+ private void updatePhrases(int phraseId, String phrases, String hans, int[] stats) {
315318 try {
316319 //log("phrase: ", phrase);
317320 phrases = phrases.trim();
@@ -321,39 +324,77 @@
321324 for (String alt : alts) {
322325 //log(" alt: ", alt);
323326 stats[0]++;
324- updatePhrase(phraseId, alt.trim(), stats);
327+ updatePhrase(phraseId, alt.trim(), hans, stats);
325328 }
329+ } else if (phrases.indexOf('(') >= 0) {
330+ String[] alts = phrases.split("[()]");
331+ for (String alt : alts) {
332+ stats[0]++;
333+ updatePhrase(phraseId, alt.trim(), hans, stats);
334+ }
326335 } else {
327336 stats[0]++;
328- updatePhrase(phraseId, phrases, stats);
337+ updatePhrase(phraseId, phrases, hans, stats);
329338 }
330339 } catch (Exception ex) {
331340 log("process phrase error (", ex, "): ", phrases);
332341 }
333342 }
334343
335- private void updatePhrase(int phraseId, String phrase, int[] stats) {
336- String[] words = phrase.split("[\\s,.]+");
337- for (String word : words) {
338- word = word.toLowerCase(Locale.ROOT);
339- if (updateWord(phraseId, word, false))
344+ private void updatePhrase(int phraseId, String phrase, String han, int[] stats) {
345+ if (phrase.startsWith("--"))
346+ phrase = phrase.substring(2);
347+
348+ int sep = han.indexOf("、");
349+ if (sep >= 0)
350+ han = han.substring(0, sep);
351+ String hanChars = "";
352+ for (String str : han.split("[,;。?—]+"))
353+ hanChars += str;
354+ int hanLen = hanChars.length();
355+
356+ String[] words = phrase.split("[\\s,.—]+");
357+ for (int i = 0; i < words.length; i++) {
358+ String word = words[i].toLowerCase(Locale.ROOT);
359+
360+ String[] syls = word.split("[\\s,.—-]+");
361+ String hanWord = null;
362+ if (hanLen > 0) {
363+ if (syls.length > hanLen || i == words.length - 1) {
364+ hanWord = hanChars;
365+ hanChars = "";
366+ hanLen = 0;
367+ } else {
368+ hanWord = hanChars.substring(0, syls.length);
369+ hanChars = hanChars.substring(syls.length);
370+ hanLen -= syls.length;
371+ }
372+ } else {
373+ String syl = syls[0];
374+ for (int j = 1; j < syls.length; j++)
375+ syl = syl + ',' + syls[j];
376+ log("syls=", syl, "(", syls.length, ") han=", hanChars, "(", hanLen, ")");
377+ }
378+
379+ if (updateWord(phraseId, word, hanWord, false))
340380 stats[1]++;
341381 String wordPoj = wordTailoToPoj(word);
342382 /*
343383 if (!wordPoj.equals(word))
344384 log("tailo: ", word, ", poj: ", wordPoj);
345385 */
346- if (updateWord(phraseId, wordPoj, true))
386+ if (updateWord(phraseId, wordPoj, hanWord, true))
347387 stats[2]++;
348388 }
349389 }
350390
351- private boolean updateWord(int phraseId, String word, boolean poj) {
391+ private boolean updateWord(int phraseId, String word, String han, boolean poj) {
352392 ContentValues values = new ContentValues();
353393 String toneless = new String(TKComposingUtils.removeTone(word));
354394 values.put("word", word);
355395 values.put("toneless", toneless);
356396 values.put("phrase_id", phraseId);
397+ values.put("han", han);
357398 values.put("weight", 1.0d);
358399 long id = db.insertWithOnConflict(poj ? "words_poj" : "words", null, values, SQLiteDatabase.CONFLICT_IGNORE);
359400 return id != -1L;
@@ -371,6 +412,15 @@
371412 db.update("words", values, "word=?", args);
372413 }
373414 c.close();
415+ // for TL Han
416+ c = db.rawQuery("select weight from words where han=?", args);
417+ if (c.moveToNext()) {
418+ double weight = c.getDouble(0);
419+ ContentValues values = new ContentValues();
420+ values.put("weight", Math.sqrt(weight + 1.0d));
421+ db.update("words", values, "han=?", args);
422+ }
423+ c.close();
374424 // for POJ
375425 c = db.rawQuery("select weight from words_poj where word=?", args);
376426 if (c.moveToNext()) {
@@ -380,5 +430,32 @@
380430 db.update("words_poj", values, "word=?", args);
381431 }
382432 c.close();
433+ // for POJ Han
434+ c = db.rawQuery("select weight from words_poj where han=?", args);
435+ if (c.moveToNext()) {
436+ double weight = c.getDouble(0);
437+ ContentValues values = new ContentValues();
438+ values.put("weight", Math.sqrt(weight + 1.0d));
439+ db.update("words_poj", values, "han=?", args);
440+ }
441+ }
442+
443+ private void migrateTable(String name) {
444+ String nameOrg = name + "_org";
445+ if (!TKDatabase.checkTableExist(db, nameOrg))
446+ return;
447+ // migrate weights
448+ String index = "idx_" + nameOrg + "_with_weight";
449+ db.execSQL("drop index if exists " + index);
450+ db.execSQL("create index " + index + " on " + nameOrg + " (weight)");
451+ Cursor c = db.rawQuery("select word, weight from " + nameOrg + " where weight > 1", new String[] {});
452+ while (c.moveToNext()) {
453+ String word = c.getString(0);
454+ double weight = c.getDouble(1);
455+ ContentValues values = new ContentValues();
456+ values.put("weight", weight);
457+ db.update(name, values, "word=?", new String[] {word});
458+ }
459+ db.execSQL("drop table " + nameOrg);
383460 }
384461 }
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKDatabase.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKDatabase.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKDatabase.java Wed Jul 01 07:50:03 2020 +0800
@@ -19,6 +19,7 @@
1919 package tw.iongchun.taigikbd;
2020
2121 import android.content.Context;
22+import android.database.Cursor;
2223 import android.database.sqlite.SQLiteDatabase;
2324 import android.database.sqlite.SQLiteOpenHelper;
2425
@@ -28,7 +29,7 @@
2829
2930 public class TKDatabase extends SQLiteOpenHelper {
3031 public static final String DATABASE_NAME = "taigikbd.db";
31- public static final int DATABASE_VERSION = 1;
32+ public static final int DATABASE_VERSION = 2;
3233
3334 public TKDatabase(Context context) {
3435 super(context, DATABASE_NAME, null, DATABASE_VERSION);
@@ -43,6 +44,25 @@
4344
4445 @Override
4546 public void onCreate(SQLiteDatabase db) {
47+ createVersion2(db);
48+ }
49+
50+ private void createVersion2(SQLiteDatabase db) {
51+ // words
52+ db.execSQL("create table words (word text primary key, toneless text, phrase_id int, han text, weight real)");
53+ db.execSQL("create index idx_words_with_weight on words (word, weight)");
54+ db.execSQL("create index idx_words_toneless_weight on words (toneless, weight)");
55+ db.execSQL("create index idx_words_phrase_id on words (phrase_id)");
56+ db.execSQL("create index idx_words_han on words (han)");
57+ // words_poj
58+ db.execSQL("create table words_poj (word text primary key, toneless text, phrase_id int, han text, weight real)");
59+ db.execSQL("create index idx_words_poj_with_weight on words_poj (word, weight)");
60+ db.execSQL("create index idx_words_poj_toneless_weight on words_poj (toneless, weight)");
61+ db.execSQL("create index idx_words_poj_phrase_id on words_poj (phrase_id)");
62+ db.execSQL("create index idx_words_poj_han on words_poj (han)");
63+ }
64+
65+ private void createVersion1(SQLiteDatabase db) {
4666 // words
4767 db.execSQL("create table words (word text primary key, toneless text, phrase_id int, weight real)");
4868 db.execSQL("create index idx_words_with_weight on words (word, weight)");
@@ -55,14 +75,56 @@
5575 db.execSQL("create index idx_words_poj_phrase_id on words_poj (phrase_id)");
5676 }
5777
78+ static boolean checkTableExist(SQLiteDatabase db, String name) {
79+ Cursor c = db.rawQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", new String[] {name});
80+ c.moveToNext();
81+ int count = c.getInt(0);
82+ boolean exists = count > 0;
83+ c.close();
84+ return exists;
85+ }
86+
87+ private void backupTable(SQLiteDatabase db, String name) {
88+ if (checkTableExist(db, name)) {
89+ String nameOrg = name + "_org";
90+ db.execSQL("drop table if exists " + nameOrg);
91+ db.execSQL("alter table " + name + " rename to " + nameOrg);
92+ db.execSQL("drop index if exists idx_" + name + "_with_weight");
93+ db.execSQL("drop index if exists idx_" + name + "_toneless_weight");
94+ db.execSQL("drop index if exists idx_" + name + "_phrase_id");
95+ }
96+ }
97+
5898 @Override
5999 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
60-
100+ if (newVersion > oldVersion) {
101+ backupTable(db, "words");
102+ backupTable(db, "words_poj");
103+ }
104+ switch (newVersion) {
105+ case 1:
106+ createVersion1(db);
107+ break;
108+ case 2:
109+ createVersion2(db);
110+ break;
111+ }
61112 }
62113
63114 @Override
64115 public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
65- super.onDowngrade(db, oldVersion, newVersion);
116+ if (newVersion < oldVersion) {
117+ backupTable(db, "words");
118+ backupTable(db, "words_poj");
119+ }
120+ switch (newVersion) {
121+ case 1:
122+ createVersion1(db);
123+ break;
124+ case 2:
125+ createVersion2(db);
126+ break;
127+ }
66128 }
67129
68130 @Override
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKHintActivity.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKHintActivity.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKHintActivity.java Wed Jul 01 07:50:03 2020 +0800
@@ -20,7 +20,7 @@
2020
2121 import android.content.Context;
2222 import android.os.Bundle;
23-import android.support.v7.app.AppCompatActivity;
23+import androidx.appcompat.app.AppCompatActivity;
2424
2525 public class TKHintActivity extends AppCompatActivity {
2626 @Override
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKInputMethodService.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKInputMethodService.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKInputMethodService.java Wed Jul 01 07:50:03 2020 +0800
@@ -33,9 +33,9 @@
3333 import android.inputmethodservice.KeyboardView;
3434 import android.os.Build;
3535 import android.preference.PreferenceManager;
36-import android.support.graphics.drawable.VectorDrawableCompat;
37-import android.support.v4.content.LocalBroadcastManager;
38-import android.support.v4.graphics.drawable.DrawableCompat;
36+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
37+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
38+import androidx.core.graphics.drawable.DrawableCompat;
3939 import android.text.InputType;
4040 import android.util.StringBuilderPrinter;
4141 import android.view.KeyEvent;
@@ -99,6 +99,7 @@
9999 import static tw.iongchun.taigikbd.TKInputState.DeleteAfterCluster;
100100 import static tw.iongchun.taigikbd.TKInputState.DeleteLeadingsMode;
101101 import static tw.iongchun.taigikbd.TKInputState.DeleteVowelsMode;
102+import static tw.iongchun.taigikbd.TKInputState.DictHanji;
102103 import static tw.iongchun.taigikbd.TKInputState.DictSuggest;
103104 import static tw.iongchun.taigikbd.TKInputState.Glotal;
104105 import static tw.iongchun.taigikbd.TKInputState.GlotalReplaceGlotal;
@@ -119,6 +120,24 @@
119120 import static tw.iongchun.taigikbd.TKInputState.ToneMarkStyle;
120121 import static tw.iongchun.taigikbd.TKInputState.VoicelessToggle;
121122 import static tw.iongchun.taigikbd.TKInputState.Vowels;
123+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_ASPIRATION_TOGGLE;
124+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_AUTO_DASH;
125+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DEL_AFTER_CLUSTER;
126+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DEL_LEADINGS;
127+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DEL_MULTICHAR_VOWEL;
128+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DEL_VOWELS;
129+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DEL_VOWEL_CLUSTER;
130+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DICT_HANJI;
131+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_DICT_SUGGEST;
132+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_GLOTAL_REPLACE;
133+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_GLOTAL_TOGGLE;
134+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_IM_SWITCH;
135+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_KEYBOARD_THEME;
136+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_LEAD_REPLACE_LEAD;
137+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_PHONETIC_INPUT;
138+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_POJ_TONE_MARK;
139+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_TONE_MARK_STYLE;
140+import static tw.iongchun.taigikbd.TKSettingsActivity.PREF_VOICELESS_TOGGLE;
122141 import static tw.iongchun.taigikbd.TKViewState.ActionID;
123142 import static tw.iongchun.taigikbd.TKViewState.ActionKeyIconID;
124143 import static tw.iongchun.taigikbd.TKViewState.ActionKeyIconType;
@@ -413,22 +432,24 @@
413432 migrateProperties(sharedPref);
414433 // make sure the fallback values here match preference default,
415434 // otherwise the value of new preference is unexpected
416- boolean dictSuggest = sharedPref.getBoolean(TKSettingsActivity.PREF_DICT_SUGGEST, true);
417- boolean autoDash = sharedPref.getBoolean(TKSettingsActivity.PREF_AUTO_DASH, true);
418- boolean pojToneMark = sharedPref.getBoolean(TKSettingsActivity.PREF_POJ_TONE_MARK, false);
419- String toneMarkStyle = sharedPref.getString(TKSettingsActivity.PREF_TONE_MARK_STYLE, TONE_MARK_SUBTYPE);
420- boolean aspirationToggle = sharedPref.getBoolean(TKSettingsActivity.PREF_ASPIRATION_TOGGLE, true);
421- boolean voicelessToggle = sharedPref.getBoolean(TKSettingsActivity.PREF_VOICELESS_TOGGLE, false);
422- boolean phoneticInput = sharedPref.getBoolean(TKSettingsActivity.PREF_PHONETIC_INPUT, false);
423- boolean leadReplaceLead = sharedPref.getBoolean(TKSettingsActivity.PREF_LEAD_REPLACE_LEAD, false);
424- boolean glotalReplaceGlotal = sharedPref.getBoolean(TKSettingsActivity.PREF_GLOTAL_REPLACE, false);
425- boolean glotalToggleTone = sharedPref.getBoolean(TKSettingsActivity.PREF_GLOTAL_TOGGLE, false);
426- String deleteVowelsMode = sharedPref.getString(TKSettingsActivity.PREF_DEL_VOWELS, DEL_VOWELS_SINGLE);
427- String deleteLeadingsMode = sharedPref.getString(TKSettingsActivity.PREF_DEL_LEADINGS, DEL_LEADINGS_VALID);
428- boolean deleteAfterCluster = sharedPref.getBoolean(TKSettingsActivity.PREF_DEL_AFTER_CLUSTER, false);
429- String languageKey = sharedPref.getString(TKSettingsActivity.PREF_IM_SWITCH, LANGKEY_NEXT_IM);
430- kbdTheme = sharedPref.getString(TKSettingsActivity.PREF_KEYBOARD_THEME, kbdTheme);
435+ boolean dictSuggest = sharedPref.getBoolean(PREF_DICT_SUGGEST, true);
436+ boolean dictHanji = sharedPref.getBoolean(PREF_DICT_HANJI, true);
437+ boolean autoDash = sharedPref.getBoolean(PREF_AUTO_DASH, true);
438+ boolean pojToneMark = sharedPref.getBoolean(PREF_POJ_TONE_MARK, false);
439+ String toneMarkStyle = sharedPref.getString(PREF_TONE_MARK_STYLE, TONE_MARK_SUBTYPE);
440+ boolean aspirationToggle = sharedPref.getBoolean(PREF_ASPIRATION_TOGGLE, true);
441+ boolean voicelessToggle = sharedPref.getBoolean(PREF_VOICELESS_TOGGLE, false);
442+ boolean phoneticInput = sharedPref.getBoolean(PREF_PHONETIC_INPUT, false);
443+ boolean leadReplaceLead = sharedPref.getBoolean(PREF_LEAD_REPLACE_LEAD, false);
444+ boolean glotalReplaceGlotal = sharedPref.getBoolean(PREF_GLOTAL_REPLACE, false);
445+ boolean glotalToggleTone = sharedPref.getBoolean(PREF_GLOTAL_TOGGLE, false);
446+ String deleteVowelsMode = sharedPref.getString(PREF_DEL_VOWELS, DEL_VOWELS_SINGLE);
447+ String deleteLeadingsMode = sharedPref.getString(PREF_DEL_LEADINGS, DEL_LEADINGS_VALID);
448+ boolean deleteAfterCluster = sharedPref.getBoolean(PREF_DEL_AFTER_CLUSTER, false);
449+ String languageKey = sharedPref.getString(PREF_IM_SWITCH, LANGKEY_NEXT_IM);
450+ kbdTheme = sharedPref.getString(PREF_KEYBOARD_THEME, kbdTheme);
431451 log("Read preferences:\n dictSuggest: ", dictSuggest,
452+ "\n dictHanji: ", dictHanji,
432453 "\n autoDash: ", autoDash,
433454 "\n pojToneMark: ", pojToneMark,
434455 "\n aspirationToggle: ", aspirationToggle,
@@ -459,6 +480,7 @@
459480
460481 initInputState();
461482 inputState = inputState.setBoolean(DictSuggest, dictSuggest)
483+ .setBoolean(DictHanji, dictHanji)
462484 .setBoolean(AutoDash, autoDash)
463485 .setBoolean(PojToneMark, pojToneMark)
464486 .setString(ToneMarkStyle, toneMarkStyle)
@@ -496,7 +518,7 @@
496518
497519 protected void migrateToneMarkStyle(SharedPreferences sharedPref) {
498520 SharedPreferences.Editor editor = sharedPref.edit();
499- if (sharedPref.contains(TKSettingsActivity.PREF_POJ_TONE_MARK)) {
521+ if (sharedPref.contains(PREF_POJ_TONE_MARK)) {
500522 boolean hasPOJ = false;
501523 boolean hasTL = false;
502524 if (imMgr == null) {
@@ -518,7 +540,7 @@
518540 }
519541 }
520542 }
521- boolean pojToneMark = sharedPref.getBoolean(TKSettingsActivity.PREF_POJ_TONE_MARK, false);
543+ boolean pojToneMark = sharedPref.getBoolean(PREF_POJ_TONE_MARK, false);
522544
523545 String style = TONE_MARK_SUBTYPE;
524546 if (pojToneMark) {
@@ -528,41 +550,41 @@
528550 if (hasPOJ && !hasTL)
529551 style = TONE_MARK_TL;
530552 }
531- log("migrate deprecated property ", TKSettingsActivity.PREF_POJ_TONE_MARK,
553+ log("migrate deprecated property ", PREF_POJ_TONE_MARK,
532554 " value ", pojToneMark,
533- " to new property ", TKSettingsActivity.PREF_TONE_MARK_STYLE,
555+ " to new property ", PREF_TONE_MARK_STYLE,
534556 " value ", style);
535- editor.putString(TKSettingsActivity.PREF_TONE_MARK_STYLE, style);
536- editor.remove(TKSettingsActivity.PREF_POJ_TONE_MARK);
557+ editor.putString(PREF_TONE_MARK_STYLE, style);
558+ editor.remove(PREF_POJ_TONE_MARK);
537559 }
538560 editor.apply();
539561 }
540562
541563 protected void migrateDelVowels(SharedPreferences sharedPref) {
542564 SharedPreferences.Editor editor = sharedPref.edit();
543- if (sharedPref.contains(TKSettingsActivity.PREF_DEL_MULTICHAR_VOWEL)) {
544- boolean deleteMultiCharVowel = sharedPref.getBoolean(TKSettingsActivity.PREF_DEL_MULTICHAR_VOWEL, false);
565+ if (sharedPref.contains(PREF_DEL_MULTICHAR_VOWEL)) {
566+ boolean deleteMultiCharVowel = sharedPref.getBoolean(PREF_DEL_MULTICHAR_VOWEL, false);
545567 if (deleteMultiCharVowel) {
546568 String delVowels = DEL_VOWELS_SINGLE;
547- log("migrate deprecated property ", TKSettingsActivity.PREF_DEL_MULTICHAR_VOWEL,
569+ log("migrate deprecated property ", PREF_DEL_MULTICHAR_VOWEL,
548570 " value ", deleteMultiCharVowel,
549- " to new property ", TKSettingsActivity.PREF_DEL_VOWELS,
571+ " to new property ", PREF_DEL_VOWELS,
550572 " value ", delVowels);
551- editor.putString(TKSettingsActivity.PREF_DEL_VOWELS, delVowels);
573+ editor.putString(PREF_DEL_VOWELS, delVowels);
552574 }
553- editor.remove(TKSettingsActivity.PREF_DEL_MULTICHAR_VOWEL);
575+ editor.remove(PREF_DEL_MULTICHAR_VOWEL);
554576 }
555- if (sharedPref.contains(TKSettingsActivity.PREF_DEL_VOWEL_CLUSTER)) {
556- boolean deleteVowelCluster = sharedPref.getBoolean(TKSettingsActivity.PREF_DEL_VOWEL_CLUSTER, false);
577+ if (sharedPref.contains(PREF_DEL_VOWEL_CLUSTER)) {
578+ boolean deleteVowelCluster = sharedPref.getBoolean(PREF_DEL_VOWEL_CLUSTER, false);
557579 if (deleteVowelCluster) {
558580 String delVowels = DEL_VOWELS_WHOLE;
559- log("migrate deprecated property ", TKSettingsActivity.PREF_DEL_VOWEL_CLUSTER,
581+ log("migrate deprecated property ", PREF_DEL_VOWEL_CLUSTER,
560582 " value ", deleteVowelCluster,
561- " to new property ", TKSettingsActivity.PREF_DEL_VOWELS,
583+ " to new property ", PREF_DEL_VOWELS,
562584 " value ", delVowels);
563- editor.putString(TKSettingsActivity.PREF_DEL_VOWELS, delVowels);
585+ editor.putString(PREF_DEL_VOWELS, delVowels);
564586 }
565- editor.remove(TKSettingsActivity.PREF_DEL_VOWEL_CLUSTER);
587+ editor.remove(PREF_DEL_VOWEL_CLUSTER);
566588 }
567589 editor.apply();
568590 }
@@ -590,74 +612,109 @@
590612 TKInputState inputState = getInputState();
591613 if (inputState == null) // FIXME: why null?
592614 return;
593- if (key.equals(TKSettingsActivity.PREF_AUTO_DASH)) {
594- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_AUTO_DASH, false);
595- log("change AutoDash to ", value);
596- inputState = inputState.setBoolean(AutoDash, value);
597- } else if (key.equals(TKSettingsActivity.PREF_DICT_SUGGEST)) {
598- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_DICT_SUGGEST, false);
599- log("change DictSuggest to ", value);
600- inputState = inputState.setBoolean(DictSuggest, value);
601- if (value) {
602- dictReady.set(false);
603- TKBackgroundService.updateDatabase(this);
604- if (db == null)
605- db = new TKDatabase(this).getReadableDatabase();
606- } else if (db != null) {
607- db.close();
608- db = null;
609- TKBackgroundService.terminateDatabase(this);
615+ switch (key) {
616+ case PREF_AUTO_DASH: {
617+ boolean value = sharedPref.getBoolean(PREF_AUTO_DASH, false);
618+ log("change AutoDash to ", value);
619+ inputState = inputState.setBoolean(AutoDash, value);
610620 }
611- } else if (key.equals(TKSettingsActivity.PREF_POJ_TONE_MARK)) {
612- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_POJ_TONE_MARK, false);
613- log("change PojToneMark to ", value);
614- inputState = inputState.setBoolean(PojToneMark, value);
615- } else if (key.equals(TKSettingsActivity.PREF_ASPIRATION_TOGGLE)) {
616- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_ASPIRATION_TOGGLE, false);
617- log("change AspirationToggle to ", value);
618- inputState = inputState.setBoolean(AspirationToggle, value);
619- } else if (key.equals(TKSettingsActivity.PREF_VOICELESS_TOGGLE)) {
620- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_VOICELESS_TOGGLE, false);
621- log("change VoicelessToggle to ", value);
622- inputState = inputState.setBoolean(VoicelessToggle, value);
623- } else if (key.equals(TKSettingsActivity.PREF_PHONETIC_INPUT)) {
624- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_PHONETIC_INPUT, false);
625- log("change PhoneticInput to ", value);
626- inputState = inputState.setBoolean(PhoneticInput, value);
627- } else if (key.equals(TKSettingsActivity.PREF_LEAD_REPLACE_LEAD)) {
628- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_LEAD_REPLACE_LEAD, false);
629- log("change LeadReplaceLead to ", value);
630- inputState = inputState.setBoolean(LeadReplaceLead, value);
631- } else if (key.equals(TKSettingsActivity.PREF_GLOTAL_REPLACE)) {
632- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_GLOTAL_REPLACE, false);
633- log("change GlotalReplaceGlotal to ", value);
634- inputState = inputState.setBoolean(GlotalReplaceGlotal, value);
635- } else if (key.equals(TKSettingsActivity.PREF_GLOTAL_TOGGLE)) {
636- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_GLOTAL_TOGGLE, false);
637- log("change GlotalToggleTone to ", value);
638- inputState = inputState.setBoolean(GlotalToggleTone, value);
639- } else if (key.equals(TKSettingsActivity.PREF_DEL_VOWELS)) {
640- String value = sharedPref.getString(TKSettingsActivity.PREF_DEL_VOWELS, DEL_VOWELS_CHAR);
641- log("change DeleteVowelsMode to ", value);
642- inputState = inputState.setString(DeleteVowelsMode, value);
643- } else if (key.equals(TKSettingsActivity.PREF_DEL_LEADINGS)) {
644- String value = sharedPref.getString(TKSettingsActivity.PREF_DEL_LEADINGS, DEL_LEADINGS_CHAR);
645- log("change DeleteLeadingsMode to ", value);
646- inputState = inputState.setString(DeleteLeadingsMode, value);
647- } else if (key.equals(TKSettingsActivity.PREF_DEL_AFTER_CLUSTER)) {
648- boolean value = sharedPref.getBoolean(TKSettingsActivity.PREF_DEL_AFTER_CLUSTER, false);
649- log("change DeleteAfterCluster to ", value);
650- inputState = inputState.setBoolean(DeleteAfterCluster, value);
651- } else if (key.equals(TKSettingsActivity.PREF_IM_SWITCH)) {
652- String value = sharedPref.getString(TKSettingsActivity.PREF_IM_SWITCH, LANGKEY_NEXT_IM);
653- log("change LanguageKey to ", value);
654- inputState = inputState.setString(LanguageKey, value);
655- } else if (key.equals(TKSettingsActivity.PREF_KEYBOARD_THEME)) {
656- String value = sharedPref.getString(TKSettingsActivity.PREF_KEYBOARD_THEME, kbdTheme);
657- log("change KeyboardTheme to ", value);
658- kbdTheme = value;
659- if (kbdView != null)
660- updateTheme();
621+ break;
622+ case PREF_DICT_SUGGEST: {
623+ boolean value = sharedPref.getBoolean(PREF_DICT_SUGGEST, false);
624+ log("change DictSuggest to ", value);
625+ inputState = inputState.setBoolean(DictSuggest, value);
626+ if (value) {
627+ dictReady.set(false);
628+ TKBackgroundService.updateDatabase(this);
629+ if (db == null)
630+ db = new TKDatabase(this).getReadableDatabase();
631+ } else if (db != null) {
632+ db.close();
633+ db = null;
634+ TKBackgroundService.terminateDatabase(this);
635+ }
636+ }
637+ break;
638+ case PREF_DICT_HANJI: {
639+ boolean value = sharedPref.getBoolean(PREF_DICT_HANJI, false);
640+ log("change DictHanji to ", value);
641+ inputState = inputState.setBoolean(DictHanji, value);
642+ }
643+ break;
644+ case PREF_POJ_TONE_MARK: {
645+ boolean value = sharedPref.getBoolean(PREF_POJ_TONE_MARK, false);
646+ log("change PojToneMark to ", value);
647+ inputState = inputState.setBoolean(PojToneMark, value);
648+ }
649+ break;
650+ case PREF_ASPIRATION_TOGGLE: {
651+ boolean value = sharedPref.getBoolean(PREF_ASPIRATION_TOGGLE, false);
652+ log("change AspirationToggle to ", value);
653+ inputState = inputState.setBoolean(AspirationToggle, value);
654+ }
655+ break;
656+ case PREF_VOICELESS_TOGGLE: {
657+ boolean value = sharedPref.getBoolean(PREF_VOICELESS_TOGGLE, false);
658+ log("change VoicelessToggle to ", value);
659+ inputState = inputState.setBoolean(VoicelessToggle, value);
660+ }
661+ break;
662+ case PREF_PHONETIC_INPUT: {
663+ boolean value = sharedPref.getBoolean(PREF_PHONETIC_INPUT, false);
664+ log("change PhoneticInput to ", value);
665+ inputState = inputState.setBoolean(PhoneticInput, value);
666+ }
667+ break;
668+ case PREF_LEAD_REPLACE_LEAD: {
669+ boolean value = sharedPref.getBoolean(PREF_LEAD_REPLACE_LEAD, false);
670+ log("change LeadReplaceLead to ", value);
671+ inputState = inputState.setBoolean(LeadReplaceLead, value);
672+ }
673+ break;
674+ case PREF_GLOTAL_REPLACE: {
675+ boolean value = sharedPref.getBoolean(PREF_GLOTAL_REPLACE, false);
676+ log("change GlotalReplaceGlotal to ", value);
677+ inputState = inputState.setBoolean(GlotalReplaceGlotal, value);
678+ }
679+ break;
680+ case PREF_GLOTAL_TOGGLE: {
681+ boolean value = sharedPref.getBoolean(PREF_GLOTAL_TOGGLE, false);
682+ log("change GlotalToggleTone to ", value);
683+ inputState = inputState.setBoolean(GlotalToggleTone, value);
684+ }
685+ break;
686+ case PREF_DEL_VOWELS: {
687+ String value = sharedPref.getString(PREF_DEL_VOWELS, DEL_VOWELS_CHAR);
688+ log("change DeleteVowelsMode to ", value);
689+ inputState = inputState.setString(DeleteVowelsMode, value);
690+ }
691+ break;
692+ case PREF_DEL_LEADINGS: {
693+ String value = sharedPref.getString(PREF_DEL_LEADINGS, DEL_LEADINGS_CHAR);
694+ log("change DeleteLeadingsMode to ", value);
695+ inputState = inputState.setString(DeleteLeadingsMode, value);
696+ }
697+ break;
698+ case PREF_DEL_AFTER_CLUSTER: {
699+ boolean value = sharedPref.getBoolean(PREF_DEL_AFTER_CLUSTER, false);
700+ log("change DeleteAfterCluster to ", value);
701+ inputState = inputState.setBoolean(DeleteAfterCluster, value);
702+ }
703+ break;
704+ case PREF_IM_SWITCH: {
705+ String value = sharedPref.getString(PREF_IM_SWITCH, LANGKEY_NEXT_IM);
706+ log("change LanguageKey to ", value);
707+ inputState = inputState.setString(LanguageKey, value);
708+ }
709+ break;
710+ case PREF_KEYBOARD_THEME: {
711+ String value = sharedPref.getString(PREF_KEYBOARD_THEME, kbdTheme);
712+ log("change KeyboardTheme to ", value);
713+ kbdTheme = value;
714+ if (kbdView != null)
715+ updateTheme();
716+ }
717+ break;
661718 }
662719 setInputState(inputState);
663720 }
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKInputState.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKInputState.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKInputState.java Wed Jul 01 07:50:03 2020 +0800
@@ -27,6 +27,7 @@
2727 private static int keyIndex = 0;
2828 // parameters
2929 public static final TKState.Key DictSuggest = TKState.Key.valueOf(keyIndex++);
30+ public static final TKState.Key DictHanji = TKState.Key.valueOf(keyIndex++);
3031 public static final TKState.Key AutoDash = TKState.Key.valueOf(keyIndex++);
3132 public static final TKState.Key PojToneMark = TKState.Key.valueOf(keyIndex++);
3233 public static final TKState.Key ToneMarkStyle = TKState.Key.valueOf(keyIndex++);
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKKeyboardView.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKKeyboardView.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKKeyboardView.java Wed Jul 01 07:50:03 2020 +0800
@@ -29,7 +29,7 @@
2929 import android.graphics.drawable.Drawable;
3030 import android.inputmethodservice.Keyboard;
3131 import android.inputmethodservice.KeyboardView;
32-import android.support.v4.graphics.drawable.DrawableCompat;
32+import androidx.core.graphics.drawable.DrawableCompat;
3333 import android.util.AttributeSet;
3434
3535 import java.util.List;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKLicenseActivity.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKLicenseActivity.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKLicenseActivity.java Wed Jul 01 07:50:03 2020 +0800
@@ -20,7 +20,7 @@
2020
2121 import android.content.Context;
2222 import android.os.Bundle;
23-import android.support.v7.app.AppCompatActivity;
23+import androidx.appcompat.app.AppCompatActivity;
2424
2525 public class TKLicenseActivity extends AppCompatActivity {
2626 @Override
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKLogActivity.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKLogActivity.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKLogActivity.java Wed Jul 01 07:50:03 2020 +0800
@@ -25,10 +25,10 @@
2525 import android.os.Bundle;
2626 import android.os.IBinder;
2727 import android.provider.Settings;
28-import android.support.design.widget.FloatingActionButton;
29-import android.support.design.widget.Snackbar;
30-import android.support.v7.app.AppCompatActivity;
31-import android.support.v7.widget.Toolbar;
28+import com.google.android.material.floatingactionbutton.FloatingActionButton;
29+import com.google.android.material.snackbar.Snackbar;
30+import androidx.appcompat.app.AppCompatActivity;
31+import androidx.appcompat.widget.Toolbar;
3232 import android.view.View;
3333 import android.view.inputmethod.InputMethodInfo;
3434 import android.view.inputmethod.InputMethodManager;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKLogService.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKLogService.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKLogService.java Wed Jul 01 07:50:03 2020 +0800
@@ -22,7 +22,7 @@
2222 import android.content.Intent;
2323 import android.os.Binder;
2424 import android.os.IBinder;
25-import android.support.annotation.Nullable;
25+import androidx.annotation.Nullable;
2626
2727 import java.util.Vector;
2828
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKPreferenceActivity.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKPreferenceActivity.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKPreferenceActivity.java Wed Jul 01 07:50:03 2020 +0800
@@ -21,11 +21,11 @@
2121 import android.content.res.Configuration;
2222 import android.os.Bundle;
2323 import android.preference.PreferenceActivity;
24-import android.support.annotation.LayoutRes;
25-import android.support.annotation.Nullable;
26-import android.support.v7.app.ActionBar;
27-import android.support.v7.app.AppCompatDelegate;
28-import android.support.v7.widget.Toolbar;
24+import androidx.annotation.LayoutRes;
25+import androidx.annotation.Nullable;
26+import androidx.appcompat.app.ActionBar;
27+import androidx.appcompat.app.AppCompatDelegate;
28+import androidx.appcompat.widget.Toolbar;
2929 import android.view.MenuInflater;
3030 import android.view.View;
3131 import android.view.ViewGroup;
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKQueryCandidatesTask.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKQueryCandidatesTask.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKQueryCandidatesTask.java Wed Jul 01 07:50:03 2020 +0800
@@ -31,6 +31,7 @@
3131 import java.util.concurrent.atomic.AtomicInteger;
3232
3333 import static tw.iongchun.taigikbd.TKInputMethodService.SUBTYPE_POJ;
34+import static tw.iongchun.taigikbd.TKInputState.DictHanji;
3435 import static tw.iongchun.taigikbd.TKInputState.Subtype;
3536 import static tw.iongchun.taigikbd.TKViewState.Candidates;
3637 import static tw.iongchun.taigikbd.TKViewState.ComposingText;
@@ -61,6 +62,7 @@
6162 TKInputState inputState = param.getKey();
6263 TKViewState viewState = param.getValue();
6364 int subtype = inputState.getInteger(Subtype);
65+ boolean useHanji = inputState.getBoolean(DictHanji);
6466 String text = viewState.getString(ComposingText);
6567 ArrayList<Boolean> ucList = new ArrayList<>();
6668 for (char ch : text.toCharArray()) {
@@ -74,9 +76,9 @@
7476 // query exact prefix
7577 String query1;
7678 if (subtype == SUBTYPE_POJ)
77- query1 = "select word from words_poj where word like ? order by weight desc, word limit " + CANDIDATE_MAX_NUM;
79+ query1 = "select word, han from words_poj where word like ? order by weight desc, word limit " + CANDIDATE_MAX_NUM;
7880 else
79- query1 = "select word from words where word like ? order by weight desc, word limit " + CANDIDATE_MAX_NUM;
81+ query1 = "select word, han from words where word like ? order by weight desc, word limit " + CANDIDATE_MAX_NUM;
8082 c = db.rawQuery(query1, new String[] {text + '%'});
8183 if (queued.get() > 1)
8284 return null;
@@ -102,6 +104,11 @@
102104 }
103105 word = new String(wchars);
104106 candidates.add(word);
107+ if (useHanji) {
108+ String han = c.getString(1);
109+ if (han != null)
110+ candidates.add(han);
111+ }
105112 words.add(word);
106113 count++;
107114 }
@@ -109,9 +116,9 @@
109116 // query prefix without tone
110117 String query2;
111118 if (subtype == SUBTYPE_POJ)
112- query2 = "select word from words_poj where toneless like ? order by weight desc, word limit " + CANDIDATE_TONELESS_NUM;
119+ query2 = "select word, han from words_poj where toneless like ? order by weight desc, word limit " + CANDIDATE_TONELESS_NUM;
113120 else
114- query2 = "select word from words where toneless like ? order by weight desc, word limit " + CANDIDATE_TONELESS_NUM;
121+ query2 = "select word, han from words where toneless like ? order by weight desc, word limit " + CANDIDATE_TONELESS_NUM;
115122 c = db.rawQuery(query2, new String[] {toneless + '%'});
116123 if (queued.get() > 1) {
117124 candidates.clear();
@@ -138,6 +145,11 @@
138145 word = new String(wchars);
139146 if (!words.contains(word)) {
140147 candidates.add(word);
148+ if (useHanji) {
149+ String han = c.getString(1);
150+ if (han != null)
151+ candidates.add(han);
152+ }
141153 words.add(word);
142154 count++;
143155 }
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/java/tw/iongchun/taigikbd/TKSettingsActivity.java
--- a/app/src/main/java/tw/iongchun/taigikbd/TKSettingsActivity.java Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/java/tw/iongchun/taigikbd/TKSettingsActivity.java Wed Jul 01 07:50:03 2020 +0800
@@ -31,7 +31,7 @@
3131 import android.preference.PreferenceFragment;
3232 import android.preference.PreferenceManager;
3333 import android.provider.Settings;
34-import android.support.v7.app.ActionBar;
34+import androidx.appcompat.app.ActionBar;
3535 import android.view.MenuItem;
3636 import android.view.inputmethod.InputMethodInfo;
3737 import android.view.inputmethod.InputMethodManager;
@@ -51,6 +51,7 @@
5151 */
5252 public class TKSettingsActivity extends TKPreferenceActivity {
5353 public static final String PREF_DICT_SUGGEST = "dict_suggest_switch";
54+ public static final String PREF_DICT_HANJI = "dict_hanji_switch";
5455 public static final String PREF_AUTO_DASH = "auto_dash_switch";
5556 public static final String PREF_POJ_TONE_MARK = "poj_tone_mark_switch";
5657 public static final String PREF_TONE_MARK_STYLE = "tone_mark_style";
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/layout/activity_hint.xml
--- a/app/src/main/res/layout/activity_hint.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/layout/activity_hint.xml Wed Jul 01 07:50:03 2020 +0800
@@ -17,7 +17,7 @@
1717 You should have received a copy of the GNU General Public License
1818 along with Sim-sik ê Khí-pòo. If not, see <http://www.gnu.org/licenses/>.
1919 -->
20-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
20+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
2121 xmlns:app="http://schemas.android.com/apk/res-auto"
2222 xmlns:tools="http://schemas.android.com/tools"
2323 android:layout_width="match_parent"
@@ -48,4 +48,4 @@
4848 android:textColor="@android:color/black"/>
4949 </ScrollView>
5050
51-</android.support.constraint.ConstraintLayout>
51+</androidx.constraintlayout.widget.ConstraintLayout>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/layout/activity_license.xml
--- a/app/src/main/res/layout/activity_license.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/layout/activity_license.xml Wed Jul 01 07:50:03 2020 +0800
@@ -17,7 +17,7 @@
1717 You should have received a copy of the GNU General Public License
1818 along with Sim-sik ê Khí-pòo. If not, see <http://www.gnu.org/licenses/>.
1919 -->
20-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
20+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
2121 xmlns:app="http://schemas.android.com/apk/res-auto"
2222 xmlns:tools="http://schemas.android.com/tools"
2323 android:layout_width="match_parent"
@@ -48,4 +48,4 @@
4848 android:textColor="@android:color/black"/>
4949 </ScrollView>
5050
51-</android.support.constraint.ConstraintLayout>
51+</androidx.constraintlayout.widget.ConstraintLayout>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/layout/activity_log.xml
--- a/app/src/main/res/layout/activity_log.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/layout/activity_log.xml Wed Jul 01 07:50:03 2020 +0800
@@ -17,7 +17,7 @@
1717 You should have received a copy of the GNU General Public License
1818 along with Sim-sik ê Khí-pòo. If not, see <http://www.gnu.org/licenses/>.
1919 -->
20-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
20+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
2121 xmlns:app="http://schemas.android.com/apk/res-auto"
2222 xmlns:tools="http://schemas.android.com/tools"
2323 android:layout_width="match_parent"
@@ -25,14 +25,14 @@
2525 android:fitsSystemWindows="true"
2626 tools:context="tw.iongchun.taigikbd.TKLogActivity">
2727
28- <android.support.design.widget.AppBarLayout
28+ <com.google.android.material.appbar.AppBarLayout
2929 android:id="@+id/app_bar"
3030 android:layout_width="match_parent"
3131 android:layout_height="@dimen/app_bar_height"
3232 android:fitsSystemWindows="true"
3333 android:theme="@style/AppTheme.AppBarOverlay">
3434
35- <android.support.design.widget.CollapsingToolbarLayout
35+ <com.google.android.material.appbar.CollapsingToolbarLayout
3636 android:id="@+id/toolbar_layout"
3737 android:layout_width="match_parent"
3838 android:layout_height="match_parent"
@@ -40,19 +40,19 @@
4040 app:contentScrim="?attr/colorPrimary"
4141 app:layout_scrollFlags="scroll|exitUntilCollapsed">
4242
43- <android.support.v7.widget.Toolbar
43+ <androidx.appcompat.widget.Toolbar
4444 android:id="@+id/toolbar"
4545 android:layout_width="match_parent"
4646 android:layout_height="?attr/actionBarSize"
4747 app:layout_collapseMode="pin"
4848 app:popupTheme="@style/AppTheme.PopupOverlay"/>
4949
50- </android.support.design.widget.CollapsingToolbarLayout>
51- </android.support.design.widget.AppBarLayout>
50+ </com.google.android.material.appbar.CollapsingToolbarLayout>
51+ </com.google.android.material.appbar.AppBarLayout>
5252
5353 <include layout="@layout/content_log"/>
5454
55- <android.support.design.widget.FloatingActionButton
55+ <com.google.android.material.floatingactionbutton.FloatingActionButton
5656 android:id="@+id/fab"
5757 android:layout_width="wrap_content"
5858 android:layout_height="wrap_content"
@@ -61,4 +61,4 @@
6161 app:layout_anchorGravity="bottom|end"
6262 app:srcCompat="@android:drawable/ic_dialog_email"/>
6363
64-</android.support.design.widget.CoordinatorLayout>
64+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/layout/content_log.xml
--- a/app/src/main/res/layout/content_log.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/layout/content_log.xml Wed Jul 01 07:50:03 2020 +0800
@@ -17,7 +17,7 @@
1717 You should have received a copy of the GNU General Public License
1818 along with Sim-sik ê Khí-pòo. If not, see <http://www.gnu.org/licenses/>.
1919 -->
20-<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
20+<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2121 xmlns:app="http://schemas.android.com/apk/res-auto"
2222 xmlns:tools="http://schemas.android.com/tools"
2323 android:layout_width="match_parent"
@@ -46,4 +46,4 @@
4646
4747 </LinearLayout>
4848
49-</android.support.v4.widget.NestedScrollView>
49+</androidx.core.widget.NestedScrollView>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/values-b+nan+Latn+TW-v24/strings.xml
--- a/app/src/main/res/values-b+nan+Latn+TW-v24/strings.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/values-b+nan+Latn+TW-v24/strings.xml Wed Jul 01 07:50:03 2020 +0800
@@ -42,6 +42,8 @@
4242 <string name="label_subtype_default">Bô tsí-tiānn (Tâi-lô)</string>
4343 <string name="pref_title_dict_suggest">Sû-tián kiàn-gī</string>
4444 <string name="pref_description_dict_suggest">Sú-iōng sû-tián lâi thē-kiong kiàn-gī ê sû</string>
45+ <string name="pref_title_dict_hanji">Hán-jī ê sû-tián</string>
46+ <string name="pref_description_dict_hanji">Hán-jī hām Lô-má-jī ê sû lóng-mā ē kiàn-gī</string>
4547 <string name="pref_title_auto_dash">Tsū-tōng liân-jī</string>
4648 <string name="pref_description_auto_dash">Tsū-tōng tī ln̄g ê im-tsiat tiong-kan ka liân-jī-hō</string>
4749 <string name="pref_title_glotal_replace_glotal">Ji̍p-siann iu-sian</string>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/values-zh-rTW/strings.xml
--- a/app/src/main/res/values-zh-rTW/strings.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/values-zh-rTW/strings.xml Wed Jul 01 07:50:03 2020 +0800
@@ -24,6 +24,8 @@
2424 <string name="label_subtype_tailo">台羅</string>
2525 <string name="pref_title_dict_suggest">辭典建議</string>
2626 <string name="pref_description_dict_suggest">使用辭典來提供建議詞</string>
27+ <string name="pref_title_dict_hanji">漢字辭典</string>
28+ <string name="pref_description_dict_hanji">提供羅馬字連同漢字的建議詞</string>
2729 <string name="pref_title_auto_dash">自動連字</string>
2830 <string name="pref_description_auto_dash">自動在兩個音節間加入連字符號</string>
2931 <string name="pref_title_glotal_replace_glotal">入聲優先</string>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/values/strings.xml
--- a/app/src/main/res/values/strings.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/values/strings.xml Wed Jul 01 07:50:03 2020 +0800
@@ -42,6 +42,8 @@
4242 <string name="label_subtype_default">Bô tsí-tiānn (Tâi-lô)</string>
4343 <string name="pref_title_dict_suggest">Sû-tián kiàn-gī</string>
4444 <string name="pref_description_dict_suggest">Sú-iōng sû-tián lâi thē-kiong kiàn-gī ê sû</string>
45+ <string name="pref_title_dict_hanji">Hán-jī ê sû-tián</string>
46+ <string name="pref_description_dict_hanji">Hán-jī hām Lô-má-jī ê sû lóng-mā ē kiàn-gī</string>
4547 <string name="pref_title_auto_dash">Tsū-tōng liân-jī</string>
4648 <string name="pref_description_auto_dash">Tsū-tōng tī ln̄g ê im-tsiat tiong-kan ka liân-jī-hō</string>
4749 <string name="pref_title_glotal_replace_glotal">Ji̍p-siann iu-sian</string>
diff -r 011141c2d5f6 -r f3e8c9f56aa8 app/src/main/res/xml/pref_general.xml
--- a/app/src/main/res/xml/pref_general.xml Sat Aug 24 21:38:33 2019 +0800
+++ b/app/src/main/res/xml/pref_general.xml Wed Jul 01 07:50:03 2020 +0800
@@ -23,6 +23,11 @@
2323 android:key="dict_suggest_switch"
2424 android:summary="@string/pref_description_dict_suggest"
2525 android:title="@string/pref_title_dict_suggest"/>
26+ <SwitchPreference
27+ android:defaultValue="true"
28+ android:key="dict_hanji_switch"
29+ android:summary="@string/pref_description_dict_hanji"
30+ android:title="@string/pref_title_dict_hanji"/>
2631
2732 <SwitchPreference
2833 android:defaultValue="true"
diff -r 011141c2d5f6 -r f3e8c9f56aa8 bitbucket-pipelines.yml
--- a/bitbucket-pipelines.yml Sat Aug 24 21:38:33 2019 +0800
+++ b/bitbucket-pipelines.yml Wed Jul 01 07:50:03 2020 +0800
@@ -9,7 +9,7 @@
99 - android-sdk
1010 script:
1111 # download and unzip
12- - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
12+ - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-6514223_latest.zip
1313 - unzip -o -qq android-sdk.zip -d android-sdk
1414 # setup environment and path
1515 - export ANDROID_HOME="/opt/atlassian/pipelines/agent/build/android-sdk"
@@ -17,8 +17,8 @@
1717 # download packages
1818 - yes | sdkmanager --licenses
1919 - yes | sdkmanager "platform-tools"
20- - yes | sdkmanager "platforms;android-27"
21- - yes | sdkmanager "build-tools;28.0.0"
20+ - yes | sdkmanager "platforms;android-29"
21+ - yes | sdkmanager "build-tools;29.0.2"
2222 # - yes | sdkmanager "extras;android;m2repository"
2323 # - yes | sdkmanager "extras;google;m2repository"
2424 # - yes | sdkmanager "extras;google;instantapps"
diff -r 011141c2d5f6 -r f3e8c9f56aa8 build.gradle
--- a/build.gradle Sat Aug 24 21:38:33 2019 +0800
+++ b/build.gradle Wed Jul 01 07:50:03 2020 +0800
@@ -6,7 +6,7 @@
66 google()
77 }
88 dependencies {
9- classpath 'com.android.tools.build:gradle:3.5.0'
9+ classpath 'com.android.tools.build:gradle:4.0.0'
1010
1111 // NOTE: Do not place your application dependencies here; they belong
1212 // in the individual module build.gradle files
diff -r 011141c2d5f6 -r f3e8c9f56aa8 gradle.properties
--- a/gradle.properties Sat Aug 24 21:38:33 2019 +0800
+++ b/gradle.properties Wed Jul 01 07:50:03 2020 +0800
@@ -9,6 +9,8 @@
99
1010 # Specifies the JVM arguments used for the daemon process.
1111 # The setting is particularly useful for tweaking memory settings.
12+android.enableJetifier=true
13+android.useAndroidX=true
1214 org.gradle.jvmargs=-Xmx1536m
1315
1416 # When configured, Gradle will run in incubating parallel mode.
diff -r 011141c2d5f6 -r f3e8c9f56aa8 gradle/wrapper/gradle-wrapper.properties
--- a/gradle/wrapper/gradle-wrapper.properties Sat Aug 24 21:38:33 2019 +0800
+++ b/gradle/wrapper/gradle-wrapper.properties Wed Jul 01 07:50:03 2020 +0800
@@ -1,6 +1,6 @@
1-#Sat Aug 24 20:07:25 CST 2019
1+#Mon Jun 22 21:37:48 CST 2020
22 distributionBase=GRADLE_USER_HOME
33 distributionPath=wrapper/dists
44 zipStoreBase=GRADLE_USER_HOME
55 zipStorePath=wrapper/dists
6-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
6+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
Show on old repository browser