SHA256
194 lines
12 KiB
Markdown
194 lines
12 KiB
Markdown
# Native rebuild continuation
|
||
|
||
## Current objective — do not restore the wrapper
|
||
|
||
The maintainer rejected the browser-wrapper architecture and requested the PWA's
|
||
appearance/functions implemented as genuine native screens. Shipping Android now
|
||
uses Compose and iOS SwiftUI, calling the existing API directly. `legacy/` holds
|
||
the superseded renderers/tests for reference only. No WebView fallback, raw-JSON
|
||
module placeholder or old browser-test pass may be represented as native parity.
|
||
|
||
Read [native parity](native-parity.md), [architecture](architecture.md), and
|
||
[current validation](validation.md) first. Initial auth/dashboard/tasks/notes/
|
||
shopping slices exist, but **no module has accepted full visual/functional parity**.
|
||
The remaining pages/settings/auth/file/offline/notification work is explicit.
|
||
|
||
### Android design follow-up: 0.2.2 native preview / code 4
|
||
|
||
The user confirmed the login fix and requested the PWA design 1:1. The Android
|
||
slice now uses PWA-derived native primitives in `PwaDesign.kt`, `PwaIcons.kt`,
|
||
`PwaShell.kt`, `NativePages.kt` and `NativeForms.kt`, instead of the first generic
|
||
Material layout. `PwaPresentation.kt` handles greeting/timezone/config filtering;
|
||
the controller reads personal preferences and auto-selects the first shopping list.
|
||
The confirmed cookie/session transport was not changed.
|
||
|
||
Read [design comparison](native-design.md) before making visual claims. External
|
||
Playwright 1.55.1/Chromium 140 tooling captures the actual unmodified PWA; the
|
||
emulator exports ten light/dark native views with viewport metadata. Match the
|
||
360 × 592 content viewport and Android variable Roboto, not the system-bar-inclusive
|
||
root. The earlier clipped tab labels were caused by per-tab circular clipping.
|
||
The apparent second white capsule segment occurred where subsequent dashboard
|
||
content remained visible beneath the translucent navigation; inspect actual
|
||
matched captures rather than treating any visible card edge as a second bar.
|
||
|
||
Reference generation uses `/tmp/opencode/yuvomi-visual-tools/node_modules/playwright`,
|
||
`/tmp/opencode/yuvomi-visual-tools/fonts.conf` and persistent browsers at
|
||
`/home/neste/yuvomi-tools/playwright-browsers`. The temporary font config points to
|
||
the emulator's variable `/system/fonts/Roboto-Regular.ttf`; it includes all weights.
|
||
Set `PLAYWRIGHT_HOST_PLATFORM_OVERRIDE=ubuntu24.04-x64` on this Ubuntu 26 host.
|
||
Reference output is ignored under `artifacts/visual/pwa-360x592`; native screenshots
|
||
are in the external build's `app/outputs/native-screenshots`. The side-by-side
|
||
compositor is tooling only; screenshots are evidence, not automated parity approval.
|
||
|
||
iOS is unchanged. No module has accepted full functional/visual parity, the rest
|
||
of the inventory remains open, and signing stays paused. Continue refinement from
|
||
actual comparison images, including non-default font sizes/devices and native
|
||
module functionality; do not declare the whole user request finished from this
|
||
Android slice alone.
|
||
|
||
### Android login follow-up: 0.2.1 native preview / code 3
|
||
|
||
A user reported immediate HTTP-401 login failure although the same direct password
|
||
login works in the browser. Reproduced against unmodified upstream by setting its
|
||
existing `SESSION_SECURE=false` default behind the HTTPS fixture: the old Android
|
||
jar discarded the cookie and the next authenticated request failed. The fix keeps
|
||
all native cookies HTTPS/origin-bound independent of that server attribute;
|
||
certificate checks, redirect refusal, encryption and expiry are unchanged. Login
|
||
errors now distinguish credential/code rejection from session-cookie problems and
|
||
a successful retry clears the old error. Both secure/default-cookie test modes
|
||
are in CI; see `login-troubleshooting.md` and the latest validation section.
|
||
The fix is source `4b483c2`; local 13 JVM, both 7-test cookie modes, 6 ordinary
|
||
native UI tests, lint and all packages pass. Gitea build job 1071/run 666 (#11)
|
||
passed and published the actual 0.2.1/code-3 APK; downloaded, verified and installed/
|
||
launched on `emulator-5554`. Exact link/checksum are in `validation.md`.
|
||
That CI-signed debug APK is now installed on the local emulator. Its certificate
|
||
differs from the local Gradle debug key: before another local device-test run,
|
||
remove only this synthetic preview package or use a fresh AVD. An install failure
|
||
with zero tests must not be reported as a passing instrumentation run.
|
||
|
||
The owner-authorized signing key and four Gitea secrets were created before this
|
||
correction. Their private backup is `/home/neste/yuvomi-signing/initial-20261021`.
|
||
Do not print its contents. Uncommitted signing changes are preserved in Git stash
|
||
`wip: owner-authorized signing setup paused for true native rewrite`; do not apply
|
||
them blindly or resume signing/publishing the old wrapper.
|
||
|
||
Current local native outputs/logs:
|
||
|
||
- `/home/neste/yuvomi-native-build` (use `YUVOMI_BUILD_DIR` on WSL).
|
||
- `/home/neste/yuvomi-native-validation.log` and native integration logs.
|
||
- `/home/neste/yuvomi-native-swift` and `/home/neste/yuvomi-native-swift.log`.
|
||
- The existing persistent SDK, Swift, ktlint, actionlint and unmodified upstream
|
||
paths listed below remain usable. Set `ANDROID_SERIAL=emulator-5554`; do not
|
||
authorize or deploy to unrelated devices visible in `adb devices`.
|
||
|
||
Run native JVM/Compose UI tests, the real upstream fixture, portable Swift API/
|
||
contract tests, formatting, lint and OSV after changes. Apple UI/Security.framework
|
||
is not typechecked by Linux. Gitea's Mac job now bootstraps pinned Node before
|
||
checkout, but actual Xcode results still need inspection. Ubuntu emulator jobs
|
||
continue requiring accessible KVM; do not weaken or fake that evidence.
|
||
|
||
Initial 0.2.0 local native evidence: 10 JVM tests, 6 API-35 Compose tests, 7 real-server
|
||
instrumentation tests (including those same 6), both lint variants and native
|
||
debug/unsigned release APK/AAB builds pass. Sixteen portable Swift tests and strict
|
||
format/parsing pass. Screenshot export now uses AndroidX test storage/AGP output
|
||
collection before uninstall; the PNG was opened and confirmed nonblank. Five new
|
||
output-regression tests guard missing, invalid, ambiguous and stale screenshots.
|
||
See `validation.md` for logs and limitations. No Apple SDK result is implied.
|
||
|
||
Android build job 1059 in global run 660 (#5) succeeded; the actual native debug
|
||
artifact was downloaded, checked and installed/launched on `emulator-5554`.
|
||
Jobs 1060/1061 still fail KVM preflight. Mac job 1062 in run 661 (#6) passed native
|
||
Node bootstrap and checkout, printed Xcode 27.1, then stalled in Apple-tool
|
||
preflight for at least 20 minutes. The new `check-apple-tools.py` prints each
|
||
command and imposes a 60-second deadline; fourteen runner/probe regressions pass.
|
||
Follow-up Mac job 1066 in run 663 (#8) identifies the exact blocker:
|
||
`xcrun simctl list devices available` exceeds 60 seconds. Xcode version and Swift
|
||
lookup pass. An administrator must fix the runner user's CoreSimulator/login
|
||
session/Xcode prerequisites without weakening the check. App compilation/tests
|
||
and archive have not run. No remote host license/settings were changed.
|
||
Rebuild/collect from a clean checkout; do not present cached wrapper artifacts as
|
||
the native preview. Keep the signing stash parked.
|
||
|
||
Next work: stabilize/visually compare this slice, close auth/advanced CRUD gaps,
|
||
then implement the remaining real native modules against the parity inventory.
|
||
|
||
## Historical environment and original delivery context
|
||
|
||
This is a development delivery, not authorization to publish. Preserve the Git
|
||
history on `feat/yuvomi-mobile`; use Conventional Commits and normal pushes only.
|
||
The authorized community remote is `https://git.nesterovic.cc/nessi/Yuvomi-App`.
|
||
Do not push, submit issues or open pull requests against upstream on this task's
|
||
behalf. No production credentials or store accounts have been provided.
|
||
|
||
## Start with the evidence
|
||
|
||
Read [validation](validation.md), [security review](security-review.md), and
|
||
[release gates](release-process.md). Do not repeat completed implementation work
|
||
or equate portable Swift checks with an iOS app build. Inspect `git status` before
|
||
editing; preserve any newer maintainer changes.
|
||
|
||
The upstream reference is Yuvomi 2.78.0 at
|
||
`10bfef7686ed7303b4c74c7fcc55a5eb16356c9d`. Keep it unmodified. Subpath hosting,
|
||
browser-to-native OIDC handoff and native remote push are not implemented.
|
||
|
||
The extended API 35 HTTPS suite passes all seven tests, including the local-IdP
|
||
round trip, native transfers, recovery and back navigation. Portable Swift has
|
||
seven passing policy tests; the separate JUnit verifier has eight regressions.
|
||
Keep the fixture's scope separate from real-provider or Apple-platform validation.
|
||
|
||
## Persistent local environment (Linux/WSL)
|
||
|
||
- Repository: `/mnt/c/Users/neste/Documents/GIT/Yuvomi-App`.
|
||
- Upstream and installed dependencies: `/home/neste/yuvomi-tools/upstream`.
|
||
- SDK: `/home/neste/yuvomi-tools/android-toolchain/android-sdk`.
|
||
- Build outputs/logs: `/home/neste/yuvomi-build`.
|
||
- Swift 6.2.1: `/home/neste/yuvomi-tools/swift-6.2.1-RELEASE-ubuntu24.04/usr/bin`.
|
||
- Swift compatibility libraries: `/home/neste/yuvomi-tools/compat/usr/lib/x86_64-linux-gnu`.
|
||
- Swift scratch output: `/home/neste/yuvomi-swift-build`.
|
||
- ktlint and actionlint: `/home/neste/yuvomi-tools/ktlint.jar` and
|
||
`/home/neste/yuvomi-tools/actionlint`.
|
||
- Local collected artifacts/evidence: ignored `artifacts/android/`.
|
||
|
||
`/tmp/opencode` is temporary and was cleared by server restarts. Background
|
||
processes may also disappear. Keep durable logs under `/home/neste`; never persist
|
||
the integration fixture's generated private CA, keys or real household data.
|
||
|
||
```sh
|
||
export ANDROID_HOME=/home/neste/yuvomi-tools/android-toolchain/android-sdk
|
||
export YUVOMI_BUILD_DIR=/home/neste/yuvomi-build
|
||
"$ANDROID_HOME/platform-tools/adb" devices -l
|
||
"$ANDROID_HOME/platform-tools/adb" shell am get-started-user-state 0
|
||
# Require RUNNING_UNLOCKED, then:
|
||
python3 scripts/test-integration.py /home/neste/yuvomi-tools/upstream --android
|
||
bash android/gradlew -p android testDebugUnitTest lintDebug lintRelease assembleDebug assembleRelease bundleRelease
|
||
python3 scripts/collect-android-artifacts.py
|
||
```
|
||
|
||
The API 35 AVD is `yuvomi-test`. Its stable attempt uses KVM, `-gpu host`,
|
||
`-no-window -no-audio -no-boot-anim -no-snapshot -memory 2560 -cores 2`.
|
||
Launch under the SDK/AVD owner with access to the `kvm` group. Other GPU modes
|
||
previously crashed the host emulator with SIGSEGV. API 37 had broken services and
|
||
locked credential-encrypted storage; no API 37 runtime success is claimed.
|
||
|
||
For portable Swift checks add the compiler directory to `PATH` and set
|
||
`LD_LIBRARY_PATH` to the compatibility-library directory above, then use the
|
||
commands in [iOS development](build-ios.md). Apple application/XCTest/UI/archive
|
||
validation must happen on macOS with Xcode and real supported devices.
|
||
|
||
## Highest-priority external work
|
||
|
||
1. Typecheck/build the iOS app against Apple SDKs, run its actual XCTest/UI tests,
|
||
and produce an unsigned archive. Fix any failures; none of these ran locally.
|
||
2. Run the API 37 permission grant/denial/revocation scenarios on a working image
|
||
or device, plus the minimum-supported Android and current WebView matrix.
|
||
3. Review iOS unknown-length download disk-pressure handling before release.
|
||
4. Validate real supported IdPs, TOTP after SSO, linking, cancellation, native
|
||
file/camera pickers, process death, accessibility and offline account isolation.
|
||
5. Establish private vulnerability reporting, owned identifiers, authorized CI,
|
||
human security review and owner-controlled signing before any distribution.
|
||
|
||
Gitea workflows in `.gitea/workflows/` target the maintainer's `ubuntu-latest`
|
||
pool and `macos-arm64` M4 Pro runner. Read [runner setup](ci-runners.md) before
|
||
changing their labels or signing policy. Hosted CI and store readiness still
|
||
require actual successful runs; runner registration alone is not test evidence.
|