Review against the installed HarmonyOS skills: replace the page's console
calls with hilog (public format specifiers, so values are not redacted and
the tag is stable), log the unused cleanup error, and annotate the
loadContent error parameter. The ArkTS compiler now reports no warnings.
Reading the system pasteboard requires ohos.permission.READ_PASTEBOARD
(system_basic, user_grant). Declare it with a localized reason, resolve the
reasonId while packing the hap (the packing tool normally does this), and let
the page ask for the permission when a paste is denied; a toast explains the
denial.
The hap now only installs with an ACL-enabled signing profile that lists the
permission; the README documents the requirement.
versionName is the root Cargo.toml version and versionCode is derived from
it (major*10^7 + minor*10^5 + patch*10^3, plus the prerelease number or 999
for a release) so application-market uploads stay monotonic. The values in
AppScope/app.json5 remain only as the fallback for an IDE build that skips
the script.
Use the project's bundle name on OpenHarmony too: the Flatpak app id, the
macOS/iOS bundle identifier and the Android applicationId are all
com.flectar.mail. Document the AGC release-signing environment
(hap-sign-tool with the release certificate and profile) and keep BUNDLE=
for signing material that was issued for another name.
The new PlatformContext field broke the iOS launch context (CI lint iOS:
missing field notification_publisher). iOS keeps the default no-op publisher
until it gains a notification backend.
- 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.
Tier-3 community port (maintainer: springmin), rebased onto the merged
document-provider abstraction (#84) and the opener seam (#80).
- platform/ohos: Slint backend (XComponent window adapter, software renderer
with the experimental femtovg/wgpu path, input/IME, clipboard, system
fonts), the NAPI cdylib that builds a PlatformContext (app-private paths,
DocumentProvider over the ArkTS pickers, Asset Store credential store,
loopback OAuth broker, external URL opener, notification publisher) and
calls flectar_mail::run, the demo crate, the ArkTS shell and the build and
packaging scripts (bundle name configurable, defaults to
com.flectar.mail_ohos).
- src/platform/ohos.rs: PDFium directory, renderer name, thread priority,
preview lifecycle, email font directory; OpenHarmony stays under the
mobile capability alias.
- patches/fontique + crates/fontique: the Fontconfig opt-out as a patch queue
applied by the platform/ohos workspace, verified from quality.yml.
- .github/workflows/ohos.yml: manually dispatched tier-3 workflow, unsigned by
default, signing material only from the FLECTAR_OHOS_* secrets.
- src/documents.rs: run_request blocks the calling thread on mobile hosts;
the picker covers the window, and keeping the presentation thread idle is
what OpenHarmony needs (verified on device; desktop keeps the runtime
request for the native dialog).
- The email renderer and the compose editor load platform::email_font_dir()
and the Han fallback, so CJK mail bodies and composed text render with the
platform fonts.
- New-mail notifications: a publisher seam fed by CoreEvent::MailNew; the host
publishes through @kit.NotificationKit.
Attachment and file downloads always opened the folder the platform
suggests, with no way to change it (#71). The save dialog is built in a
single place, `DocumentDialog::file_dialog`, which never called
`set_directory`.
Settings → General now carries a Download location card to pick a folder
or reset to the platform default. The stored path is resolved when a
download is saved, not when the path is stored: a location can become
unavailable later, such as an unmounted network share, so a download
falls back to the platform default instead of failing.
The setting covers mail attachments and the Files view, which share
`DocumentProvider::export`. Import dialogs keep the platform default,
since a download location does not describe where files are read from.
Tests cover path resolution (empty, missing, a file instead of a
directory, and a usable directory), the dialog built from the setting,
and that settings blobs written before this field still load.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>