Gmail, Yahoo, and iCloud all authenticate the same way in this flow: preconfigured
IMAP/SMTP + an app password. Rather than three near-identical screens, build one guided
app-password screen parameterized by the provider preset from #28. The existing ManualSetupViewModel already builds a PASSWORD_IMAPAccount and calls AccountRepository.addImapAccount (verify + persist) — reuse that backend path.
Scope
Reusable app-password setup screen that takes a provider key and loads its preset +
help copy from #28.
Explain what an app password is, and warn the user to store it carefully and
securely because it grants access to their account.
A button/link that opens the provider's app-password creation page (from #28).
Inputs: email + app password. Servers come from the preset and are not shown as
required fields (optionally reveal a read-only/advanced override for edge cases).
Test + save via addImapAccount(account, appPassword) (live connection test already
built in), surfacing failures the way ManualSetupScreen does today.
ViewModel unit tests (valid/invalid input, connection failure surfaced as error);
new files carry the SPDX header.
Acceptance criteria
Selecting Gmail/Yahoo/iCloud in the picker opens this screen preconfigured for that
provider, with the correct app-password link and explanation.
A valid email + app password verifies against the server and persists the account,
reusing the existing credential store + sync trigger.
A bad password/host surfaces an inline error and does not persist the account.
Relevant files
app/src/main/kotlin/org/libremail/ui/accountsetup/ManualSetup{Screen,ViewModel}.kt (pattern to reuse)
Part of #9.
## Context
Gmail, Yahoo, and iCloud all authenticate the same way in this flow: preconfigured
IMAP/SMTP + an app password. Rather than three near-identical screens, build one guided
app-password screen parameterized by the provider preset from #28. The existing
`ManualSetupViewModel` already builds a `PASSWORD_IMAP` `Account` and calls
`AccountRepository.addImapAccount` (verify + persist) — reuse that backend path.
## Scope
- [ ] Reusable app-password setup screen that takes a provider key and loads its preset +
help copy from #28.
- [ ] Explain **what an app password is**, and warn the user to **store it carefully and
securely because it grants access to their account**.
- [ ] A button/link that opens the provider's app-password creation page (from #28).
- [ ] Inputs: email + app password. Servers come from the preset and are **not** shown as
required fields (optionally reveal a read-only/advanced override for edge cases).
- [ ] Test + save via `addImapAccount(account, appPassword)` (live connection test already
built in), surfacing failures the way `ManualSetupScreen` does today.
- [ ] ViewModel unit tests (valid/invalid input, connection failure surfaced as error);
new files carry the SPDX header.
## Acceptance criteria
- Selecting Gmail/Yahoo/iCloud in the picker opens this screen preconfigured for that
provider, with the correct app-password link and explanation.
- A valid email + app password verifies against the server and persists the account,
reusing the existing credential store + sync trigger.
- A bad password/host surfaces an inline error and does not persist the account.
## Relevant files
- `app/src/main/kotlin/org/libremail/ui/accountsetup/ManualSetup{Screen,ViewModel}.kt` (pattern to reuse)
- `app/src/main/kotlin/org/libremail/data/repository/AccountRepositoryImpl.kt` (`addImapAccount`)
- provider registry from #28
## Dependencies
Depends on #28. Reached from #27.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of #9.
Context
Gmail, Yahoo, and iCloud all authenticate the same way in this flow: preconfigured
IMAP/SMTP + an app password. Rather than three near-identical screens, build one guided
app-password screen parameterized by the provider preset from #28. The existing
ManualSetupViewModelalready builds aPASSWORD_IMAPAccountand callsAccountRepository.addImapAccount(verify + persist) — reuse that backend path.Scope
help copy from #28.
securely because it grants access to their account.
required fields (optionally reveal a read-only/advanced override for edge cases).
addImapAccount(account, appPassword)(live connection test alreadybuilt in), surfacing failures the way
ManualSetupScreendoes today.new files carry the SPDX header.
Acceptance criteria
provider, with the correct app-password link and explanation.
reusing the existing credential store + sync trigger.
Relevant files
app/src/main/kotlin/org/libremail/ui/accountsetup/ManualSetup{Screen,ViewModel}.kt(pattern to reuse)app/src/main/kotlin/org/libremail/data/repository/AccountRepositoryImpl.kt(addImapAccount)Dependencies
Depends on #28. Reached from #27.