Release 1.5.0

- The dictionary update card now returns after a failed download
- Fixed headwords and articles with escaped characters being displayed incorrectly
- Fixed slow rendering of articles containing many bracket characters
This commit is contained in:
2026-08-18 00:16:27 +03:00
parent 457bbe43b6
commit bc3fa85b9d
6 changed files with 38 additions and 23 deletions
+3 -3
View File
@@ -95,15 +95,15 @@ The main search screen remains usable as long as at least one indexed dictionary
## Tech Stack ## Tech Stack
- Kotlin 2.4.10 - Kotlin 2.4.10
- Jetpack Compose (BOM 2026.06.01) - Jetpack Compose (BOM 2026.08.00)
- Material 3 - Material 3
- Coroutines and Flow 1.11.0 - Coroutines and Flow 1.11.0
- DataStore Preferences 1.2.1 - DataStore Preferences 1.2.1
- Paging 3.5.0 - Paging 3.5.1
- OkHttp 5.4.0 - OkHttp 5.4.0
- kotlinx.serialization 1.11.0 - kotlinx.serialization 1.11.0
- AboutLibraries 15.0.4 metadata generation - AboutLibraries 15.0.4 metadata generation
- Android Gradle Plugin 9.3.0 - Android Gradle Plugin 9.3.1
## Build ## Build
+2 -2
View File
@@ -92,8 +92,8 @@ android {
applicationId = "com.example.research" applicationId = "com.example.research"
minSdk = project.property("minSdk").toString().toInt() minSdk = project.property("minSdk").toString().toInt()
targetSdk = project.property("targetSdk").toString().toInt() targetSdk = project.property("targetSdk").toString().toInt()
versionCode = 7 versionCode = 8
versionName = "1.4.0" versionName = "1.5.0"
vectorDrawables { vectorDrawables {
useSupportLibrary = true useSupportLibrary = true
@@ -84,6 +84,8 @@ class SettingsViewModel(
private var isDownloadInProgress = false private var isDownloadInProgress = false
private var cancelRefreshPending = false private var cancelRefreshPending = false
private var errorStateHandled = false
private var statusBeforeDownload: DictionaryStatus = DictionaryStatus.Unknown
init { init {
setupStateObservation() setupStateObservation()
@@ -147,32 +149,37 @@ class SettingsViewModel(
is DownloadState.Loading, is DownloadState.Extracting -> { is DownloadState.Loading, is DownloadState.Extracting -> {
isDownloadInProgress = true isDownloadInProgress = true
cancelRefreshPending = false cancelRefreshPending = false
errorStateHandled = false
} }
is DownloadState.Success -> { is DownloadState.Success -> {
pendingSourceUrls.clear() pendingSourceUrls.clear()
} }
is DownloadState.Error -> { is DownloadState.Error -> {
isDownloadInProgress = false isDownloadInProgress = false
dictionaryStatus.value = if (dictionaryState.dictionaries.isEmpty()) { if (!errorStateHandled) {
DictionaryStatus.Empty errorStateHandled = true
} else { dictionaryStatus.value = if (dictionaryState.dictionaries.isEmpty()) {
DictionaryStatus.UpToDate DictionaryStatus.Empty
} } else when (statusBeforeDownload) {
if (pendingSourceUrls.isNotEmpty()) { DictionaryStatus.Unknown, DictionaryStatus.Checking -> DictionaryStatus.UpToDate
pendingSourceUrls.forEach { urlTemplate -> else -> statusBeforeDownload
val source = dictionaryState.dictionarySources.find { }
it.urlTemplate == urlTemplate if (pendingSourceUrls.isNotEmpty()) {
} pendingSourceUrls.forEach { urlTemplate ->
if (source != null) { val source = dictionaryState.dictionarySources.find {
val hasDictionary = dictionaryState.dictionaries.any { dictionary -> it.urlTemplate == urlTemplate
DictionarySourceFileMatcher.matches(source, dictionary)
} }
if (!hasDictionary) { if (source != null) {
manageDictionarySourcesUseCase.removeSource(source.id) val hasDictionary = dictionaryState.dictionaries.any { dictionary ->
DictionarySourceFileMatcher.matches(source, dictionary)
}
if (!hasDictionary) {
manageDictionarySourcesUseCase.removeSource(source.id)
}
} }
} }
pendingSourceUrls.clear()
} }
pendingSourceUrls.clear()
} }
} }
is DownloadState.Cancelled -> { is DownloadState.Cancelled -> {
@@ -412,6 +419,7 @@ class SettingsViewModel(
return@launch return@launch
} }
statusBeforeDownload = dictionaryStatus.value
dictionaryStatus.value = DictionaryStatus.Checking dictionaryStatus.value = DictionaryStatus.Checking
isDownloadInProgress = true isDownloadInProgress = true
@@ -435,6 +443,7 @@ class SettingsViewModel(
return@launch return@launch
} }
statusBeforeDownload = dictionaryStatus.value
dictionaryStatus.value = DictionaryStatus.Checking dictionaryStatus.value = DictionaryStatus.Checking
val installedSources = installedEnabledSources( val installedSources = installedEnabledSources(
@@ -0,0 +1,3 @@
- The dictionary update card now returns after a failed download
- Fixed headwords and articles with escaped characters being displayed incorrectly
- Fixed slow rendering of articles containing many bracket characters
@@ -0,0 +1,3 @@
- Карточка обновления словарей теперь появляется снова после неудачной загрузки
- Исправлено отображение заголовков и статей с экранированными символами
- Исправлено медленное отображение статей с большим количеством скобок
+2 -2
View File
@@ -2,14 +2,14 @@
aboutlibraries = "15.0.4" aboutlibraries = "15.0.4"
activity_compose = "1.13.0" activity_compose = "1.13.0"
agp = "9.3.1" agp = "9.3.1"
compose_bom = "2026.06.01" compose_bom = "2026.08.00"
core = "1.19.0" core = "1.19.0"
datastore_preferences = "1.2.1" datastore_preferences = "1.2.1"
documentfile = "1.1.0" documentfile = "1.1.0"
kotlin = "2.4.10" kotlin = "2.4.10"
lifecycle_runtime_ktx = "2.11.0" lifecycle_runtime_ktx = "2.11.0"
okhttp = "5.4.0" okhttp = "5.4.0"
paging = "3.5.0" paging = "3.5.1"
profileinstaller = "1.4.1" profileinstaller = "1.4.1"
kotlinx_coroutines = "1.11.0" kotlinx_coroutines = "1.11.0"
kotlinx_serialization = "1.11.0" kotlinx_serialization = "1.11.0"