Skip to content

Binot v1.1.9

Choose a tag to compare

@LexicoON LexicoON released this 19 Sep 02:21
· 50 commits to main since this release
2a4163e

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 .binot backups 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 all and uploads the log as an artifact.

🐛 Bug Fixes

  • Fixed History with many notes getting slow because isAllPinned was 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 fillMaxWidth looking 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 had AutoMirrored counterparts 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_8 adding composite indices: index_notes_isTrashed_isPinned_timestamp, index_notes_isTrashed_timestamp, index_notes_title. Declared in NoteEntity.indices.
  • New DAO queries: getRecentNotes(limit), getSystemNote(), getSystemNoteSync(), getAllLabelStrings() (projection — no entity hydration).
  • RecordViewModel: replaced pollJob loop (1.5s getAllNotesSync) with repository.getRecentNotes(16).stateIn(WhileSubscribed(5000)).
  • HistoryViewModel / ResultViewModel: uniqueLabels / allLabels now built with combine(getAllLabelStrings(), getSystemNote()) instead of loading all entities.
  • NoteEntity / LabelEntity: annotated @Immutable for better Compose skipping.
  • ObinotFilePickerSheet: paginated MediaStore reads via Bundle with QUERY_ARG_LIMIT / QUERY_ARG_OFFSET on 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.kt rewrite:
    • observeBouncyPress(interactionSource, scale, pressedScale) — squish scale, kept for FABs, cards, play buttons, icon buttons.
    • rememberBouncyExpand(interactionSource, enabled, target) — Animatable<Dp> for horizontal expansion with a snapTo on quick release.
    • BouncyButton / BouncyOutlinedButton: animate contentPadding (surface grows) — external Modifier.padding does not work because it only adds empty space. Default expandOnPress = 16.dp. Pass 0.dp when using fillMaxWidth / weight(1f) / align(End).
    • BouncyIconButton: kept as scale squish (M3’s IconButton has a fixed state layer and no exposed contentPadding).
    • BouncyCapsule / BouncyChip: animate padding after background/clip so the visible surface grows.
    • New BouncyToggleButton — scale squish wrapper around M3’s ToggleButton for weight(1f) groups.
  • Settings: AnimatedVisibility(expandVertically + fadeIn / shrinkVertically + fadeOut) replaces the hard if (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, uploads warnings_full.log and optional filtered log).
  • Version: 1.1.9 / 20.