Skip to content

Offer the log from the login screen, where failures were undebuggable - #197

Merged
parawanderer merged 2 commits into
mainfrom
feat/export-logs-from-the-login-screen
Sep 13, 2026
Merged

parawanderer merged 2 commits into
mainfrom
feat/export-logs-from-the-login-screen

Conversation

@parawanderer

Copy link
Copy Markdown
Owner

The error report page — the only screen that can produce a log — was reachable from the map and the device list and from nowhere else. So a sign-in failure, the failure most worth diagnosing and the one a new user is most likely to meet, could hand them nothing. Their options were adb on a second machine, or nothing. In practice that means the report arrives as "it does not work".

Today made the case: every sign-in in the project failed for two weeks, and no user could produce evidence of it from the app.

What this adds

An Export logs button in the error box, under the failure message, opening the report page on the failure that is showing. It is a separate activity, so closing it returns to the login screen with the error still up and the typed Apple ID still there — looking at the log costs nothing.

The body text is its own string rather than the export one. A sign-in can fail because Apple declined, which is worth waiting out rather than reporting, and the page says so before it asks for a report — the distinction #177 drew on screen, carried through to the page behind it.

Also

rootOf moves to ErrorReportActivity beside describe. Every caller of describe needs it first, for a reason that is easy to miss: Rx wraps what a map throws, so describing the error as it arrives puts RuntimeException on the page and buries the sentence the reporter needs. Two screens keeping their own copy is two reports of one bug looking like two.

Tests

  • a failed sign-in opens the page with the cause carried through — asserted on EXTRA_CAUSE, not merely on the component, since an intent opening a blank report would pass that
  • the button is not offered before anything has failed, so nobody sends a log of a sign-in they have not attempted

Both strings added in all ten locales; add_strings.py --check passes at 373.

Interactively co-authored by Claude Code and @parawanderer

The error report page - the one screen that can produce a log - was reachable from the map and
the device list and from nowhere else. So a sign-in failure, the failure most worth diagnosing
and the one a new user is most likely to meet, could hand them nothing. Their options were adb
on a second machine or nothing, which in practice means the report arrives as "it does not work".

An `Export logs` button now sits in the error box under the failure message and opens the report
page on the failure that is showing. It is a separate activity, so closing it comes straight back
with the error still up and the typed Apple ID still there - looking at the log costs nothing.

The body text is its own string rather than the export one. A sign-in can fail because Apple
declined, which is worth waiting out rather than reporting, and the page says so before it asks
for a report - the distinction #177 drew on the screen, carried through to the page behind it.

`rootOf` moves to `ErrorReportActivity` beside `describe`, because every caller of that needs it
first and for a reason easy to miss: Rx wraps what a `map` throws, so describing the error as it
arrives puts "RuntimeException" on the page and buries the sentence the reporter needs. Two
screens keeping their own copy is two reports of one bug looking like two.

Two tests: that a failed sign-in opens the page with the cause carried through - asserted on the
extra, not merely on the component, since an intent opening a blank report would pass that - and
that the button is not offered before anything has failed.
The report opened with `cause=unknown`. The error was displayed by the login subscriber's own
inline copy of showLoginFailure - the same five steps written out again - which never recorded
the failure, so there was nothing for the Export logs button to describe.

Deduplicated rather than patched: the copy existed before this change and drifted the moment
showLoginFailure grew a sixth step. One path now, and a second one cannot silently skip it.

Worth noting the test caught this only because it asserts on EXTRA_CAUSE rather than on the
component. An intent check that just confirmed the right activity opened would have passed
against a report page that named nothing.
@parawanderer
parawanderer merged commit 55a334a into main Sep 13, 2026
3 checks passed

This branch was successfully deployed

1 active deployment
Android Build — 7ad1e970 Deployed Sep 13, 2026 by parawanderer via build #250
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