Repository navigation
Binot v1.1.9
Obinot v1.1.9 — Changelog
Version: 1.1.9 (versionCode 20)
For Everyone
✨ Highlights
- Smoother and lighter: the app no longer polls the database every 1.5 seconds in the background — it reacts to changes instantly and uses almost no CPU when idle.
- New press behavior on buttons: filled and outlined buttons now grow outward when you press them (like the Record button) instead of shrinking. Icon buttons keep their squish.
- File picker now paginates long lists and sorts server-side, so browsing large music/audio libraries stays fast.
- Faster imports and exports: large
.binotbackups and audio imports now stream through buffers instead of loading everything into RAM at once.
🆕 New Features
- Toggle groups have a bouncy press — Tidy Up / Summary / Analyze, Fast / Accurate, theme selector, and the sort row in History now respond with a squish on tap.
- Animated Live Transcript reveal in Settings — the toggle slides in/out with a smooth spring instead of popping in.
- Consistent Bouncy system across Onboarding, Settings, Result, History, and Trash, with a shared
BouncyToggleButton. - Auto-mirrored icons for RTL support: arrows, sort, label, notes, and bullets now flip correctly on right-to-left locales.
- A new "Warnings Audit" workflow on GitHub Actions (manual trigger) that builds the app with
--warning-mode alland uploads the log as an artifact.
🐛 Bug Fixes
- Fixed History with many notes getting slow because
isAllPinnedwas doing a full list scan on every recomposition. - Fixed labels loading re-reading every note entity (raw text, summary, highlights) just to extract label strings.
- Fixed ResultScreen search recomputing the full split and filter on every keystroke; it’s now cached.
- Fixed ImportExportHelper reading large audio files twice during export, and unbuffered streams during import.
- Fixed Bouncy buttons on
fillMaxWidthlooking wrong (they tried to grow when the width was already assigned). - Fixed AnimatedContent + BouncyButton measurement loop that could crash on long-press of “Check Update”.
- Fixed wrong icon variants (
Icons.Default.Label,Sort, etc.) that hadAutoMirroredcounterparts and were breaking RTL. - Fixed unchecked cast warnings in the file picker by branching per tab before calling the query.
- Fixed redundant
.toFloat()in the audio waveform. - Made
fallbackToDestructiveMigration(dropAllTables = true)explicit so the app doesn’t crash on unknown schema versions.
For Developers
- DB v8 with
MIGRATION_7_8adding composite indices:index_notes_isTrashed_isPinned_timestamp,index_notes_isTrashed_timestamp,index_notes_title. Declared inNoteEntity.indices. - New DAO queries:
getRecentNotes(limit),getSystemNote(),getSystemNoteSync(),getAllLabelStrings()(projection — no entity hydration). RecordViewModel: replacedpollJobloop (1.5sgetAllNotesSync) withrepository.getRecentNotes(16).stateIn(WhileSubscribed(5000)).HistoryViewModel/ResultViewModel:uniqueLabels/allLabelsnow built withcombine(getAllLabelStrings(), getSystemNote())instead of loading all entities.NoteEntity/LabelEntity: annotated@Immutablefor better Compose skipping.ObinotFilePickerSheet: paginated MediaStore reads viaBundlewithQUERY_ARG_LIMIT/QUERY_ARG_OFFSETon API 26+, manual skip fallback on 24–25. Page size = 150. Sort pushed to SQL. Per-tab branching removes the unchecked casts.ImportExportHelper: 64 KB buffered streams;writeStoredFile()reads ≤5 MB files into RAM (1 pass) and streams >5 MB through a temp file to compute CRC32/size before writing (avoids double-reading the source).BouncyComponents.ktrewrite:observeBouncyPress(interactionSource, scale, pressedScale)— squish scale, kept for FABs, cards, play buttons, icon buttons.rememberBouncyExpand(interactionSource, enabled, target)—Animatable<Dp>for horizontal expansion with asnapToon quick release.BouncyButton/BouncyOutlinedButton: animatecontentPadding(surface grows) — externalModifier.paddingdoes not work because it only adds empty space. DefaultexpandOnPress = 16.dp. Pass0.dpwhen usingfillMaxWidth/weight(1f)/align(End).BouncyIconButton: kept as scale squish (M3’sIconButtonhas a fixed state layer and no exposedcontentPadding).BouncyCapsule/BouncyChip: animate padding after background/clip so the visible surface grows.- New
BouncyToggleButton— scale squish wrapper around M3’sToggleButtonforweight(1f)groups.
- Settings:
AnimatedVisibility(expandVertically + fadeIn / shrinkVertically + fadeOut)replaces the hardif (recordMode == 1)for the Live Transcript block. - AudioWaveform: uses Kotlin’s
sin(Float)overload; removed the trailing.toFloat(). fallbackToDestructiveMigration(dropAllTables = true)made explicit for the newer Room overload.- CI: added
.github/workflows/warnings-audit.yml(workflow_dispatch, JDK 21, Gradle 9.7.1,--warning-mode all, uploadswarnings_full.logand optional filtered log). - Version:
1.1.9/20.