← All projects

Aura: A Native Android App on a Firebase Backend

A native Android app in Java that combines Firebase authentication, a Realtime Database, cloud image storage and device location to deliver preference-based profile matching, mutual-match detection and one-to-one chat.

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.

Aura sign-in screen with email and password fields
Swipeable profile card with accept and reject buttons

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.

Profile settings with photo upload and matching preferences

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.

One-to-one chat screen between two matched users
Account settings with change password, sign out and delete account

Skills and technologies

Java Android Studio Firebase Authentication Firebase Realtime Database Firebase Cloud Storage Location Services RecyclerView Material Design Gesture Handling Team Development

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.

Screenshots of the password manager and scientific calculator apps

Video demo

Java MVVM Local Database Expression Parsing
← Back to Projects