From 958bff60d1a49115f9c118ee00fed6bd82592145 Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 15:52:40 +0800 Subject: [PATCH 01/12] Update dependencies --- android/build.gradle.kts | 11 +++++----- android/src/main/AndroidManifest.xml | 3 +-- build.gradle.kts | 20 +++++++++---------- common/build.gradle.kts | 1 + common/src/androidMain/AndroidManifest.xml | 2 +- .../repository/Repository.kt | 3 +++ gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index ad717d2..6ebc66f 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdk = 32 + compileSdk = 33 defaultConfig { applicationId = "me.konyaco.collinsdictionary" minSdk = 21 - targetSdk = 32 + targetSdk = 33 versionCode = 8 versionName = "1.4.5" } @@ -43,14 +43,15 @@ android { kotlinOptions { jvmTarget = "11" } + namespace = "me.konyaco.collinsdictionary" } dependencies { implementation(project(":common")) implementation("org.jsoup:jsoup:${rootProject.extra["jsoup_version"]}") - implementation("androidx.core:core-ktx:1.8.0") - implementation("androidx.activity:activity-compose:1.4.0") - implementation("androidx.appcompat:appcompat:1.4.2") + implementation("androidx.core:core-ktx:1.9.0") + implementation("androidx.activity:activity-compose:1.6.0") + implementation("androidx.appcompat:appcompat:1.5.1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.3") } \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index d555139..5b1d997 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/repository/Repository.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/repository/Repository.kt index 5a5a365..60b87fc 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/repository/Repository.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/repository/Repository.kt @@ -25,6 +25,9 @@ class Repository( when (localResult) { is SearchResult.PreciseWord -> emit(Result(Result.Source.LOCAL, localResult)) is SearchResult.Redirect -> emit(Result(Result.Source.LOCAL, localResult)) + else -> { + // TODO: + } } val remoteResult = onlineDictionary.search(word) localCacheDictionary.cacheSearchResult(word, remoteResult) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e10706..2734b8e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue May 24 19:19:27 CST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 27ead8020419872b3ba973ace0c5bd62b5a2e01e Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 16:14:28 +0800 Subject: [PATCH 02/12] [Code] Add system tray support. [UI] Change default window size. [BUILD] Change default JVM heap size. --- desktop/build.gradle.kts | 2 ++ desktop/src/jvmMain/kotlin/Main.kt | 51 ++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index f9d77b0..2de024b 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -26,6 +26,8 @@ kotlin { compose.desktop { application { mainClass = "MainKt" + jvmArgs.add("-Xms8m") + jvmArgs.add("-Xmx128m") nativeDistributions { targetFormats(TargetFormat.Exe, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Rpm) packageName = "CollinsDictionary" diff --git a/desktop/src/jvmMain/kotlin/Main.kt b/desktop/src/jvmMain/kotlin/Main.kt index 968e098..4de458e 100644 --- a/desktop/src/jvmMain/kotlin/Main.kt +++ b/desktop/src/jvmMain/kotlin/Main.kt @@ -1,6 +1,8 @@ +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.* import me.konyaco.collinsdictionary.repository.Repository import me.konyaco.collinsdictionary.service.CollinsOnlineDictionary import me.konyaco.collinsdictionary.service.LocalCacheDictionary @@ -31,13 +33,44 @@ fun Repository(): Repository { fun gui() { val viewModel = AppViewModel(Repository()) application { - Window( - onCloseRequest = ::exitApplication, - title = "Collins Dictionary", - icon = painterResource("icon.png") - ) { - MyTheme { - App(viewModel) + val icon = painterResource("icon.png") + var display by remember { mutableStateOf(true) } + var isPinned by remember { mutableStateOf(false) } + + Tray(icon, + onAction = { display = true }, + tooltip = "Collins Dictionary", + menu = { + CheckboxItem("Always on Top", isPinned, onCheckedChange = { + isPinned = it + }) + Item("Close", onClick = { + exitApplication() + }) + } + ) + + if (display) { + Window( + onCloseRequest = { + display = false + System.gc() + }, + title = "Collins Dictionary", + icon = icon, + state = rememberWindowState( + width = 420.dp, height = 800.dp, + position = WindowPosition(Alignment.CenterEnd) + ), + alwaysOnTop = isPinned + ) { + LaunchedEffect(Unit) { + System.gc() + } + + MyTheme { + App(viewModel) + } } } } From c2f0c680d56bd6186c027830b4fac8d13e8a6b1f Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 16:15:46 +0800 Subject: [PATCH 03/12] [Code] Use system proxy --- .../service/CollinsOnlineDictionary.kt | 18 ++++++++++++++++-- desktop/src/jvmMain/kotlin/Main.kt | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index 643b9d7..82b8abc 100644 --- a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -8,11 +8,25 @@ import io.ktor.client.statement.* import io.ktor.http.* import org.jsoup.Jsoup import org.jsoup.nodes.Element +import java.net.ProxySelector +import java.net.URI import java.util.* actual class CollinsOnlineDictionary : CollinsDictionary { - private val client = HttpClient(CIO) { followRedirects = false } - private val clientFollowRedirect = HttpClient(CIO) + private val client = HttpClient(CIO) { + config() + followRedirects = false + } + private val clientFollowRedirect = HttpClient(CIO) { config() } + + private fun HttpClientConfig<*>.config() { + engine { + val proxy = + ProxySelector.getDefault().select(URI("https://www.collinsdictionary.com")) + .firstOrNull() + this.proxy = proxy + } + } companion object { private const val SEARCH_URL = "https://www.collinsdictionary.com/search" diff --git a/desktop/src/jvmMain/kotlin/Main.kt b/desktop/src/jvmMain/kotlin/Main.kt index 4de458e..972b2d1 100644 --- a/desktop/src/jvmMain/kotlin/Main.kt +++ b/desktop/src/jvmMain/kotlin/Main.kt @@ -13,6 +13,7 @@ import me.konyaco.collinsdictionary.viewmodel.AppViewModel import java.io.File suspend fun main(args: Array) { + System.setProperty("java.net.useSystemProxies", "true") if (args.getOrNull(0) == "cli") cli() else gui() } From e411a17e2cef1a8b61d6502ef21d73c180c909ed Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 16:24:37 +0800 Subject: [PATCH 04/12] [Code] Common update --- .../service/CollinsOnlineDictionary.kt | 2 +- .../collinsdictionary/ui/MyTheme.android.kt | 11 ---- .../konyaco/collinsdictionary/ui/MyTheme.kt | 10 ++- .../ui/component/CobuildDictionarySection.kt | 6 ++ .../ui/component/Synonyms.kt | 63 +++++++++++++++++++ .../service/CollinsOnlineDictionary.kt | 2 +- .../collinsdictionary/ui/MyTheme.desktop.kt | 12 ---- 7 files changed, 80 insertions(+), 26 deletions(-) create mode 100644 common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt diff --git a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index 023437a..b098495 100644 --- a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -224,7 +224,7 @@ private class DefinitionParser { sentence, null, null, - emptyList() + null ) // TODO: 2021/7/28 Grammar pattern and sound url. } diff --git a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.android.kt b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.android.kt index 5cebadb..e734fc4 100644 --- a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.android.kt +++ b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.android.kt @@ -1,22 +1,11 @@ package me.konyaco.collinsdictionary.ui -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Typography import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontFamily import me.konyaco.collinsdictionary.common.R -@Composable -actual fun MyTheme(content: @Composable () -> Unit) { - MaterialTheme( - colors = if (isSystemInDarkTheme()) darkColors else lightColors, - typography = Typography(defaultFontFamily = RobotoFontFamily), - content = content - ) -} actual object MyRes { actual val Sound: Painter diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.kt index 21f1c3d..9ef162a 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.kt @@ -1,6 +1,8 @@ package me.konyaco.collinsdictionary.ui import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Typography import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable @@ -46,7 +48,13 @@ internal val darkColors = darkColors( ) @Composable -expect fun MyTheme(content: @Composable () -> Unit) +fun MyTheme(darkMode: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) { + MaterialTheme( + colors = if (darkMode) darkColors else lightColors, + typography = Typography(defaultFontFamily = RobotoFontFamily), + content = content + ) +} expect object MyRes { val Sound: Painter diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt index 866e2aa..da295e5 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt @@ -242,6 +242,12 @@ private fun Definitions(definitionEntries: List, modifier: Modi Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { entry.definition.examples.forEach { example -> ExampleSentence(example.sentence) + example.synonyms?.let { + Synonyms( + modifier = Modifier.padding(start = 18.dp).fillMaxWidth(), + words = it + ) + } } } } diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt new file mode 100644 index 0000000..54becab --- /dev/null +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt @@ -0,0 +1,63 @@ +package me.konyaco.collinsdictionary.ui.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.* +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import me.konyaco.collinsdictionary.ui.SourceSerifProFontFamily + +@Composable +fun Synonyms( + modifier: Modifier, + words: List +) { + Surface( + modifier = modifier.wrapContentHeight(), + color = if (MaterialTheme.colors.isLight) Color.Transparent + else Color(0xFF424242), + contentColor = MaterialTheme.colors.onSurface, + border = if (MaterialTheme.colors.isLight) BorderStroke( + 1.dp, + MaterialTheme.colors.onSurface.copy(0.12f) + ) + else null + ) { + Box(Modifier.wrapContentHeight()) { + Column(Modifier.padding(14.dp)) { + Text( + text = "SYNONYMS", + fontSize = 14.sp + ) + Spacer(Modifier.height(4.dp)) + + Row { + words.forEachIndexed { i, s -> + Text( + text = s, + textDecoration = TextDecoration.Underline, + fontSize = 16.sp, + fontFamily = SourceSerifProFontFamily, + lineHeight = 22.sp + ) + if (i < words.size - 1) { + Text( + text = ", ", + fontSize = 16.sp, + fontFamily = SourceSerifProFontFamily, + lineHeight = 22.sp + ) + } + } + // TODO(2022/7/5): FlowLayout + } + } + } + } +} \ No newline at end of file diff --git a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index 82b8abc..e885030 100644 --- a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -237,7 +237,7 @@ private class DefinitionParser { sentence, null, null, - emptyList() + null ) // TODO: 2021/7/28 Grammar pattern and sound url. } diff --git a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.desktop.kt b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.desktop.kt index daa3400..25beb86 100644 --- a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.desktop.kt +++ b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/ui/MyTheme.desktop.kt @@ -1,8 +1,5 @@ package me.konyaco.collinsdictionary.ui -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Typography import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource @@ -11,15 +8,6 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.platform.Font -@Composable -actual fun MyTheme(content: @Composable () -> Unit) { - MaterialTheme( - colors = if (isSystemInDarkTheme()) darkColors else lightColors, - typography = Typography(defaultFontFamily = RobotoFontFamily), - content = content - ) -} - actual object MyRes { actual val Sound: Painter @Composable From 87d6036c8e40b95cf244e59aa75aaafc60c5b1c3 Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 17:13:57 +0800 Subject: [PATCH 05/12] [Feature] Support synonyms --- .../service/CollinsOnlineDictionary.kt | 15 ++++++++++++++- .../service/CollinsOnlineDictionary.kt | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index b098495..9ace2cd 100644 --- a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -224,7 +224,7 @@ private class DefinitionParser { sentence, null, null, - null + SynonymParser.parse(senseElement) ) // TODO: 2021/7/28 Grammar pattern and sound url. } @@ -243,4 +243,17 @@ private class DefinitionParser { return definitionEntries } +} + +private object SynonymParser { + fun parse(synonymElement: Element): List? { + val result = mutableListOf() + val thesElement = synonymElement.getElementsByClass("thes").first() + ?: return null + + thesElement.getElementsByClass("form ref").forEach { // + result.add(it.text()) + } + return result + } } \ No newline at end of file diff --git a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index e885030..bf71825 100644 --- a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -237,7 +237,7 @@ private class DefinitionParser { sentence, null, null, - null + SynonymParser.parse(senseElement) ) // TODO: 2021/7/28 Grammar pattern and sound url. } @@ -256,4 +256,17 @@ private class DefinitionParser { return definitionEntries } +} + +private object SynonymParser { + fun parse(synonymElement: Element): List? { + val result = mutableListOf() + val thesElement = synonymElement.getElementsByClass("thes").first() + ?: return null + + thesElement.getElementsByClass("form ref").forEach { // + result.add(it.text()) + } + return result + } } \ No newline at end of file From 18c6cd4c74e10d803cb9a62a6b23e0d2330b27d8 Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 17:21:10 +0800 Subject: [PATCH 06/12] Fix and update dependencies --- build.gradle.kts | 4 ++-- common/build.gradle.kts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 54468a8..d60d50f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.application") version "7.3.0" apply false - id("com.android.library") version "7.3.0" apply false + id("com.android.application") version "7.3.1" apply false + id("com.android.library") version "7.3.1" apply false kotlin("android") version "1.7.20" apply false kotlin("multiplatform") version "1.7.20" apply false id("org.jetbrains.compose") version "1.2.0" apply false diff --git a/common/build.gradle.kts b/common/build.gradle.kts index abc3c57..456ae32 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -33,8 +33,8 @@ kotlin { } val androidMain by getting { dependencies { - api("androidx.appcompat:appcompat:1.4.2") - api("androidx.core:core-ktx:1.8.0") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.9.0") api("io.ktor:ktor-client-cio:$ktorVersion") implementation("org.jsoup:jsoup:$jsoupVersion") } @@ -53,12 +53,12 @@ kotlin { } name.contains("mac") -> { implementation("org.openjfx:javafx-base:$javaFxVersion:mac") - implementation("org.openjfx:javafx-graphics:$javaFxVersion:win") + implementation("org.openjfx:javafx-graphics:$javaFxVersion:mac") implementation("org.openjfx:javafx-media:$javaFxVersion:mac") } name.contains("linux") -> { implementation("org.openjfx:javafx-base:$javaFxVersion:linux") - implementation("org.openjfx:javafx-graphics:$javaFxVersion:win") + implementation("org.openjfx:javafx-graphics:$javaFxVersion:linux") implementation("org.openjfx:javafx-media:$javaFxVersion:linux") } } From bf4c7a961dfe65c9e1da40ef56c4ad94d4a74fe3 Mon Sep 17 00:00:00 2001 From: 123Duo3 <468673794@qq.com> Date: Fri, 21 Oct 2022 19:28:28 +0800 Subject: [PATCH 07/12] [UI] Improved the style of synonyms. --- .gitignore | 1 + .../me/konyaco/collinsdictionary/ui/component/Synonyms.kt | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index c1ededb..6bd6327 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /common/build/ /android/build/ /desktop/build/ +local.properties diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt index 54becab..81dcd24 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/Synonyms.kt @@ -20,17 +20,15 @@ fun Synonyms( ) { Surface( modifier = modifier.wrapContentHeight(), - color = if (MaterialTheme.colors.isLight) Color.Transparent - else Color(0xFF424242), + color = Color.Transparent, contentColor = MaterialTheme.colors.onSurface, - border = if (MaterialTheme.colors.isLight) BorderStroke( + border = BorderStroke( 1.dp, MaterialTheme.colors.onSurface.copy(0.12f) ) - else null ) { Box(Modifier.wrapContentHeight()) { - Column(Modifier.padding(14.dp)) { + Column(Modifier.padding(14.dp, 10.dp, 14.dp, 14.dp)) { Text( text = "SYNONYMS", fontSize = 14.sp From 9df66b995d9b9b2288d0f689082749e88f071bd6 Mon Sep 17 00:00:00 2001 From: 123Duo3 <468673794@qq.com> Date: Fri, 21 Oct 2022 19:29:16 +0800 Subject: [PATCH 08/12] Delete local.properties --- local.properties | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 local.properties diff --git a/local.properties b/local.properties deleted file mode 100644 index d1226c3..0000000 --- a/local.properties +++ /dev/null @@ -1,8 +0,0 @@ -## This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -#Sat Aug 07 04:01:47 CST 2021 -sdk.dir=C\:\\Users\\atwzj\\AppData\\Local\\Android\\Sdk From 848afbf4eb71c0e822b4e7b716403d7094a82699 Mon Sep 17 00:00:00 2001 From: 123Duo3 <468673794@qq.com> Date: Fri, 21 Oct 2022 20:17:39 +0800 Subject: [PATCH 09/12] [UI] Support themed icon --- .gitignore | 4 +++- .../res/drawable/ic_launcher_monochrome.xml | 20 +++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 1 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 1 + gradlew | 0 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 android/src/main/res/drawable/ic_launcher_monochrome.xml mode change 100644 => 100755 gradlew diff --git a/.gitignore b/.gitignore index 6bd6327..e3e13b0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ /common/build/ /android/build/ /desktop/build/ -local.properties +/local.properties +/desktop/cache/ +/gradle/.DS_Store diff --git a/android/src/main/res/drawable/ic_launcher_monochrome.xml b/android/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000..3dc4a2d --- /dev/null +++ b/android/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 7353dbd..1413a31 100644 --- a/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 7353dbd..1413a31 100644 --- a/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From a4fc9e80a27d457c2433ff74b06ac63b1c6bbba3 Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 20:51:05 +0800 Subject: [PATCH 10/12] [Fix] Bug fixes --- .../service/CollinsOnlineDictionary.kt | 6 +- .../service/CollinsDictionary.kt | 6 +- .../service/LocalCacheDictionary.kt | 8 +- .../ui/component/CobuildDictionarySection.kt | 114 ++++++++++-------- .../service/CollinsOnlineDictionary.kt | 6 +- 5 files changed, 82 insertions(+), 58 deletions(-) diff --git a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index 9ace2cd..b7dfdf7 100644 --- a/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/androidMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -223,8 +223,7 @@ private class DefinitionParser { ExampleSentence( sentence, null, - null, - SynonymParser.parse(senseElement) + null ) // TODO: 2021/7/28 Grammar pattern and sound url. } @@ -234,7 +233,8 @@ private class DefinitionParser { type = grammarGroup, definition = Definition( def = def, - examples = examples + examples = examples, + synonyms = SynonymParser.parse(senseElement) ), extraDefinitions = emptyList() // TODO: 2021/7/28 Extra definitions. ) diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/CollinsDictionary.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/CollinsDictionary.kt index a4349c9..d4ecb28 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/CollinsDictionary.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/CollinsDictionary.kt @@ -57,13 +57,13 @@ data class DefinitionEntry( @Serializable data class Definition( val def: String, - val examples: List + val examples: List, + val synonyms: List? ) @Serializable data class ExampleSentence( val sentence: String, val grammarPattern: String?, - val soundUrl: String?, - val synonyms: List? + val soundUrl: String? ) \ No newline at end of file diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/LocalCacheDictionary.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/LocalCacheDictionary.kt index 58c32f1..66b9491 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/LocalCacheDictionary.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/service/LocalCacheDictionary.kt @@ -1,5 +1,6 @@ package me.konyaco.collinsdictionary.service +import kotlinx.serialization.SerializationException import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -21,7 +22,12 @@ class LocalCacheDictionary(private val localStorage: LocalStorage) : CollinsDict override suspend fun getDefinition(word: String): Word? { val text = localStorage.getDefinition(word) ?: return null - return json.decodeFromString(text) + return try { + json.decodeFromString(text) + } catch (e: SerializationException) { + localStorage.deleteDefinition(word) + null + } } fun cacheSearchResult(word: String, searchResult: SearchResult) { diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt index da295e5..595bddf 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt @@ -19,10 +19,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import me.konyaco.collinsdictionary.service.CobuildDictionarySection -import me.konyaco.collinsdictionary.service.DefinitionEntry -import me.konyaco.collinsdictionary.service.LocalSoundPlayer -import me.konyaco.collinsdictionary.service.WordForm +import me.konyaco.collinsdictionary.service.* import me.konyaco.collinsdictionary.ui.MyRes import me.konyaco.collinsdictionary.ui.SourceSerifProFontFamily @@ -207,51 +204,72 @@ private fun Definitions(definitionEntries: List, modifier: Modi Divider("DEFINITIONS") Spacer(Modifier.height(8.dp)) definitionEntries.forEach { entry -> - // Word Type - Row { - Text( - text = "${entry.index}.", - color = MaterialTheme.colors.primary, - fontSize = 14.sp - ) - Spacer(Modifier.width(4.dp)) - Text( - text = entry.type.uppercase(), - color = MaterialTheme.colors.onBackground, - fontSize = 14.sp - ) - } - Spacer(Modifier.height(8.dp)) - Column(Modifier.widthIn(max = with(LocalDensity.current) { - // https://material.io/design/typography/understanding-typography.html#readability - // According to Material Guidance, 40 - 60 characters width is the best. - (16.sp * 50).toDp() - })) { - // Definition - Text( - modifier = Modifier.padding(horizontal = 18.dp), - text = entry.definition.def, - fontSize = 16.sp, - color = MaterialTheme.colors.onBackground.copy(0.54f), - textAlign = TextAlign.Justify, - lineHeight = (18.75).sp // TODO: Font Roboto - ) - // Example Sentences - Spacer(Modifier.height(4.dp)) + DefinitionEntry(entry) + } + } +} - Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { - entry.definition.examples.forEach { example -> - ExampleSentence(example.sentence) - example.synonyms?.let { - Synonyms( - modifier = Modifier.padding(start = 18.dp).fillMaxWidth(), - words = it - ) - } - } - } - } - Spacer(Modifier.height(24.dp)) +@Composable +private fun DefinitionEntry(entry: DefinitionEntry) { + // Word Type + WordType(entry) + + Spacer(Modifier.height(8.dp)) + + Column(Modifier.widthIn(max = with(LocalDensity.current) { + // https://material.io/design/typography/understanding-typography.html#readability + // According to Material Guidance, 40 - 60 characters width is the best. + (16.sp * 50).toDp() + })) { + // Definition + Text( + modifier = Modifier.padding(horizontal = 18.dp), + text = entry.definition.def, + fontSize = 16.sp, + color = MaterialTheme.colors.onBackground.copy(0.54f), + textAlign = TextAlign.Justify, + lineHeight = (18.75).sp // TODO: Font Roboto + ) + // Example Sentences + Spacer(Modifier.height(4.dp)) + + ExampleSentences(entry.definition.examples) + + Spacer(Modifier.height(8.dp)) + + entry.definition.synonyms?.let { + Synonyms( + modifier = Modifier.padding(start = 18.dp).fillMaxWidth(), + words = it + ) + } + } + Spacer(Modifier.height(24.dp)) +} + +@Composable +private fun WordType(entry: DefinitionEntry) { + Row { + Text( + text = "${entry.index}.", + color = MaterialTheme.colors.primary, + fontSize = 14.sp + ) + Spacer(Modifier.width(4.dp)) + Text( + text = entry.type.uppercase(), + color = MaterialTheme.colors.onBackground, + fontSize = 14.sp + ) + } +} + + +@Composable +private fun ExampleSentences(examples: List) { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + examples.forEach { example -> + ExampleSentence(example.sentence) } } } diff --git a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt index bf71825..9cb6f60 100644 --- a/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt +++ b/common/src/jvmMain/kotlin/me/konyaco/collinsdictionary/service/CollinsOnlineDictionary.kt @@ -236,8 +236,7 @@ private class DefinitionParser { ExampleSentence( sentence, null, - null, - SynonymParser.parse(senseElement) + null ) // TODO: 2021/7/28 Grammar pattern and sound url. } @@ -247,7 +246,8 @@ private class DefinitionParser { type = grammarGroup, definition = Definition( def = def, - examples = examples + examples = examples, + synonyms = SynonymParser.parse(senseElement) ), extraDefinitions = emptyList() // TODO: 2021/7/28 Extra definitions. ) From 09a0e4c14a0ebf962bf9f3fee23d0f9039fe472f Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 20:51:30 +0800 Subject: [PATCH 11/12] Update build.gradle.kts --- common/build.gradle.kts | 4 ++-- desktop/build.gradle.kts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 456ae32..5639819 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -78,11 +78,11 @@ tasks.withType { } android { - compileSdk = 32 + compileSdk = 33 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 21 - targetSdk = 32 + targetSdk = 33 } namespace = "me.konyaco.collinsdictionary.common" } diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index 2de024b..09fb67c 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { From f90ba5c1814c425f25e142fc9c9520d7fb26bd87 Mon Sep 17 00:00:00 2001 From: KonYaco Date: Fri, 21 Oct 2022 23:01:14 +0800 Subject: [PATCH 12/12] [Release] v1.4.6 --- android/build.gradle.kts | 4 ++-- build.gradle.kts | 2 +- .../commonMain/kotlin/me/konyaco/collinsdictionary/ui/App.kt | 5 +++-- .../ui/component/CobuildDictionarySection.kt | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 6ebc66f..353ab5a 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -10,8 +10,8 @@ android { applicationId = "me.konyaco.collinsdictionary" minSdk = 21 targetSdk = 33 - versionCode = 8 - versionName = "1.4.5" + versionCode = 9 + versionName = "1.4.6" } buildTypes { diff --git a/build.gradle.kts b/build.gradle.kts index d60d50f..b9f5258 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,4 +20,4 @@ allprojects { } group = "me.konyaco.collinsdictionary" -version = "1.4.5" \ No newline at end of file +version = "1.4.6" \ No newline at end of file diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/App.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/App.kt index 162495a..ff36849 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/App.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/App.kt @@ -1,6 +1,7 @@ package me.konyaco.collinsdictionary.ui import androidx.compose.animation.* +import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.Image import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* @@ -74,12 +75,12 @@ fun App( ProvideSoundPlayer { ProvideLocalScreenSize { Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) { - val padding = when (LocalScreenSize.current) { + val padding by animateDpAsState(when (LocalScreenSize.current) { ScreenSize.PHONE -> 16.dp ScreenSize.TABLET -> 24.dp ScreenSize.LAPTOP -> 48.dp ScreenSize.DESKTOP -> 48.dp - } + }) Column( modifier = Modifier.fillMaxSize(), diff --git a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt index 595bddf..168db16 100644 --- a/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt +++ b/common/src/commonMain/kotlin/me/konyaco/collinsdictionary/ui/component/CobuildDictionarySection.kt @@ -239,7 +239,7 @@ private fun DefinitionEntry(entry: DefinitionEntry) { entry.definition.synonyms?.let { Synonyms( - modifier = Modifier.padding(start = 18.dp).fillMaxWidth(), + modifier = Modifier.padding(horizontal = 18.dp).fillMaxWidth(), words = it ) }