Overview
Aura is a full-stack mobile application built as a team project for an Android development course. The client is written in Java across 17 classes, targeting Android 7.0 (API 24) and up. All persistence, identity and media storage run on Firebase, so the app has no custom server.
Users sign up, build a profile with photos, and set matching preferences. The app then filters every other profile against those preferences, including distance computed from the device's location. Profiles are presented as swipeable cards. When two users accept each other the app detects the mutual match and opens a conversation between them.
Around that core sits the account management a production app needs: password changes and account deletion behind re-authentication, sign-out, and unmatching with conversation cleanup.
How it works
Authentication and account management
Firebase Authentication handles email and password sign-up and sign-in. Sensitive operations such as changing a password or deleting an account require the user to re-authenticate with their current password first.
Data model
The Realtime Database holds three top-level collections: Profile (attributes, photo URLs, accepted and rejected lists, last known location), Preferences (the user's matching criteria) and Conversations (participants and timestamped messages). Profile photos are uploaded to Cloud Storage under a per-user path, and their download URLs are stored on the profile and rendered with Glide.
Location-aware matching
On launch the app reads the device location through the Fused Location Provider, falling back gracefully when permission is denied. It then loads candidate profiles and drops the current user, anyone already accepted or rejected, and anyone who fails the user's preference filters: gender (with an "either" option), multi-select ethnicity, minimum or maximum thresholds on numeric attributes, and a maximum distance computed with Location.distanceBetween.
Swiping and mutual-match detection
A custom GestureDetector-based touch listener turns swipes and taps into accept and reject actions and steps through each profile's photos. On every accept the app checks whether the other user has already accepted the current user. If so, it creates a conversation keyed by the two user IDs sorted alphabetically, so both users always resolve to the same node and duplicates cannot be created.
Computed profile score
Each profile has a score from 0 to 1000 computed on demand from its attributes by a weighted formula on the profile model, and shown in the app header for whichever profile is on screen.
Chat
Messages are stored under each conversation and ordered by timestamp. The chat list is built with RecyclerView adapters and sorted by the time of the most recent message. Either user can unmatch, which removes the match from their accepted list and deletes the conversation.
Account settings
Users can change their password, sign out or delete their account from a dedicated settings screen, with re-authentication guarding the destructive actions.
Skills and technologies
Also built: earlier Android coursework
Earlier in the same course I designed and built several Java Android applications in Android Studio using the MVVM architecture for code separation and long-term maintainability. My first major project was a secure password manager that required a master password to view stored credentials, backed by local database storage. I also implemented a custom scientific calculator with BEDMAS parsing logic to handle complex arithmetic beyond a standard calculator project, with responsive UI components throughout.