A mobile restaurant administration prototype that lets diners order from their table while staff manage the menu and orders in real time.
Field
Details
Type
Android mobile app prototype
Context
University software design lab
Role
Solo developer
Year
2019
Status
Academic prototype
Main focus
Table-side ordering, live menu inventory, role-based admin flows, and Firebase-backed sync
Overview
The Hungry App is an Android prototype for small restaurants that still rely on paper menus, manual order taking, and handwritten bills. I built it to explore how a single mobile client could serve both diners and staff: customers pick a table, browse a categorized menu, build an order, and review a bill; administrators sign in separately to inspect inventory and incoming orders.
The project was developed as coursework in software design laboratory, with formal requirements, use cases, and domain modeling alongside the implementation. It is a working prototype, not a production deployment, and it stays in my portfolio as an early example of end-to-end mobile product thinking backed by a real-time backend.
The problem
Many small food businesses still run service with static menus and manual coordination between the floor and the kitchen. That creates friction for customers who wait for staff to take orders, and for owners who struggle to keep menu data and sales records consistent.
Paper menus and handwritten orders slow service during busy periods.
Staff spend time walking tables instead of preparing food or handling exceptions.
Inventory and pricing changes are hard to propagate quickly across the dining room.
Owners lack a simple digital trail of what was ordered and when.
Who it was for
Restaurant and café owners who want a lighter digital layer over daily operations.
Diners who prefer ordering from their phone at the table.
Waitstaff who need fewer round trips for standard orders.
Course instructors and reviewers evaluating software design, modeling, and implementation.
My role
I owned the project end to end: problem framing, requirements alignment, Android UI flows, Kotlin and Java application logic, Firebase Authentication and Realtime Database integration, and the documentation that accompanied the prototype. I modeled the domain, planned the client journeys, and wired each screen to shared data under a single restaurant tree in Firebase.
What the project does
The app replaces part of the paper workflow with a connected mobile experience. After sign-up or login, customers reserve a table in the UI, browse dishes by category, add items with quantities, review totals with tax, and follow a simple checkout sequence. Administrators use a separate entry point to browse the full menu catalog and access order-related views intended for operational oversight.
Email-based registration with profile data stored per user.
Login with password recovery through Firebase Auth.
Table selection before ordering, with visual feedback when a table is taken in the session.
Tabbed menu for entrada, fuerte, postre, and bebidas loaded from Firebase.
Order builder with per-item quantity, prep time hints, and running totals.
Bill review with subtotal and 16% IVA before finishing the visit.
Admin shell with navigation drawer for menu browsing and order management screens.
Key features
Account registration and verification
New users register with name, contact details, and birth date. Firebase Auth creates the account, sends an email verification message, and writes profile fields under restaurant/users/{uid}.
kotlin
auth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isComplete) {
val user: FirebaseUser? = auth.currentUser
verifyEmail(user)
val userBD = dbReference.child(user?.uid!!)
userBD.child("name").setValue(name)
userBD.child("lastname").setValue(lastname)
// ...
}
}
I kept authentication in Firebase Auth and profile details in Realtime Database so the app could evolve roles without mixing credentials with menu data.
Role-based entry for customer and admin
After login, the app routes users by account. A dedicated admin email opens the administration activity; everyone else continues to table selection.
kotlin
if (task.isSuccessful) {
val userid = FirebaseAuth.getInstance().currentUser?.uid as String
saveUserID(userid)
if (user == "support@thehungryapp.com") {
admin()
} else {
action()
}
}
This is a simple prototype gate, not a full RBAC system, but it kept the two experiences separate without building a complex permissions layer for a classroom scope.
Live menu by category
Menu fragments listen to restaurant/platillos and filter dishes by category so every client sees the same catalog as soon as data changes.
kotlin
database.reference.child("restaurant").child("platillos")
.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
Food.removeAll(Food)
for (snapshot in dataSnapshot.children) {
val piece = snapshot.getValue(Classplatillo::class.java)
if (piece != null && piece.category == "entrada") {
Food.add(piece)
}
}
adapter.notifyDataSetChanged()
}
})
I used ValueEventListener so the UI stayed reactive during demos when menu entries were added or edited in Firebase.
Order assembly and billing
Each visit gets a generated order id stored in SharedPreferences. Items are written under restaurant/ordens/{ordenId}/platillos, and review screens aggregate quantity, prep time, subtotal, and tax.
kotlin
val userBD = dbReference.child(ordenr)
userBD.child("id").setValue(ordenr)
userBD.child("userID").setValue(userID)
userBD.child("table").setValue(table)
val userBDF = userBD.child("platillos")
userBDF.child(idPlatillo).child("quantity").setValue(x)
userBDF.child(idPlatillo).child("name").setValue(textView.text)
userBDF.child(idPlatillo).child("cost").setValue(costi)
The order model is flat and JSON-friendly, which matched Firebase Realtime Database strengths for a short academic timeline.
Admin workspace
Administrators land in a drawer-based activity with sections for viewing platillos, reviewing orders, and adding dishes. The inventory list is fully wired to Firebase; some admin forms are layout-first placeholders that show where CRUD would continue.
Technical approach
The client targets Android API 28 with Kotlin activities and fragments, Java POJOs for Firebase deserialization, Android Support Library components, and Picasso for menu images. All remote state flows through Firebase Authentication and Firebase Realtime Database under a restaurant root with users, platillos, and ordens children.
Session context (user id, table number, active order id, estimated wait time) lives in SharedPreferences so screens can stay loosely coupled. The customer path moves from login to SelectActivity, into a tabbed menu with ViewPager fragments, through Platillo detail and OrdenRecycler review, then postOrden wait timing and closing screens. I added a debounced click helper to reduce double-submits on fast taps during demos.
kotlin
fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
val safeClickListener = SafeClickListener { onSafeClick(it) }
setOnClickListener(safeClickListener)
}
Non-functional goals from the design phase included fast registration, near-real-time data refresh, and a small install footprint on mid-range Android devices. The prototype includes default Espresso and JUnit scaffolding but does not implement a meaningful automated test suite. Backend deployment was limited to configuring Firebase for the app; there is no separate custom server.
Design decisions
I prioritized clarity for two distinct personas instead of one dense interface. Customers see table context at the top of the menu and a floating action button to jump to their order. Administrators get a navigation drawer that mirrors operational tasks: see the menu, inspect orders, add platillos.
Split customer and admin flows at login rather than mixing controls in one home screen.
Organize the menu into four tabs that match how diners think about a meal progression.
Show prep time on dish detail and derive a simple wait bar from the longest item in the cart.
Apply 16% IVA on the review screens so totals match common Mexican restaurant billing expectations.
Use RecyclerView lists with image loading through Picasso for readable menu scanning.
Challenges and tradeoffs
I was learning Kotlin for Android while building the app; there was little structured guidance in our context, so I relied on experimentation and piecing together patterns screen by screen.
Firebase was equally new to me. Auth, Realtime Database structure, and listener-based UI updates had few approachable tutorials at the time, which slowed integration but forced me to understand the data model directly.
Table availability is tracked locally in the selection screen, not coordinated across devices, so real multi-table occupancy would need server-side locking or status nodes.
Admin add and order management fragments are partially implemented, which was an honest scope cut for a semester prototype.
Role separation relies on a fixed admin email rather than Firebase custom claims or a roles collection.
Realtime listeners are straightforward but can become chatty at scale; production would need pagination, caching, and security rules hardening.
The stack (Support Library 28, older Firebase SDKs) reflects 2019 course constraints and would need a full modernization pass today.
What I learned
Building The Hungry App taught me how product requirements translate into concrete mobile flows when the backend is a managed service instead of a custom API. I learned to keep session state explicit, to model restaurant data as a small set of Firebase trees, and to accept where prototypes should stop short of production payment and permissions.
Working without a playbook pushed me to read Firebase behavior closely and design a simple restaurant/users/platillos/ordens tree that I could reason about during demos.
Designing for two roles early prevents UI clutter later, even with a simple routing rule.
Firebase Realtime Database is excellent for classroom demos, but schema and security rules deserve first-class design time.
Order totals and tax logic belong in one well-tested path; I duplicated aggregation between review screens and would consolidate that today.
Small UX guards (debounced clicks, empty-order toasts) matter as much as backend wiring in perceived quality.
Current status
This project is no longer maintained and should be understood as an academic prototype from 2019. I keep it in my portfolio because it shows how I approached a full mobile service design: from problem justification and use cases to a working Android client with live data. It was not released to app stores and was not validated with real restaurant operations.
If I revisited this today
Migrate to AndroidX, Material 3, and current Firebase SDKs with strict Realtime Database security rules.
Replace the admin email check with role claims and server-enforced permissions.
Sync table occupancy through Firebase so multiple diners cannot select the same table.
Finish admin CRUD for platillos and wire order reports with search and date filters.
Extract pricing, tax, and totals into a shared domain module covered by unit tests.
Integrate a real payment provider only after the ordering and kitchen workflow are validated with users.