Sync already records chime-worthy arrivals in the notification outbox. This adds the shared dispatcher that applies the Important/All/tabs scope, waits for pending AI routing, and hands raw sender/subject/thread ids to a host publisher. Hosts format and translate the notification and attach the platform action (slot type, wantAgent); the default publisher keeps the whole path a no-op.
Remove the bundled policy, first-launch consent screen, bridge URL interception and Settings/onboarding rows; Flectar hosts the policy at https://flectar.com/mail/privacy/. Remove the notification publisher seam and the permission request so they can be reviewed separately.
- Register the XComponent UI input callback for axis events and translate
wheel/touchpad deltas into Slint's PointerScrolled (50 logical pixels per
wheel notch, the same step the desktop backend uses), so Slint flickables
scroll under the mouse without application-side changes.
- Request notification permission from EntryAbility after loadContent: the
page's aboutToAppear runs too early, the system rejects the request with
1600013 and never shows the prompt. Publishing logs the outcome and the
failure code through hilog.
- When OH_Asset_Add fails with ASSET_CRYPTO_ERROR (a stale row from an
earlier signing identity, for example after reinstalling the hap), remove
the alias and retry: deletion does not need the old secret, so sign-in and
reconnect recover instead of failing with 'asset add failed: 24000009'.
- Document wheel input and notification behaviour in platform/ohos/README,
and restore the notification_publisher and email_font_dir rows in the
PlatformContext contract table.
Compose attachments, account-backup export/import and database-snapshot
export still opened desktop file dialogs directly, so on mobile they
reported "no picker" even though the host provides a DocumentProvider.
- DocumentProvider::import_many() imports several documents for one action
(default: repeat import() until the picker is cancelled; the desktop
provider uses one multi-select dialog). Imported documents stay alive in
the composer until Core has staged the attachments.
- Compose attachments use import_many() instead of rfd::FileDialog.
- Backup export/import stage one app-private file and hand it to the
provider; the existing import logic keeps its synchronous shape on the UI
thread executor.
- Database snapshots keep Core's verified snapshot, archive it as one zip
(hosts export files, not folders) and pass it to the provider. Staging
stays outside the data/cache roots Core requires.
- Desktop behavior is unchanged: same dialogs and file names.