Skip to content

[PM-41291] feat: Add model and data layer for Identity Autofill - #7232

Open
aj-rosado wants to merge 2 commits into
mainfrom
PM-41291/identity-autofill-model-and-data-layer
Open

[PM-41291] feat: Add model and data layer for Identity Autofill#7232
aj-rosado wants to merge 2 commits into
mainfrom
PM-41291/identity-autofill-model-and-data-layer

Conversation

@aj-rosado

Copy link
Copy Markdown
Contributor

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-41291

📔 Objective

Phase A/B of Identity Autofill (PM-38138): adds the model layer and data-layer plumbing that later phases build on.

  • New model types: AutofillView.Identity, AutofillPartition.Identity, AutofillCipher.Identity, and the corresponding AutofillHint entries.
  • AutofillCipherProvider.getIdentityAutofillCiphers() (+ implementation) to fetch identity ciphers, mirroring the existing getCardAutofillCiphers().
  • Every exhaustive when forced by the new sealed-class members is completed now, either with permanent trivial logic or an explicit inert stub (e.g. AutofillRequest.Unfillable) commented to say which later phase replaces it — no behavior change yet.
  • A second AutofillCipherProvider implementation (CipherViewExtensions.kt's toAutofillCipherProvider(), used by the manual-selection/accessibility completion flow) is updated in parallel so the two don't drift.

This PR is intentionally behavior-neutral — nothing yet classifies a field as Identity, so none of this is reachable in production. Detection and fill land in later stacked phases (heuristic detection, fill-assist mapping, and the identity partition build-out).

📸 Screenshots

N/A — model/data layer only, no UI changes.

@aj-rosado aj-rosado added the ai-review Request a Claude code review label Aug 3, 2026
@github-actions github-actions Bot added app:password-manager Bitwarden Password Manager app context t:feature Change Type - Feature Development labels Aug 3, 2026
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🤖 Bitwarden Claude Code Review

Overall Assessment: APPROVE

Re-reviewed the identity autofill model/data layer after the follow-up commit. The PR content is unchanged from the previously reviewed state (982905e); the only difference in this branch is a rebase onto main. I re-verified that the change is behavior-neutral: no code path emits an IDENTITY_* hint or constructs an AutofillView.Identity, AutofillPartition.Identity.canPerformSaveRequest is always false (empty requiredSaveIds), so the null return from toAutofillSaveItem() and the new saveCallback.onSuccess() branch in AutofillProcessorImpl are unreachable for Card/Login and preserve existing behavior.

Code Review Details

Both prior threads were addressed:

  • identityAutofillAddress / identityAutofillName are now separate autofill-oriented formatters (omit missing parts, join with a single space, exclude the title prefix), and the display formatters in ui/vault/feature/item/util/CipherViewExtensions.kt were restored to their original - placeholder / newline behavior.
  • The else -> branch in ViewNodeExtensions.buildAutofillView was replaced with all 17 IDENTITY_* hints listed explicitly, preserving when exhaustiveness.

Also verified: getIdentityAutofillCiphers() mirrors getCardAutofillCiphers() filtering (active, non-reprompt, type match) and correctly omits the card-only RESTRICTED_ITEM_TYPES policy check; BitwardenString.type_identity and BitwardenDrawable.ic_id_card both exist.

No findings at or above the reporting threshold.

@codecov

codecov Bot commented Aug 3, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 33.55705% with 99 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.27%. Comparing base (d029ebb) to head (6f0c34c).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...twarden/data/autofill/parser/AutofillParserImpl.kt 0.00% 32 Missing ⚠️
...ta/autofill/provider/AutofillCipherProviderImpl.kt 37.14% 0 Missing and 22 partials ⚠️
...twarden/data/autofill/util/CipherViewExtensions.kt 20.00% 0 Missing and 20 partials ⚠️
...arden/data/autofill/util/AutofillViewExtensions.kt 0.00% 12 Missing and 5 partials ⚠️
...ui/vault/feature/item/util/CipherViewExtensions.kt 62.50% 0 Missing and 3 partials ⚠️
...den/data/autofill/builder/FilledDataBuilderImpl.kt 0.00% 2 Missing ⚠️
...bitwarden/data/autofill/util/ViewNodeExtensions.kt 0.00% 2 Missing ⚠️
...twarden/data/autofill/util/FilledDataExtensions.kt 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7232      +/-   ##
==========================================
+ Coverage   86.11%   86.27%   +0.16%     
==========================================
  Files         894      921      +27     
  Lines       65179    66418    +1239     
  Branches     9741     9843     +102     
==========================================
+ Hits        56126    57304    +1178     
  Misses       5574     5574              
- Partials     3479     3540      +61     
Flag Coverage Δ
app-data 17.52% <28.18%> (-0.29%) ⬇️
app-ui-auth-tools 18.65% <2.01%> (-0.03%) ⬇️
app-ui-platform 16.75% <0.00%> (+0.27%) ⬆️
app-ui-vault 27.88% <3.35%> (+0.46%) ⬆️
authenticator 6.06% <0.00%> (-0.03%) ⬇️
lib-core-network-bridge 4.09% <0.00%> (-0.01%) ⬇️
lib-data-ui 1.20% <0.00%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@aj-rosado
aj-rosado marked this pull request as ready for review August 3, 2026 13:28
@aj-rosado
aj-rosado requested review from a team and david-livefront as code owners August 3, 2026 13:28
@aj-rosado aj-rosado added t:feature Change Type - Feature Development and removed t:feature Change Type - Feature Development labels Aug 3, 2026
Comment on lines +91 to +102
internal val IdentityView.identityAddress: String?
get() = listOfNotNull(
address1,
address2,
address3,
listOf(city ?: "-", state ?: "-", postalCode ?: "-")
.nullIfAllEqual("-")
?.joinToString(", "),
country,
)
.joinToString("\n")
.orNullIfBlank()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ IMPORTANT: identityAddress is a display formatter; reusing it as AutofillCipher.Identity.fullAddress will fill - placeholders and newlines into form fields.

Details and fix

identityAddress was written for the vault item detail screen, where - placeholders and \n separators render acceptably. AutofillCipher.Identity.fullAddress is documented as "address parts joined for filling a combined full-address field", so the later fill phase will push this exact string into a PostalAddressFull input.

The new test in CipherViewExtensionsTest.kt locks in the problematic output:

assertEquals("address3\n-, state, -", identityView.identityAddress)

For a cipher with only state populated, the user's address field would be filled with a literal -, state, -. Newlines in a single-line EditText are also dropped or rendered as spaces depending on the app.

Suggested fix: keep identityAddress for display and add a separate autofill-oriented formatter that omits missing parts entirely (no - placeholders) and joins with ", " — e.g. listOfNotNull(address1, address2, address3, city, state, postalCode, country).joinToString(", ").orNullIfBlank().

Same root cause applies to identityName: it prefixes the title, so a PersonNameFull field would be filled with Mr John Doe even though PersonNamePrefix exists as its own view for the title.

Since fill is a no-op in this phase, this is not user-visible yet — but the shape is being locked in here and asserted by tests, so it's cheaper to correct now than in the fill phase.

@aj-rosado aj-rosado Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@claude I agree with you. Reverted this method to the CipherViewExtensions it originally belonged and added a new one for the autofill

Comment on lines +256 to +262
// Identity hint detection/dispatch is wired up in a later phase; treating these as Unused for
// now is a no-op since nothing yet produces an IDENTITY_* hint.
else -> {
AutofillView.Unused(
data = autofillViewData,
)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ DEBT: The else -> branch removes when exhaustiveness over AutofillHint, so a missed hint in the next phase compiles silently.

Details and fix

Everywhere else in this PR the new sealed-class/enum members are enumerated explicitly, which is what makes the "later phase will have to touch this" guarantee work. Here the else does the opposite: after the 17 IDENTITY_* entries are added to AutofillHint, the compiler can no longer tell the next author which ones still need a dispatch case, and any hint they forget quietly becomes AutofillView.Unused — a silent no-fill rather than a build failure.

Suggested fix: list the identity hints in a single grouped branch instead of else:

AutofillHint.IDENTITY_PERSON_NAME_FULL,
AutofillHint.IDENTITY_PERSON_NAME_PREFIX,
// ... remaining IDENTITY_* entries
    -> {
    // Identity hint dispatch is wired up in a later phase.
    AutofillView.Unused(data = autofillViewData)
}

This keeps the same inert behavior while preserving the compile-time check.

@aj-rosado aj-rosado Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@claude added all cases

@aj-rosado
aj-rosado force-pushed the PM-41291/identity-autofill-model-and-data-layer branch 2 times, most recently from d4d3b08 to 982905e Compare August 3, 2026 17:24
@aj-rosado
aj-rosado force-pushed the PM-41291/identity-autofill-model-and-data-layer branch from 982905e to 6f0c34c Compare August 4, 2026 16:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review Request a Claude code review app:password-manager Bitwarden Password Manager app context t:feature Change Type - Feature Development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant