Skip to content

Make the login screen use the same buttons as the rest of the app - #86

Merged
parawanderer merged 1 commit into
mainfrom
fix/login-flow-button-consistency
Aug 16, 2026
Merged

parawanderer merged 1 commit into
mainfrom
fix/login-flow-button-consistency

Conversation

@parawanderer

Copy link
Copy Markdown
Owner

The pages after sign-in moved to Material's tonal button, so the login flow was left as the only
place still using outlined ones — which reads as a different app rather than a different screen.

Was Now
2FA method choices, and the SMS button inflated per phone number OutlinedButton TonalButton, matching App Wiki / Github
The four circular icon buttons materialIconButtonOutlinedStyle materialIconButtonFilledTonalStyle — a surface rather than a ring
Their explicit iconTint colorOnSurfaceVariant colorOnSecondaryContainer, the role that belongs on that container
Selection bar's overflow button 6dp padding 10dp, matching Device View exactly

The overflow button was the same 35dp box and the same icon as the one on Device View; only the
padding differed, which made the glyph noticeably larger.

The app mark now takes its colour from the theme

The login screen used opentagviewer_icon, a single flat silhouette, so it was always black.

It now uses geometry from ic_launcher_monochrome — the layer added so Android 13 themed icons
work. That layer already separates the mark's flat face from its extruded side, which is what
makes a two-tone fill possible at all; the silhouette cannot show depth no matter what colour it
is given.

The face takes colorPrimary and the side the same colour at reduced alpha, so the depth
survives whatever the wallpaper does.

One honest caveat: this makes the side lighter than the face on a light background, where
the real icon has it darker. Keeping "darker" in both light and dark needs two roles whose
lightness relationship holds either way, and M3 has no such pair. Flipping it is one number if
the other trade is preferred.

Verification

Rendered on the managed device in both palettes — the mark comes out teal in the app palette and
indigo under wallpaper colours, with the side clearly distinct. Build passes.

Not checked in dark mode; all rendering so far has been light only.


🤖 Generated with Claude Code

This pull request description was written by Claude Code.

The pages after sign-in moved to Material's tonal button, so the login
flow was left as the only place with outlined ones - which reads as a
different app rather than a different screen.

- the 2FA method choices, and the SMS button inflated per phone number,
  become tonal like App Wiki and Github
- the four circular icon buttons become filled tonal, so the back arrow
  has a surface rather than a ring. Their explicit iconTint moves to
  colorOnSecondaryContainer, which is the role that belongs on that
  container - the old one was set against an outlined style
- the selection bar's overflow button matches the one on Device View:
  same 35dp box, but 10dp of padding rather than 6dp, so the glyph is the
  same size. It was noticeably larger before

The app mark on the login screen is now drawn from
ic_launcher_monochrome's geometry rather than the flat silhouette, and
filled from the theme. That layer exists for Android 13 themed icons and
already separates the mark's face from its extruded side, which is what
makes a two-tone fill possible; opentagviewer_icon is a single path and
cannot show depth at all.

The side is the face colour at reduced alpha, so it follows the theme in
both light and dark. Note this makes the side lighter than the face on a
light background, where the real icon has it darker - keeping "darker"
in both modes needs two roles whose lightness relationship holds either
way, and M3 has no such pair.

Rendered on the managed device both ways; see the test output.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@parawanderer
parawanderer merged commit c925f4a into main Aug 16, 2026
3 checks passed
parawanderer added a commit that referenced this pull request Sep 16, 2026
The same split as the app side, in the other two programs that make this
call. Both the wizard and the CLI answered every MobileMeDelegateError with
the terms flow, because terms were the only cause with a remedy here.

Neither of them lied about it - the wizard fetches, finds nothing and says
"this is something else", and the CLI asks before fetching and says the same.
That honesty is why this never arrived as an exporter bug report. It is still
a round trip to Apple to discover something the response already said, and it
still leaves somebody at a dead end holding Apple's word "server problem",
which reads as "wait" when waiting is exactly what does not work.

not_a_terms_problem() in icloud.py is the shared decision, next to
ExportSourceError and the sign-in that raises it, so the wizard and the CLI
cannot drift apart on it the way three screens in the app once did.

The message says sign-in worked, says it is not terms, quotes Apple verbatim
because that string is the only evidence a report can carry, and passes on
the remedy from dchristl/macless-haystack#84, #86 and #87 - appleid.apple.com
and a payment method - as somebody else's finding rather than as fact. It
contradicts Apple's own "try signing in later" on purpose.

Nine tests, both branches of the decision. 657 passed on the exporter suite,
flake8 clean, and pyright unchanged at its pre-existing count.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
Android Build — dd02a863 Deployed Aug 16, 2026 by parawanderer via Instrumented tests (emulator) #83
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