2.8 KiB
Contacts
The contacts screen stores and manages frequently used transfer recipients. Contacts are local to the app and never synced externally.
Fragment — ContactsFragment
Displays the full contact list as a RecyclerView. Observes HomeViewModel.contacts and HomeViewModel.contactCategories.
Contact List
Each contact row shows:
- Circular avatar (profile image if set, otherwise initials placeholder)
- Display name
- Account number(s)
- Category chip (if assigned)
Tapping a contact row opens AddContactSheetFragment in edit mode.
Tapping the Transfer button on a contact row opens TransferFragment with the recipient pre-filled.
Categories
Contacts can be assigned to user-defined categories (e.g., "Family", "Business"). Categories appear as filter chips at the top of the list. Tapping a chip filters the list to that category. Tapping again clears the filter.
Add Contact — AddContactSheetFragment
A bottom sheet for creating or editing a contact. The companion exposes a single newInstance(bmlProfileId?, accountNumber?, recipientName?, currency?) factory (AddContactSheetFragment.kt:572-585) used by the BML USD → MIB auto-add flow on the Transfer screen.
Fields
| Field | Notes |
|---|---|
| Name | Display name |
| Account number | Primary transfer account number |
| Bank | Optional — for display only |
| Category | Optional; selectable from existing categories or create new |
| Profile image | Optional; select from gallery or camera |
Profile Image
The pencil icon next to the avatar opens a chooser:
- Gallery — pick from device gallery
- Camera — capture a new photo (temp file in
cacheDir)
The selected image is held in memory as a base64 string (selectedImageBase64 in AddContactSheetFragment) and uploaded inline with the contact on save. A local copy is also kept in util/ContactImageCache (cache directory, PNG, keyed by the image hash) so the avatar can be rendered without a round-trip on next open.
Save
On save, the contact is persisted to the local database and HomeViewModel.contacts is refreshed.
Delete
A delete button (with confirmation dialog) removes the contact and its profile image.
Contact Picker — ContactPickerSheetFragment
A compact bottom sheet version of the contact list, used by TransferFragment when the user taps Choose Contact.
- Shows all contacts with avatar and name
- Search bar filters by name or account number
- Tapping a contact returns the selection to
TransferFragmentand dismisses the sheet - Profile images use a
"local:{key}"synthetic hash prefix to identify locally stored images
← Transfer Next → Activities