Repository navigation
Add native notification centre and reliable Log navigation - #79
ricardovfreixo wants to merge 11 commits into
Conversation
There was a problem hiding this comment.
Tried this on a Moto g24: a Debug build of this branch merged onto current main, with #588 and #162 merged into main's SDK branches.
The new "Refreshing…" chip shows up in more places than the description says:
- Switching between Following, Latest and Trending.
switchTo()callsopenAfresh(), which now callsopen(feedback: true). Switching used to be quiet. Now every switch puts the chip up until the fetch lands, which takes a few seconds on Trending because it re-ranks. - Pull to refresh.
load()passesfeedback: true, so a pull shows the chip on top of the list's own pull spinner. That's two spinners for one refresh. - Re-tapping the Log tab through
refreshLog(). This is the case the PR is about, and the chip makes sense there because nothing else shows that a refresh started.
Could the feedback be limited to the tab re-tap? openAfresh() would go back to plain open(), load() would stop passing feedback, and refreshLog() would ask for it instead, for example with a load(feedback: true). iOS doesn't have the reselect wired, so the chip would never show there, which matches how the Log behaved before.
If the chip is on pulls because Android's pull spinner runs for a fixed 1.5s and doesn't wait for the request, that's better fixed in mobile-ui's ListRenderer than with a second indicator in the app.
It also shows up in the middle of the screen on iOS.
I'm not sure we need it at all on either platform.
|
Thanks for testing on the Moto g24. Addressed in 3412c44: Added regressions for both platforms and all feed/pull paths. Full PHP suite: 1,303 passed (1 skipped, 2 existing deprecations); focused reselect/feedback suites: 30 passed / 578 assertions. Independent review passed. I have not run a native build/device check of this follow-up. This commit is limited to the feedback fix; newer app/SDK main integration is separate. |
|
Tested the notification centre on a physical iPhone 17 running iOS 27.2, using app revision Manual checks passed:
No issues found during this manual iOS pass. The Show all notifications control initially appeared to be missing, but it correctly appears only when the filtered list is empty. This validates the notification-centre checks above. The Android-only Log-tab reselect behavior in core PR #588 was not validated on iOS. |
Summary
Closes #71.
Native notification centre
Log navigation and refresh feedback
Complete companion delivery
46bec5c2fb3742925d62855312ea06457158012e0cdd321d24d442d59159d1cb7516609128bb00b1The core/UI refs are public fork refs recorded in
composer.jsonandcomposer.lock; only those two package records changed. No local path repositories, vendor patches or committed generated Android sources are needed. UI release must follow the matching core interface. Replace the temporary fork pins with upstream versions once the companions are released.Missing backend metadata degrades honestly, but is not full end-to-end preview parity. The runtime lock and ignored free manifests are not committed; the author's existing PHP 8.5.12 runtime pin was preserved byte-for-byte.
Current upstream-main sync and lock resolution
Latest sync:
a5f53c27cd8d8d1c470521d8c93392a6665ae5fd. Merges newly advanced app main62243e2, including scheduling/timezones and mention-caret placement. UI companion0cdd321now includes upstreamd7eca12so the new mention behavior is retained, rather than resolving the lock conflict by keeping an obsolete SDK. Core remains46bec5c. The tracked lock preserves main's semver/phpdoc-parser updates and differs from main only in the two SDK package records; the isolated free lock and installed public ZIPs match.Verification for this sync: app 1,762 passed / 16,917 assertions, 1 skipped, 2 deprecated; UI 472 passed / 1,390 assertions. Pint, both Composer manifests and diff checks pass. No native rebuild or new device evidence; previous device reports remain revision-specific. Original checkout/local runtime pin unchanged.
Previous sync:
fad2d3b35fb8d3365d56b571877b1e9b1a8b4b57. Merges app main188715c, core main9da9a848and UI main29ac552into the existing public branches without rewriting history. Retains upstream level/rank wording, handle-based API parsing, Who to follow, voice notes, organization screens, message menus/reactions/pins and ToastKit alongside this PR's filters, polling and Android reselect. The SDK merge shares reselect handling between system/custom tab presenters and retains upstream screen backgrounds/chrome controllers with per-mount saveable state; list auto-scroll and reselect scroll targets coexist.Test integration follows current upstream contracts: sealed async payloads are inspected through the transport API, fixture identities use
handle, and posted replies stay in place until explicitly opened. The two SDK package records are the only tracked-lock package differences from app main. The isolated free lock removes only secure storage and otherwise matches the tracked lock; tests used the exact public SDK ZIPs, not local patches.Latest local verification: app 1,678 passed / 16,086 assertions, 1 skipped, 2 deprecated; core 2,417 passed / 8,599 assertions, 8 skipped, 4 risky, 2 warnings (including unavailable coverage); UI 453 passed / 1,337 assertions. Pint, both Composer manifests and diff checks pass. GitHub reports all three published heads mergeable. The original checkout, credentials and local runtime pin were left untouched.
No native build or fresh device evidence for this sync. Previous device evidence below is revision-specific and does not validate the new merged SDK pair. The sections below retain the earlier sync history.
Earlier sync history
Merge
de6896eincorporates appmain(4850154) without rewriting public history. Both SDK branches were merged with their current upstream mains: corecbf2eb4includesb107ed9, UI00e4831includes86ef0e6. This retains main's bounded image gestures, keyboard/chrome/font/runtime changes alongside the SDK companions; keeping the old fork pins would have dropped newly required gesture support. The stack renderer conflict combines upstream's chrome controller with per-mount saveable panes. Independent source review found no P0/P1.Both tracked/free locks pin the published ZIP refs; only those two SDK package records differ from current app main. The author's existing
.envand PHP 8.5.12 runtime lock are unchanged, and the ignored free setup is updated to the same pair. GitHub confirms all three PRs are mergeable. The author subsequently regenerated/rebuilt Android for the captures below; iOS and the remaining native gates are still outstanding.Moto g24 review follow-up
Addressed the reported extra indicators in
3412c44954ea3cd31e9a15741e22e1b812fc1153:openAfresh()opens quietly,load(bool $feedback = false)is quiet by default, and onlyrefreshLog()opts in. Pull-to-refresh uses the list's own spinner; feed switches and the iOS paths never raise this chip. Existing per-feed/request-generation ownership, retries and forced repeated refreshes are retained. No ListRenderer, styling, dependency or SDK edits were made.Six additional parameterized regression cases fail before the fix and pass after it. The full app suite passes 1,303 tests (the same 1 skipped / 2 deprecated); after strengthening the cross-feed ownership scenario, both focused suites pass 30 tests / 578 assertions. Independent review and Pint/diff checks pass. Device confirmation of this latest change is still outstanding. The subsequent upstream-main integration is documented above.
Verification
composer testpreviously passed 3,972 tests / 21,963 assertions, 100% code/type coverage, lint and frontend checks.No native build, JVM tests or Android instrumentation was executed by the agent. The author rebuilt Android; the agent captured the real Pixel 9 UI and the limited interactions documented below. This does not complete the remaining device gates. The pane instrumentation test checks saveable-state ownership, not a real feed's pixel offset. This is ready for review/community testing, not a claim of completed native validation.
Follow-up: reported Kotlin compile failure
The first user build reported four unresolved references to
LocalTopBarColor/LocalTopTabRowin the upstream UI tab-strip renderer. The pinned core does not expose those hooks. UI commit28753b7removes the unsupported imports and retains the documented transparent container; no core stubs or other tab behavior were added.Both locks now pin that public fix. Its two source regression tests passed (red before the fix), the UI suite passed 407 tests, and the app's 26 Log navigation/feedback tests passed. The 1,297-test full app run above predates this Kotlin-only follow-up. Native compilation still awaits the user's rerun; PHP checks are not compiler validation.
Follow-up: Onboarding missing-file startup race
The next user build reached PHP but failed including Flysystem's
PortableVisibilityConverter.php. The file was verified in the host, staging directory, bundle ZIP, APK's nested bundle and the exact device include path. Device error time was12:50:30.192UTC; the file was rewritten at12:50:30.676UTC, about 485 ms later.Core commit
f06d13ccloses the source-confirmed race: an initializer could check persistent-runtime state before waiting onextractionLock, then re-extract DEBUG'slaravel/directory after another initializer booted PHP. Both foreground and background initializers now recheck under the SAME lock used by persistent boot, before extraction/artisan work. No credentials, persisted data or key-store implementation were changed.Six source-contract regressions pass; a production-helper two-thread JVM test is included but unrun. Core PHP suites pass 2,157 tests, independent review is clear, and 50 app Onboarding/Log tests pass. Both locks pin the public fix. The guard remains in the latest core merge. The installed Composer packages are updated; after the broader upstream SDK sync, the generated native shell must be regenerated by the author using the backed-up-shell procedure below. Do not clear app data or credentials. Native compile/cold-start verification remains user-run.
Reproduce / Android test
Fresh checkout: use the README's normal or free setup. The normal manifest includes the paid secure-storage plugin. The latest pair was installed and tested in an isolated worktree. Existing author checkouts must refresh their ignored free manifest/lock to match the new tracked requirements before installing; do not rerun first-install scripts that regenerate
.env/keys on an existing installation.For the existing free setup:
Regenerate the Android shell so the new CORE Kotlin files are included; hot reload is insufficient. Back up any custom files under
nativephp/androidfirst: the installer replaces that generated directory. The author must run these commands manually:Use Java 21 and the configured Android SDK. Keep host/bundled PHP minor versions aligned and inspect any installer-induced runtime-lock changes; do not commit the author's local runtime pin. The 1G override is required for the host build and does NOT change on-device PHP memory.
Community iOS evidence (earlier revision)
mdeloughry's physical-device report validates app
de6896e58028e01489ff5a002b0b35e346808440and its pinned companions on iPhone 17 / iOS 27.2: filters/persistence, More sheet, notification destinations/back, expansion/pagination/pull, arrival button, background/offline recovery, light/dark, and Show all with all categories disabled. No issues found. This is not fresh validation offad2d3bor Android-only Log reselect, and does not supply the missing iOS media.Outstanding gates
BottomTabTapDecisionTest,NativeScrollTargetRegistryTest,ScreenTokensTest) and pane instrumentation (ScreenTokenPaneStateTest).Explicit non-claims / separate work
Screenshots
Partial evidence: Android AFTER only. Captured from the author-built PR on a physical Pixel 9 in light and dark mode. Notification list, More/filter sheet and Log screenshots are genuine, unedited captures. Recordings show the filter sheet and a scroll followed by the Log re-tap. They do not establish all-feed behavior, idle reliability or exact thread-return pixel-offset restoration.
Before-state and iOS screenshots/recordings are still pending, not waived. This Linux host has no iOS simulator. The phone was returned to Notifications and its original dark-mode setting; notification filters were not changed. Media is on the separate orphan screenshots branch, not this code branch.
log
log-reselect
Recordings: Android dark, after, Android light, after
notification-filters
Recordings: Android dark, after, Android light, after
notifications