Skip to content

Release 1.1.48 (versionCode 51) - #136

Merged
adibhanna merged 10 commits into
mainfrom
release/1.1.48
Oct 27, 2026
Merged

adibhanna merged 10 commits into
mainfrom
release/1.1.48

Conversation

@adibhanna

@adibhanna adibhanna commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

ZenNotes for Android 1.1.48 (versionCode 51), on core 2.78.0.

  • Calendar widget (Dave, Discord 2026-10-27; merge of feat/calendar-widget, e1d17d5): the month with writing dots, open-task marks, week numbers and the today ring, and the selected day's week below with a box to tick on every task; resizable to the whole screen, the list scrolls. A tick works with the app closed: the widget writes the line core named into the note when it is still exactly that line, and anything else waits in a log the app applies through core's setTaskChecked.
  • PDFs open in the phone's viewer (Dave; merge of fix/pdf-embed, bdaec85 + 12dadd8): Android's WebView has no PDF viewer, so a PDF now goes to the app you keep for PDFs through the new openAssetExternally, and Done and Back close the reference sheet and leave you on the note.
  • Periodic folders show once in the drawer (uNyanda; merge of fix/drawer-periodic-twice, b959dda).
  • Core 2.78.0 (febe775, core-2.78.0-core.h0bc32cbd73a78fac from ZenNotes/zennotes 52ab86fd): note covers, $$ math in Mermaid labels and Pele 1.12.0, the PDF and reference fixes, ticking tasks in CRLF notes, the Themes picker fix. No new bridge method; the contract adds the portable key noteCoverPlacement.
  • Version (dcf8427): 1.1.48, versionCode 51.

Validation: boundaries:check, typecheck, 350 tests, npm run build and npm run sync on the adopted core. The widget and the PDF fix were each walked on an Android emulator when built.

uNyanda (Discord, 2026-10-27) saw every daily, weekly and monthly note
twice in the drawer, and deleting one copy took the other with it. The
drawer's top group has Daily, Weekly and Monthly Notes rows that open
those folders, and the Notes list below lists every folder core's
getBrowseDirectory hands it, those three included, marked only by a
calendar icon. One folder, two rows. The layout fix for #17 (a2d584a)
dealt with a real second folder on disk and never touched this.

The Notes list now leaves out the folders those rows open, which is how
the desktop sidebar has drawn them since 2.4.0 (periodic notes in Quick
Access, their folders pruned from the tree). A folder holding nothing
but periodic folders (Journal around Journal/Daily) goes too, so the
list never offers a folder that opens onto nothing; one holding a note,
a file, a database or a folder of its own keeps its row. A hidden folder
reached through a note's breadcrumb shows everything in it, or it would
read "No notes here yet". Nothing moves on disk, a note in a periodic
folder that is not periodic is still one tap away through its row, and
turning a kind off brings its folder back to the list.

Tests: drawer-folders.test.ts (8 cases). typecheck, boundaries:check
and 340 tests pass. On an API 36 emulator the Notes list went from
Daily Notes, Monthly Notes, Projects, Weekly Notes to Projects alone,
the Daily row still opens its folder (a non-date note included), and
turning weekly notes off lists Weekly Notes again. The iPhone build
shows the same, plus the nested Journal/Daily case and its breadcrumb.
openAssetExternally was notImplemented in this shell, so a tap on an
attachment chip (a .zip, a .tldraw) ended in an error toast. It matters
more now: the WebView has no PDF viewer, so a PDF embed or the reference
pane drew an empty page (Dave, Discord, 2026-10-27), and core now hands a
PDF to openAssetExternally wherever navigator.pdfViewerEnabled is false
(ZenNotes/zennotes fix/pdf-embed-phones).

- OpenFilePlugin.java sends a VIEW intent to the app the user keeps for
  the type. A file:// path (the app's vault folder, or a copy staged out
  of a remote vault) goes out through the FileProvider; a content://
  document under a picked folder goes out as it is, with this app's read
  grant passed along. The type comes from the provider, then from the
  extension. With no app for the type it rejects NO_APP, and core shows
  "No app on this phone opens this kind of file."
- open-asset.ts resolves the vault-relative path, refuses one that climbs
  out, says when the file is missing, and stages a remote vault's asset
  in a fresh cache folder per open, as the iPhone shell does.
- file_paths.xml adds files-path for a phone whose vaults live in
  internal storage (vaultsRoot falls back to Directory.Data).
- NativeFs.fileUri is public.

Tests: open-asset.test.ts (on-device file, missing file, a path outside
the vault, no app, remote staging). On an API 37 emulator (WebView 145)
with that core, a tap on Dave's PDF card opened Drive's PDF viewer on
both pages, and Back came back to the note.

The PDF card needs the core from fix/pdf-embed-phones; attachment chips
work with core 2.77.0. The new plugin needs a native rebuild.
… the note

The reference pane (a pinned note or PDF) is a full-screen sheet on
phones like the other right panels, but it lives outside EditorPane and
never hears zen:close-right-panel. Done and system Back sent that event
and the sheet stayed (instrumented on the emulator: both fired, the pane
stayed). Its header got the injected back chevron, which went Home; the
pin stays with the note, so reopening the note brought the sheet back.
Only the x, which unpins, got out (Dave, Discord, 2026-10-27).

closeRightPanel() hides the reference pane when it is showing, through
core's Hide Reference Pane (ref.toggle, the pane's own square button),
which keeps the pin; otherwise it sends the event as before. Done, system
Back and the reference sheet's chevron ("Back to the note") use it. The
reference pane renders after the editor panes, so it is the one on top.

ref.toggle sees a pin made for one note only with the core from
ZenNotes/zennotes fix/pdf-embed-phones; with core 2.77.0, Done over a
PDF pinned from its card still does nothing.

Checked on the emulator with that core, after pinning Dave's PDF on the
1.1.47 build and installing over it: Done, the chevron and system Back
each closed the sheet onto the note, and reopening the note left it
closed. typecheck and 337 tests pass.
…ck on the Home Screen

Dave (Discord, 2026-10-27) asked for the Calendar sheet on his Home
Screen, given the whole screen if need be, with the task list
scrollable underneath. This is that widget: the month with its writing
dots, open-task marks, week numbers and today ring on top, the selected
day's week below with a box to tick on every task. It is resizable to
the whole screen, the list scrolls, and narrow or short sizes drop the
week column or the grid.

As in the app on a touch screen, a tap selects a day and shows its
week, and a tap on the selected day opens its note. The arrows page
months; the month label goes back to today's. Day and Week open or
offer the note through the Calendar. A widget cannot hold a text field,
so "Add a task for ..." opens the Calendar on that day with the cursor
in its field and the keyboard up. A task's text opens it on its line.

A tick works with the app closed. The widget logs it (WidgetActions),
draws it ticked at once, and writes it into the note itself when the
task's line is still exactly the one the snapshot named: core sent the
line both ways, so TaskLineWriter swaps one string for the other and
parses nothing. It keeps CRLF and a BOM, overwrites in place as the
vault does, walks a picked folder by name, and leaves a note that is
not UTF-8 alone. Anything else waits in the log. The app applies the
log on launch and on every return to the foreground through core's
setTaskChecked, in order, retrying what cannot land yet. The next
snapshot's actionsAck tells the widget which taps it may forget, so a
snapshot built before the app saw a tap never undoes it on screen.

From Android 12 the box is a real CheckBox, and the week list goes out
in the same update as RemoteCollectionItems: notifyAppWidgetViewDataChanged
after the update re-sent stale views and dead tap targets. Before 12 a
box image ticks and a RemoteViewsService feeds the list. Each day shows
at most 12 tasks plus "+N more", keeping one update within the
transaction limit. The taps receiver is not exported, and a midnight
alarm moves the today ring.

The shared JS (same as the iPhone shell's): widget-calendar.ts is the
tap-log contract; widgets.ts publishes the calendar block and applies
the log; widget-links.ts adds zennotes://calendar, day and week, which
deep-links.ts runs through calendar-request.ts and MobileShell's sheet.

Needs core with getCalendarWidgetData and setTaskChecked
(ZenNotes/zennotes 3fc40107). It was built and checked on a rehearsal
core adopted from that tree, whose vendor files are not part of this
commit; adopt the published core before release.

On a throwaway API 37 emulator (WebView 145):
- The widget was placed from the picker and the grid, marks and agenda
  match the sheet.
- With the app killed, a tick wrote "- [x]" into the note, also in a
  CRLF note and for a "[/]" task; an untick restored the line.
- A task whose line moved on disk waited and was applied when the app
  opened.
- Day select, month paging, and the Day, task and Add links work; text
  typed after the Add link landed in the day's note.
typecheck and 337 tests pass.
…ne's viewer and note covers

Core core-2.78.0-core.h0bc32cbd73a78fac, built by CI from ZenNotes/zennotes
52ab86fd (the v2.78.0 release commit); core:adopt checked SHA-256,
SHA-512, packed versions and clean-source provenance.

Core 2.78.0 supplies what this shell's Calendar widget draws and takes
its ticks back (getCalendarWidgetData, setTaskChecked; the shell half
arrived with feat/calendar-widget), opens a PDF in the phone's own
viewer where the WebView has none and lets Done and Back close a PDF
pinned as a reference (the shell half arrived with fix/pdf-embed), and
keeps the PDF card's name clear of Preview at phone width. Notes show
their covers, Mermaid labels typeset $$ math and stay readable on any
fill (Pele 1.12.0), ticking a task in a note saved with Windows line
endings ticks the right one, and the Themes picker no longer previews a
theme nobody chose.

No new bridge method; the bridge contract adds the portable key
noteCoverPlacement. Desktop vault.ts is unchanged since 2.77.0.
@adibhanna
adibhanna marked this pull request as ready for review October 27, 2026 21:09
CI failed on release/1.1.48 at lintDebug: "Found byte-order-mark in the
middle of a file [ByteOrderMark]", TaskLineWriter.java lines 68 and 69.
The writer keeps a note's leading BOM when it swaps a ticked line, and
both string literals held the raw U+FEFF character. They now read
"", which Java turns into the same character, so the compiled
class is unchanged; only the source the lint check reads differs.
@adibhanna
adibhanna merged commit da88610 into main Oct 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant