Read the theme, locale, empty-library seed and section expansion
once in the application and collect them as state, instead of
blocking the UI thread with synchronous reads before setContent.
A late ImportState Success snapshot collected after the success
notification overwrote it with an ongoing progress record. Post
progress on Main behind a volatile terminal latch; notifications go
through NotificationPort, the pipeline lives in the coordinator, and
the service finish is injected.
Notifications belong to the package and outlive the process: after the
system kills the foreground service mid-download the frozen progress
notification stays in the shade forever. A fresh process means no
service is running, so any leftover notification is stale.
Instant server failures (404/HTML error page) no longer flash a 0%
progress bar; the check mirrors the downloader's previous-day fallback
and tolerates transient network errors, which still go through the
downloader's retry path.
- Fixed a crash on broad queries (e.g. a single letter across several
dictionaries): the results list keyed items by dictionary
path/offset/word, and duplicate keys are illegal in a Compose list;
drop the explicit key, let Paging identify items by position instead
(SearchResultsList).
- Fixed a disabled dictionary reactivating itself on the next app
launch: the active flag is now persisted through
PreferencesManager/DataStore and reapplied whenever the dictionary
list is rebuilt (LocalDictionaryRepository).
- Search results no longer stop at the first ~100-200 matches: the
ranked head page hands back a cursor per unfinished prefix range,
and IndexEntryPagingSource pages the rest straight from the index,
merged alphabetically across dictionaries, until every match is
surfaced (IndexSearcher, IndexEntryPagingSource).
- Added diacritic-insensitive search: folded index entries are merged
into the primary index as aliases, so accented and plain spellings
find each other (DslIndexer, IndexSearcher).
- Fixed indexing failures on dictionaries with dense non-Latin text: a
truncated multi-byte sequence at a sample boundary was misread as
invalid UTF-8 and the whole file fell back to UTF-16LE
(DslCharsetDetector).