From 9191f88322f1216777d7959aa5ca9d63854378e2 Mon Sep 17 00:00:00 2001 From: Liggliluff Date: Mon, 25 Mar 2024 10:40:06 +0100 Subject: [PATCH 01/19] Add files via upload Updated Swedish translation for the latest version --- app/src/main/res/values-sv/strings.xml | 49 +++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index bac4cac..56fcb99 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -10,6 +10,10 @@ Kopierad till urklipp Enter Dela + Ångra + Gör om + Konvertera + Konvertera… Typsnitt Favoriter Senast använda @@ -18,13 +22,13 @@ Emoji Systemstandard System (%s) - Annat … + Annat… Språk Mata in Ta bort - Välj … + Välj… Markera - Ta bort … + Ta bort… Kodpunkt Ogiltig kodpunkt Det gick inte att öppna typsnittet @@ -51,6 +55,7 @@ 800 samaritiska 840 mandeiska 860 syriska, tillägg + 870 arabiska, utökad-B 8A0 arabiska, utökad-A 900 devanagari 980 bengaliska @@ -211,7 +216,9 @@ 104B0 osage 10500 elbasiska 10530 kaukasiska albanska + 10570 Vithkuqi 10600 linjär A + 10780 latinska, utökad-F 10800 cypriotiska stavelser 10840 imperisk arameiska 10860 palmyreniska @@ -234,8 +241,10 @@ 10D00 hanifiska 10E60 rumi-siffersymboler 10E80 yazidi + 10EC0 arabiska, utökad-C 10F00 gammalsogdiska 10F30 sogdiska + 10F70 Uiguriska 10FB0 choresmiska 10FE0 elymaiska 11000 brami @@ -248,7 +257,7 @@ 11200 khojkiska 11280 multaniska 112B0 sindhiska - 11300 gammaltamilska + 11300 gammaltamilska (grantha) 11400 newariska 11480 tirhuta 11580 siddhamska @@ -262,22 +271,27 @@ 119A0 nandinagari 11A00 zanabazar kvadratisk skrift 11A50 soyombo + 11AB0 kanadensiska stavelsetecken, utökad-A 11AC0 Pau Cin Hau-skrift + 11B00 devanagari, utökad-A 11C00 bhaiksukiska 11C70 marchenska 11D00 masaram-gondi 11D60 gunjalgondiska 11EE0 makasariska + 11F00 gammaljavanesiska (kawi) 11FB0 lisu, tillägg 11FC0 tamilska, tillägg 12000 kilskrift 12400 kilskriftssiffor och -skiljetecken 12480 forndynastisk kilskrift + 12F90 cypro-minoiska 13000 egyptiska hieroglyfer 13430 egyptiska hieroglyfformattecken 14400 hittitiska hieroglyfer 16800 bamunska, tillägg 16A40 mru + 16A70 tangsa 16AD0 bassaiska vah 16B00 pahaw mong 16E40 medefaidrin @@ -287,23 +301,31 @@ 18800 tangutiska komponenter 18B00 khitansk liten skrift 18D00 tangutiska, tillägg + 1AFF0 kana, utökad-A 1B000 kana, tillägg 1B100 kana, utökad-A 1B130 små kana, utökning 1B170 nüshu 1BC00 duployéstenografiska 1BCA0 snabbskrift-formatkontroller + 1CF00 znamenny-musikalisk notation 1D000 byzantin-musikaliska symboler 1D100 musikaliska symboler - 1D200 forngrekiska musikalisk notation + 1D200 forngrekisk musikalisk notation + 1D2C0 kaktovikska siffror 1D2E0 mayasiffror 1D300 taixuanjing-symboler 1D360 stavsiffror 1D400 matematiska alfanumeriska symboler 1D800 sutton-teckningsskrift + 1DF00 latinska, utökad-G 1E000 glagolitiska, tillägg + 1E030 kyrilliska, utökad-D 1E100 nyiakeng puachue hmong + 1E290 toto 1E2C0 wancho + 1E4D0 nag mundari + 1E7E0 etiopiska, utökad-B 1E800 mende kikakui 1E900 adlamiska 1EC70 indiska siyaq-siffror @@ -339,6 +361,20 @@ F0000 kompletterande tecken för privat bruk-A 100000 kompletterande tecken för privat bruk-B + Nästa + Hoppa över + Klar + Teckensida + Du kan hitta alla tecken i Unicode. Tryck på ett tecken för att mata in och tryck länge för att få mer information om tecknet. + Kopiera och dela + När du har redigerat klart kan du kopiera/dela din Unicode-sträng. + Flikar + Du kan använda olika teckensidor, t.ex. emoji, hitta och favoriter. + Typsnitt + Ladda ned och välj rätt typsnitt om du hittar tecken som inte ritas ut. + Inställningar + Du kan ändra beteendet och utseendet av appen. Du kan också starta om handledning därifrån. + Allmänt Utseende Beteende @@ -374,12 +410,14 @@ Skrollpositioner Slå samman Visa inte annonser + Hoppa över handledning Flikinställningar … Synliga flikar Dolda flikar Flera kolumner med endast tecken En kolumn med beskrivning + Sortera Avstånd i rutnät Textstorlek i rutnät @@ -393,6 +431,7 @@ Mörkt Ljust Ljust + mörk list + Systemstandard Tillämpas efter omstart Listan kan inte döljas From 77b3e138971e928de131ad391cb58b79413eb679 Mon Sep 17 00:00:00 2001 From: Liggliluff Date: Mon, 25 Mar 2024 10:46:06 +0100 Subject: [PATCH 02/19] Corrected a word Changed "behaviour" to "behavior" --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 039133b..8b1e3f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -388,7 +388,7 @@ General Appearance - Behaviour + Behavior Text size of edit box Columns in grid Columns in grid (landscape) From c2edcdce1ee2d02f16a04fdbaaaecd26d0679463 Mon Sep 17 00:00:00 2001 From: Liggliluff Date: Mon, 25 Mar 2024 10:55:02 +0100 Subject: [PATCH 03/19] Added international English Default English is US spelling, international English is UK spelling, for almost all locales of English --- app/src/main/res/values-b+en+001/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 app/src/main/res/values-b+en+001/strings.xml diff --git a/app/src/main/res/values-b+en+001/strings.xml b/app/src/main/res/values-b+en+001/strings.xml new file mode 100644 index 0000000..ea55fb2 --- /dev/null +++ b/app/src/main/res/values-b+en+001/strings.xml @@ -0,0 +1,7 @@ + + Favourite + You can use variety of pads, including emoji, find, and favourite. + You can customise behaviour and appearance of the app. You can revisit this tutorial from the setting as well. + Behaviour + Favourite (%1$d) + \ No newline at end of file From 054ea8790417561d10f71d5a989bd5ba28681c87 Mon Sep 17 00:00:00 2001 From: Liggliluff Date: Mon, 25 Mar 2024 11:08:18 +0100 Subject: [PATCH 04/19] Canadian English --- app/src/main/res/values-en-rCA/strings.xml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/src/main/res/values-en-rCA/strings.xml diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 0000000..137b629 --- /dev/null +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,3 @@ + + You can customize behaviour and appearance of the app. You can revisit this tutorial from the setting as well. + \ No newline at end of file From 38c07ca273814aa73f278ce1ad4737ead4e0e664 Mon Sep 17 00:00:00 2001 From: Liggliluff Date: Sun, 31 Mar 2024 18:46:03 +0200 Subject: [PATCH 05/19] Updating en-rCA to add all international strings en-CA does not have en-001 as a parent and therefore needs the strings from en-001 included --- app/src/main/res/values-en-rCA/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 137b629..ac3236d 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -1,3 +1,7 @@ + Favourite + You can use variety of pads, including emoji, find, and favourite. You can customize behaviour and appearance of the app. You can revisit this tutorial from the setting as well. + Behaviour + Favourite (%1$d) \ No newline at end of file From 30d23e96dceda719da0ff077fbd423c893aa951a Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Wed, 3 Apr 2024 00:22:01 +0900 Subject: [PATCH 06/19] Upgrade gradle to 8.3.1 --- .idea/deploymentTargetDropDown.xml | 10 ++++++++++ .idea/gradle.xml | 3 +-- app/build.gradle | 1 + app/src/fdroid/AndroidManifest.xml | 3 +-- app/src/main/AndroidManifest.xml | 1 - build.gradle | 6 +++--- gradle.properties | 2 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..0c0c338 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 66ff961..20c9219 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,8 +4,6 @@ diff --git a/app/build.gradle b/app/build.gradle index 8f2453b..ba280b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,7 @@ android { versionNameSuffix "-fdroid" } } + namespace 'jp.ddo.hotmist.unicodepad' } dependencies { diff --git a/app/src/fdroid/AndroidManifest.xml b/app/src/fdroid/AndroidManifest.xml index e84e67d..e5935ea 100644 --- a/app/src/fdroid/AndroidManifest.xml +++ b/app/src/fdroid/AndroidManifest.xml @@ -16,8 +16,7 @@ --> + android:installLocation="auto"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bce5cd6..d59854b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,6 @@ --> diff --git a/build.gradle b/build.gradle index 36eca6b..391c2dd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.0' + ext.kotlin_version = '1.9.0' repositories { jcenter() google() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21" + classpath 'com.android.tools.build:gradle:8.3.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/gradle.properties b/gradle.properties index 0b6a43f..7fe1573 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ android.enableJetifier=true +android.nonFinalResIds=false +android.nonTransitiveRClass=false android.useAndroidX=true org.gradle.daemon=true org.gradle.jvmargs=-Xmx2560m diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d5ce6dd..3cd19d1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jan 24 00:03:43 JST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 9d8d807a4cadb6e45830ca6b978d9ee46bf673bb Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Wed, 3 Apr 2024 00:27:39 +0900 Subject: [PATCH 07/19] Updated config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 34261ce..c53d81b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ jobs: build: working_directory: ~/code docker: - - image: circleci/android:api-26 + - image: cimg/android:2024.01 environment: JVM_OPTS: -Xmx3200m steps: From c3da51f4a0f6becf34f7efe7f5f8b4c954594382 Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Sun, 7 Apr 2024 00:19:13 +0900 Subject: [PATCH 08/19] Add monochrome icon for Adaptive icon --- app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 1 + app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index b92d83c..965735f 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index b92d83c..965735f 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file From d2ccf8aa674e6aebbea09bc4ccf2f9540785224b Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Sun, 7 Apr 2024 20:26:52 +0900 Subject: [PATCH 09/19] Make intent-filter android.intent.action.PROCESS_TEXT optional --- app/src/main/AndroidManifest.xml | 22 ++++++++++--------- .../ddo/hotmist/unicodepad/SettingActivity.kt | 16 +++++++++++++- app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/setting.xml | 4 ++++ 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d59854b..4d4a3d9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ - + @@ -65,20 +65,22 @@ + + + + + - - - - - - - - + diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt index 9b0ec56..87c567f 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt @@ -18,8 +18,10 @@ package jp.ddo.hotmist.unicodepad import android.app.AlertDialog +import android.content.ComponentName import android.content.DialogInterface import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle @@ -33,7 +35,6 @@ import androidx.preference.* import org.json.JSONException import org.json.JSONObject import java.io.IOException -import java.util.* class SettingActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -111,6 +112,7 @@ class SettingActivity : BaseActivity() { setText(findPreference("checker")!!) setText(findPreference("recentsize")!!) setEntry(findPreference("scroll")!!) + findPreference("process_text")!!.onPreferenceChangeListener = this findPreference("legal_app")!!.also { it.setOnPreferenceClickListener { openPage("https://github.com/Ryosuke839/UnicodePad") @@ -164,6 +166,16 @@ class SettingActivity : BaseActivity() { Toast.makeText(activity, R.string.theme_title, Toast.LENGTH_SHORT).show() activity.setResult(RESULT_FIRST_USER) } + if (key == "process_text") { + val packageName = activity.packageName + val newState = + if (newValue as Boolean) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED + activity.packageManager.setComponentEnabledSetting( + ComponentName(packageName, "$packageName.UnicodeActivityAlias"), + newState, PackageManager.DONT_KILL_APP + ) + return true + } } preference.summary = if (preference is ListPreference) preference.entries[preference.findIndexOfValue(newValue.toString())] else newValue.toString() return true @@ -243,6 +255,7 @@ class SettingActivity : BaseActivity() { it.put("ime", if (pref.contains("ime")) pref.getBoolean("ime", true) else null) it.put("clear", if (pref.contains("clear")) pref.getBoolean("clear", true) else null) it.put("buttons", if (pref.contains("buttons")) pref.getBoolean("buttons", true) else null) + it.put("process_text", if (pref.contains("process_text")) pref.getBoolean("process_text", true) else null) it.put("scroll", pref.getString("scroll", null)) it.put("recentsize", pref.getString("recentsize", null)) }) @@ -366,6 +379,7 @@ class SettingActivity : BaseActivity() { (it.opt("ime") as? Boolean)?.let { bool -> edit.putBoolean("ime", bool) } (it.opt("clear") as? Boolean)?.let { bool -> edit.putBoolean("clear", bool) } (it.opt("buttons") as? Boolean)?.let { bool -> edit.putBoolean("buttons", bool) } + (it.opt("process_text") as? Boolean)?.let { bool -> edit.putBoolean("process_text", bool) } (it.opt("scroll") as? String)?.let { str -> edit.putString("scroll", str) } (it.opt("recentsize") as? String)?.let { str -> edit.putString("recentsize", str) } } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8d9596b..1e50643 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -433,6 +433,7 @@ IMEを無効化 全削除ボタンを表示 ボタン行を表示 + テキスト選択メニューから起動する ZIP内のファイル名が破損 法的表記 本アプリケーションはUnicode Data Fileの改変された版を含んでいます。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b1e3f0..49a1d5f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -478,6 +478,7 @@ Disable IME Show clear button Show button row + Launch from text selection context menu <not a character> diff --git a/app/src/main/res/xml/setting.xml b/app/src/main/res/xml/setting.xml index b1d7ba8..e5b3143 100644 --- a/app/src/main/res/xml/setting.xml +++ b/app/src/main/res/xml/setting.xml @@ -157,6 +157,10 @@ android:inputType="number" android:summary="" android:title="@string/recent_desc" /> + Date: Sat, 4 May 2024 23:51:40 +0900 Subject: [PATCH 10/19] Migrate to Jetpack Compose --- app/build.gradle | 16 +- app/src/fdroid/AndroidManifest.xml | 24 +- app/src/fdroid/res/layout/ad_container.xml | 1 - .../jp/ddo/hotmist/unicodepad/EmojiAdapter.kt | 2 +- .../ddo/hotmist/unicodepad/FavoriteAdapter.kt | 1 - .../jp/ddo/hotmist/unicodepad/FileChooser.kt | 1 - .../jp/ddo/hotmist/unicodepad/FontChooser.kt | 1 - .../jp/ddo/hotmist/unicodepad/ListAdapter.kt | 1 - .../ddo/hotmist/unicodepad/LocaleChooser.kt | 9 +- .../ddo/hotmist/unicodepad/RecentAdapter.kt | 1 - .../ddo/hotmist/unicodepad/SettingActivity.kt | 4 +- .../ddo/hotmist/unicodepad/UnicodeActivity.kt | 589 +++++++++++++----- .../ddo/hotmist/unicodepad/UnicodeAdapter.kt | 4 +- app/src/main/res/layout/main.xml | 178 ------ app/src/main/res/layout/main_emojicompat.xml | 180 ------ .../res/layout/spinner_drop_down_item.xml | 3 +- .../res/layout/spinner_drop_down_void.xml | 3 +- app/src/main/res/values/ids.xml | 5 + app/src/play/res/layout/ad_container.xml | 8 - build.gradle | 2 +- 20 files changed, 471 insertions(+), 562 deletions(-) delete mode 100644 app/src/fdroid/res/layout/ad_container.xml delete mode 100644 app/src/main/res/layout/main.xml delete mode 100644 app/src/main/res/layout/main_emojicompat.xml delete mode 100644 app/src/play/res/layout/ad_container.xml diff --git a/app/build.gradle b/app/build.gradle index ba280b0..c6b510c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "jp.ddo.hotmist.unicodepad" - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion 34 versionCode 61 versionName "2.13.4" @@ -21,6 +21,14 @@ android { jvmTarget = "1.8" } + buildFeatures { + compose true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.2" + } + buildTypes { release { shrinkResources true @@ -59,6 +67,12 @@ dependencies { implementation 'com.github.woxthebox:draglistview:1.7.3' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'com.github.mreram:showcaseview:1.4.1' + implementation 'androidx.compose.ui:ui-tooling-preview' + debugImplementation 'androidx.compose.ui:ui-tooling' + implementation 'androidx.compose.ui:ui-android:1.6.5' + implementation 'androidx.activity:activity-compose:1.8.2' + implementation 'androidx.compose.material3:material3:1.2.1' + implementation 'androidx.compose.material:material-icons-extended:1.6.5' playImplementation 'com.google.android.gms:play-services-ads-lite:22.3.0' } diff --git a/app/src/fdroid/AndroidManifest.xml b/app/src/fdroid/AndroidManifest.xml index e5935ea..3e978bf 100644 --- a/app/src/fdroid/AndroidManifest.xml +++ b/app/src/fdroid/AndroidManifest.xml @@ -16,13 +16,13 @@ --> + android:installLocation="auto"> - + @@ -61,20 +61,22 @@ + + + + + - - - - - - - - + diff --git a/app/src/fdroid/res/layout/ad_container.xml b/app/src/fdroid/res/layout/ad_container.xml deleted file mode 100644 index cd16f74..0000000 --- a/app/src/fdroid/res/layout/ad_container.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/EmojiAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/EmojiAdapter.kt index 0b172c5..543ee7e 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/EmojiAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/EmojiAdapter.kt @@ -119,7 +119,7 @@ internal class EmojiAdapter(activity: Activity, pref: SharedPreferences, private } override fun onNothingSelected(parent: AdapterView<*>?) {} } }, LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)) - if (Build.VERSION.SDK_INT >= 21) hl.setPadding(0, (activity.resources.displayMetrics.density * 8f).toInt(), 0, (activity.resources.displayMetrics.density * 8f).toInt()) + hl.setPadding(0, (activity.resources.displayMetrics.density * 8f).toInt(), 0, (activity.resources.displayMetrics.density * 8f).toInt()) layout.addView(hl, LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) layout.addView(this.view, LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1f)) initViews() diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/FavoriteAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/FavoriteAdapter.kt index fa3a76d..810bd10 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/FavoriteAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/FavoriteAdapter.kt @@ -17,7 +17,6 @@ package jp.ddo.hotmist.unicodepad import android.app.Activity import android.content.SharedPreferences -import androidx.recyclerview.widget.RecyclerView import java.util.* internal class FavoriteAdapter(activity: Activity, pref: SharedPreferences, db: NameDatabase, single: Boolean) : DragListUnicodeAdapter(activity, db, single) { diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/FileChooser.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/FileChooser.kt index 8dd41f6..436ea72 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/FileChooser.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/FileChooser.kt @@ -139,7 +139,6 @@ internal class FileChooser(private val activity: Activity, private val listener: try { if (path.length == 1) { val dirs = Array(4) {""} - @Suppress("DEPRECATION") dirs[0] = Environment.getExternalStorageDirectory().canonicalPath dirs[1] = Environment.getDataDirectory().canonicalPath dirs[2] = Environment.getDownloadCacheDirectory().canonicalPath diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/FontChooser.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/FontChooser.kt index dcd55e3..5038dc4 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/FontChooser.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/FontChooser.kt @@ -18,7 +18,6 @@ import android.app.AlertDialog import android.content.Intent import android.content.SharedPreferences import android.graphics.Typeface -import android.os.Build import androidx.preference.PreferenceManager import android.view.View import android.widget.AdapterView diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt index 3f0324b..4067088 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt @@ -51,7 +51,6 @@ internal class ListAdapter(activity: Activity, pref: SharedPreferences, db: Name private val blockToIndex: MutableList = ArrayList() private val marks: NavigableMap = TreeMap() private var jump: Spinner? = null - private var jumpAdapter: SpinnerAdapter? = null private var mark: Spinner? = null private var code: Button? = null private var current = -1 diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/LocaleChooser.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/LocaleChooser.kt index 2822b3f..65cc657 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/LocaleChooser.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/LocaleChooser.kt @@ -42,14 +42,7 @@ class LocaleChooser internal constructor(private val context: Context, private v } while (locales.last() !is String) locales.removeLast() - locales.add(if (Build.VERSION.SDK_INT >= 21) Locale.forLanguageTag(locale) else { - val components = locale.split("_") - when (components.size) { - 1 -> Locale(components[0]) - 2 -> Locale(components[0], components[1]) - else -> Locale(components[0], components[1], components[2]) - } - }) + locales.add(Locale.forLanguageTag(locale)) adapter.notifyDataSetChanged() spinner.setSelection(locales.lastIndex) } diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/RecentAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/RecentAdapter.kt index ca03957..a83e7ab 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/RecentAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/RecentAdapter.kt @@ -17,7 +17,6 @@ package jp.ddo.hotmist.unicodepad import android.app.Activity import android.content.SharedPreferences -import androidx.recyclerview.widget.RecyclerView import java.util.* internal class RecentAdapter(activity: Activity, pref: SharedPreferences, db: NameDatabase, single: Boolean) : DragListUnicodeAdapter(activity, db, single) { diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt index 87c567f..08cb878 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/SettingActivity.kt @@ -198,7 +198,7 @@ class SettingActivity : BaseActivity() { super.onActivityResult(requestCode, resultCode, data) if (requestCode == SETTING_EXPORT_CODE) if (resultCode == RESULT_OK && data != null) { val uri = data.data ?: return - val pref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.activity) + val pref = PreferenceManager.getDefaultSharedPreferences(this.activity) val padding = (resources.displayMetrics.density * 8f).toInt() val cbSetting = CheckBox(this.activity).also { it.setText(R.string.data_setting) @@ -353,7 +353,7 @@ class SettingActivity : BaseActivity() { hl.addView(cbFavoriteMerge, LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) hl.addView(cbScroll, LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) }).setTitle(R.string.imported_data).setPositiveButton(R.string.import_confirm) { _: DialogInterface, _: Int -> - val pref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.activity) + val pref = PreferenceManager.getDefaultSharedPreferences(this.activity) val edit = pref.edit() if (cbSetting.isChecked) { obj.optJSONObject("setting")?.also { diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeActivity.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeActivity.kt index 5b001e7..f1b684a 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeActivity.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeActivity.kt @@ -27,16 +27,44 @@ import android.os.Handler import android.os.Process import android.provider.OpenableColumns import android.text.* +import android.util.TypedValue import android.view.* import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.* +import androidx.activity.compose.setContent +import androidx.appcompat.content.res.AppCompatResources +import androidx.appcompat.widget.AppCompatEditText +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.res.getResourceIdOrThrow import androidx.core.view.doOnLayout import androidx.emoji2.bundled.BundledEmojiCompatConfig import androidx.emoji2.text.EmojiCompat import androidx.emoji2.text.EmojiCompat.InitCallback +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import androidx.preference.PreferenceManager +import androidx.viewpager.widget.PagerTabStrip import androidx.viewpager.widget.ViewPager import smartdevelop.ir.eram.showcaseviewlib.GuideView import smartdevelop.ir.eram.showcaseviewlib.config.DismissType @@ -53,12 +81,15 @@ import kotlin.math.min @Suppress("DEPRECATION") class UnicodeActivity : BaseActivity() { private lateinit var editText: EditText - private lateinit var btnClear: ImageButton - private lateinit var btnRow: LinearLayout + private var initialText by mutableStateOf(null) + private var showBtnClear by mutableStateOf(false) + private var showBtnRow by mutableStateOf(true) + private var finishAction by mutableIntStateOf(R.string.finish) private lateinit var btnFinish: Button private lateinit var chooser: FontChooser private lateinit var locale: LocaleChooser - private lateinit var scroll: LockableScrollView + private var scrollUi by mutableStateOf(false) + private var scroll: LockableScrollView? = null private lateinit var pager: ViewPager internal lateinit var adpPage: PageAdapter private lateinit var itemUndo: MenuItem @@ -73,6 +104,8 @@ class UnicodeActivity : BaseActivity() { private var timer = 500 private val history = mutableListOf(Triple("", 0, 0)) private var historyCursor = 0 + private val viewTargets = mutableMapOf() + private val composed = mutableStateOf(false) @SuppressLint("ClickableViewAccessibility") public override fun onCreate(savedInstanceState: Bundle?) { pref = PreferenceManager.getDefaultSharedPreferences(this) @@ -94,156 +127,408 @@ class UnicodeActivity : BaseActivity() { } super.onCreate(savedInstanceState) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) - setContentView(if (useEmoji == "null") R.layout.main else R.layout.main_emojicompat) - editText = findViewById(R.id.text).also { - it.setOnTouchListener { view: View, motionEvent: MotionEvent -> - view.onTouchEvent(motionEvent) - if (disableime) (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view.windowToken, 0) - true - } - it.textSize = fontsize - it.setOnEditorActionListener { _, actionId, keyEvent -> - if (keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER && keyEvent.action == KeyEvent.ACTION_DOWN || actionId == EditorInfo.IME_ACTION_DONE) { - btnFinish.performClick() - true - } else - false - } - it.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { - } - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - } + setContent { + Column( + modifier = Modifier.fillMaxHeight(), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .height(IntrinsicSize.Min), + ) { + Box( + modifier = Modifier.weight(1f), + ) { + AndroidView( + factory = { context -> + if (useEmoji != "null") { AppCompatEditText(context) } else { EditText(context) }.apply { + setOnTouchListener { view: View, motionEvent: MotionEvent -> + view.onTouchEvent(motionEvent) + if (disableime) (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow( + view.windowToken, + 0 + ) + true + } + textSize = fontsize + maxLines = 1 + inputType = InputType.TYPE_CLASS_TEXT + setOnEditorActionListener { _, actionId, keyEvent -> + if (keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER && keyEvent.action == KeyEvent.ACTION_DOWN || actionId == EditorInfo.IME_ACTION_DONE) { + btnFinish.performClick() + true + } else + false + } + addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } - override fun afterTextChanged(s: Editable?) { - if (!::itemUndo.isInitialized) { - history[0] = Triple(s.toString(), 0, 0) - return - } - if (s.toString() == history[historyCursor].first) { - return - } - while (history.size > historyCursor + 1) { - history.removeLast() - } - while (history.size >= MAX_HISTORY) { - history.removeFirst() + override fun onTextChanged( + s: CharSequence?, + start: Int, + before: Int, + count: Int + ) { + } + + override fun afterTextChanged(s: Editable?) { + if (!::itemUndo.isInitialized) { + history[0] = Triple(s.toString(), 0, 0) + return + } + if (s.toString() == history[historyCursor].first) { + return + } + while (history.size > historyCursor + 1) { + history.removeLast() + } + while (history.size >= MAX_HISTORY) { + history.removeFirst() + } + history.add( + Triple( + s.toString(), + selectionStart, + selectionEnd + ) + ) + historyCursor = history.size - 1 + itemUndo.isEnabled = historyCursor > 0 + itemRedo.isEnabled = false + } + }) + requestFocus() + editText = this + } + }, + update = { + it.apply { + imeOptions = when (finishAction) { + R.string.finish -> EditorInfo.IME_ACTION_DONE + else -> EditorInfo.IME_ACTION_SEND + } + if (initialText != null) { + setText(initialText) + setSelection(length()) + initialText = null + } + } + }, + modifier = Modifier.fillMaxWidth(), + ) + if (showBtnClear) { + AndroidView( + factory = { context -> ImageButton(context).apply { + setImageResource(R.drawable.ic_action_cancel) + contentDescription = resources.getString(R.string.clear) + scaleType = ImageView.ScaleType.CENTER_INSIDE + setOnClickListener { + editText.setText("") + } + TypedValue().also { value -> + context.theme.resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, value, true) + background = AppCompatResources.getDrawable(context, value.resourceId) + } + } }, + modifier = Modifier + .align(Alignment.CenterEnd) + .padding(end = 4.dp), + ) + } } - history.add(Triple(s.toString(), it.selectionStart, it.selectionEnd)) - historyCursor = history.size - 1 - itemUndo.isEnabled = historyCursor > 0 - itemRedo.isEnabled = false + AndroidView( + factory = { context -> ImageButton(context).apply { + setImageResource(R.drawable.ic_action_backspace) + contentDescription = resources.getString(R.string.erase) + scaleType = ImageView.ScaleType.CENTER_INSIDE + cropToPadding = false + setOnTouchListener { view, motionEvent -> + view.onTouchEvent(motionEvent) + when (motionEvent.action) { + MotionEvent.ACTION_DOWN -> if (delay == null) { + delay = Runnable { + val str = editText.editableText.toString() + if (str.isEmpty()) return@Runnable + val start = editText.selectionStart + if (start < 1) return@Runnable + val end = editText.selectionEnd + if (start != end) editText.editableText.delete(min(start, end), max(start, end)) else if (start > 1 && Character.isSurrogatePair(str[start - 2], str[start - 1])) editText.editableText.delete(start - 2, start) else editText.editableText.delete(start - 1, start) + if (delay != null) { + editText.postDelayed(delay, timer.toLong()) + if (timer > 100) timer -= 200 + } + } + editText.post(delay) + } + MotionEvent.ACTION_UP -> { + editText.removeCallbacks(delay) + delay = null + timer = 500 + } + } + true + } + } }, + modifier = Modifier + .align(Alignment.CenterVertically) + .fillMaxHeight(), + ) } - }) - } - findViewById