GeoContacts
LiveNative Android, live — location-aware contact management.
Lead with: Android architecture and the core technical problem the app solves.
The technical problem
Contact information and location information usually lived in separate places — phone numbers in the address book, addresses in messages, map pins, notes, or memory. GeoContacts brings them together so a user can save multiple labelled locations against a contact — Home, Work, Other — and get directions without asking for the address again.
Architecture / stack
Contacts are cached locally with Room, using a single ContactModel entity keyed by the contact's unique user ID; phone numbers and location lists are stored inside that entity as JSON via Gson-backed Room type converters, alongside fields like favourites, manually added contacts, profile data, and contact-sync status. Firebase Realtime Database is the cloud source of truth for users, phone numbers, locations, relationships, and synced device contacts — on initial load or a manual refresh the app pulls the latest Firebase data, clears the existing Room cache, and repopulates it, so sync is server-wins replacement rather than field-level merging. Location isn't collected continuously in the background: the app uses Google's Fused Location Provider to request the last known location only while the map screen is open or after the user taps the current-location control, requesting just coarse and fine foreground permissions with no geofencing, polling worker, or persistent foreground service.
The interesting decision
Firebase is the shared source of truth and Room is a replaceable local cache, rather than building bidirectional, field-level synchronization. That kept contact loading and local search fast while still letting shared profile and location changes come from the cloud, and a full refresh avoided the complexity and ambiguity of merging nested phone-number and location lists.
What shipped
A live Android app for importing, organizing, and locating contacts by place — home, a saved location picker, and a contact-import flow.



