Skip to content

Obinot v2.1

Choose a tag to compare

@LexicoON LexicoON released this 20 Sep 22:11
· 7 commits to main since this release
a9211d2

Obinot v2.1 — Changelog

Version: 2.1.0 (versionCode 3)


For Everyone

✨ Highlights

  • Chat with AI about any note. Long-press the three-dot menu in the reader and a bottom sheet opens with a full conversation. Ask follow-ups, request rewrites, dig deeper — the chat is saved with the note and travels in your backups.
  • Edit AI summaries as raw Markdown. New "Edit Summary" action in the reader: toggle between raw Markdown and a live preview rendered with the same engine that displays your notes. The original processing metadata (language / task / format) is preserved on save.
  • Faster, smaller math rendering. KaTeX (WebView + ~1 MB of CSS/JS/fonts) is replaced by RaTeX, a native LaTeX renderer. Formulas paint immediately on the same line as your text, no first-WebView jank, no asset bloat.

🆕 New Features

  • AI chat persistence. Conversations are stored on each note (chatHistory field) and survive app restarts. A "Clear chat" button in the sheet header wipes it with a confirmation dialog.
  • Long-press the three-dot menu → jump straight into chat. One-time tooltip the first time you open the reader explains the gesture.
  • Markdown summary editor (SummaryEditorSheet) — plain-text editor on one side, live MarkdownText preview on the other.
  • Wavy audio progress bar in the reader — replaces the flat slider with a Material 3 Expressive wave that animates during playback.
  • License split. The original Binot codebase stays MIT; everything added by the fork (including the new chat, summary editor, and RaTeX integration) is now Apache 2.0 under LICENSE-OBINOT. The README explains which parts fall under which license, with credits for RaTeX, Mermaid, and the AndroidX/Kotlin stack.

🐛 Bug Fixes

  • Math no longer blocks the entrance animation. With KaTeX gone, the first-paint jank when opening a note with formulas is gone too — formulas render at native speed.
  • "Share .binot" always reports what happened. The snackbar now fires whether the file was saved to Documents or only available via the share sheet. Previously, the snackbar only appeared when saving failed.
  • Shared-element transition on the reader works again. The sharedBounds modifier was on the wrong composable; moved to the content area so the History → Result handoff animates from the card's bounds.
  • Audio waveform amplitude was passing Dp where the API expects a number. wavelength and amplitude are now using the right units for the wavy slider.
  • Chat was reading from a StateFlow on Dispatchers.IO. Replaced with a synchronous snapshot before leaving the main thread.
  • MediaStore.Downloads.EXTERNAL_CONTENT_URI rejected on some OEMs. Switched to MediaStore.Files.getContentUri("external") for the Documents save flow.

For Developers

  • DB v10 with MIGRATION_9_10 adding notes.chatHistory (TEXT, nullable) for serialized [{role, content}, ...] JSON. Not indexed. Not included in single-note .binot exports (they use an explicit data.json); is included in .obinotbak backups because Moshi serializes NoteEntity whole.
  • NoteEntity gained chatHistory: String?. .binot export still excludes it; backup format picks it up automatically.
  • io.ratex.RaTeXView replaces android.webkit.WebView-based KaTeXWebView and KaTeXInlineWebView. Block + inline math both use the same native view (displayMode = true/false).
  • Removed: androidx.webkit:webkit:1.11.0 dependency, assets/katex/ directory (CSS, JS, all .ttf / .woff / .woff2 fonts). Net APK reduction: ~1 MB.
  • Removed: exportNoteToMarkdown() and exportMarkdownFile() — Markdown export is no longer wired up in the UI.
  • Removed: "AI Explain" selection menu (the 2.0 feature). Chat replaces it as the single conversational entry point.
  • ResultViewModel gained chatMessages, isChatSending, chatTooltipShown, plus sendChatMessage(...), clearChat(), loadChatHistory(). ChatMessage(role, content) is a new public type.
  • ImportExportHelper.shareBinotToDocuments now surfaces a boolean back to the screen, which switches the snackbar between "Saved to Documents and ready to share" and "Ready to share (couldn't save to Documents)". MediaStore.Files is used in place of MediaStore.Downloads for broader OEM compatibility. Comprehensive Log calls added on every failure path.
  • MermaidAssetCache is now three-tier: memory → disk (filesDir/mermaid_cached.js) → APK assets. First read decompresses and writes to disk; subsequent app launches skip the APK decompression, ~5× faster on low-end devices.
  • NoteDao.getNotesWithLabelSync(label) — SELECT * WHERE isTrashed = 0 AND label LIKE '%' || :label || '%' AND title != '[[BINOT_SYSTEM_LABELS]]'. Used by label rename/delete to avoid loading the full notes table.
  • ProGuard rules trimmed for the KaTeX removal (no more InlineTextContent / AndroidView / ViewFactoryHolder / WebView keep-rules); added -keep class io.github.erweixin.ratex.** for JNI calls.
  • ai_chat_tooltip_shown preference in DataStore, set after the first-time tooltip is dismissed.
  • CI: removed the "Inspect RaTeX AAR packages" diagnostic step from both build-dev.yml and release.yml once the real package name (io.ratex) was confirmed.
  • LICENSE-OBINOT added with the Apache 2.0 text and a NOTICE section preserving the original Binot attribution.
  • Version: 2.1.0 / 3.