A digital pillbox Android app designed to help people manage medications with scheduled reminders, inventory tracking, and optional SMS updates for a designated family contact.
Snapshot
Field
Details
Type
Android mobile app prototype
Context
University project (second iteration on the same problem space)
Role
Solo developer
Year
2020
Status
Academic prototype
Main focus
Medication inventory, recurring reminders, local alarms, Firebase-backed sync, and family SMS notifications
Overview
iMedibox is a medication reminder app I built in 2020 as a fuller Android implementation of the digital pillbox idea I had already explored in an earlier university project. Where the first pass stayed closer to documentation and modeling, this version focused on a working mobile experience: sign-in, cloud-backed data, structured modules, and end-to-end reminder flows on a real device.
The app was never intended as a production health product. It is an academic prototype that shows how I approached a familiar problem a second time with clearer architecture, Firebase integration, and more complete user flows. I keep it in my portfolio because it marks a step from concept write-ups toward implementable mobile software.
The problem
Many people struggle to take medications on time, especially when treatments involve multiple drugs, changing quantities, or schedules that are easy to forget. For older adults or anyone relying on a caregiver, missed doses are not only inconvenient; they can affect treatment adherence and peace of mind for family members who want simple confirmation that a dose was taken.
Remembering when and how much of each medication to take
Tracking remaining supply before a prescription runs out
Giving a trusted contact visibility without building a full care platform
Replacing informal notes or physical pillboxes with something always on the phone
Who it was for
People managing daily or recurring medication routines
Users who want reminders tied to specific medicines and doses
Family members or caregivers who benefit from a lightweight confirmation message
Students and reviewers evaluating a mobile health-adjacent prototype, not a regulated medical device
My role
I owned the project end to end: Android UI, MVP module structure, Firebase authentication and Realtime Database integration, local alarm scheduling, SMS notification flow, and profile or settings screens. I organized the codebase by feature modules (login, medicines, reminders, profile, familiar, alarm) and wired each screen through presenter and interactor layers with EventBus for async feedback.
What the project does
iMedibox acts as a personal digital pillbox. After signing in with Google through Firebase, users register medicines with type and quantity, create reminders with custom intervals, and receive full-screen alarms when it is time to take a dose. Completing an alarm can trigger an SMS to a stored family contact. Medicines and reminders stay synced per user in Firebase Realtime Database under a predictable path structure.
Google sign-in and per-user records in Firebase
Medicine list with types (capsule, pill, syrup, injection, drops) and quantity tracking
Recurring reminders with hour and minute frequency pickers
Local AlarmManager alerts that open a dedicated alarm screen
Optional family contact stored in Firebase and notified by SMS on completion
Profile area with personal data, familiar management, feedback, and app sharing
Key features
Medication inventory
Users add medicines with name, type, and starting quantity. The medicines screen listens to Firebase child events so lists update when data changes, and the UI warns when supply is running low.
Recurring reminders
Reminders link to an existing medicine and define how often to administer a dose. Creating a reminder both writes to Firebase and registers a repeating local alarm so notifications still fire on the device.
I paired cloud persistence with on-device scheduling so reminders stayed actionable even when the UI was closed, accepting that alarm IDs and Firebase records had to be kept in sync manually in this prototype.
Full-screen dose alarms
A broadcast receiver launches AlarmActivity with the medicine context, plays the default ringtone, and prompts the user to confirm the dose.
I used an explicit activity launch from the receiver so the alarm UI could stay focused and readable at dose time, separate from the bottom-navigation shell.
Family SMS notifications
Users can register one familiar with name and phone number. When they mark a dose as completed, the app sends a short SMS if permissions allow and a familiar exists.
chose direct SMS because it matched the caregiver use case without building a backend notification service, knowing it depended on device permissions and carrier behavior.
Profile and feedback
The profile section supports updating display data, managing the familiar contact, viewing about information, submitting an in-app rating with comments stored under Firebase comments, and sharing the app via a standard share intent.
Technical approach
The app targets API 29 with Java 8 and Material components. Authentication uses Firebase UI Auth with Google as the primary provider. After sign-in, the login flow checks whether the user node exists in Realtime Database and registers a profile when needed.
Data is scoped per authenticated user:
java
public DatabaseReference getMedsReference(String uid) {
return getUserReferenceByUid(uid).child(PATH_MEDS);
}
public DatabaseReference getRemindersReference(String uid) {
return getUserReferenceByUid(uid).child(PATH_REMINDERS);
}
public DatabaseReference getFamiliarReference(String uid) {
return getUserReferenceByUid(uid).child(PATH_FAMILIARS);
}
I centralized Firebase paths in a singleton API class so each module’s data-access layer stayed thin and consistent.
Presentation follows MVP across modules. Views implement narrow interfaces; presenters subscribe to EventBus events from interactors; interactors call Firebase or system services. For example, the reminders home presenter registers for events on create, subscribes to reminder child listeners on resume, and unsubscribes on pause to avoid leaks.
java
@Override
public void onResume(User user) {
mInteractor.subscribeToReminders(user);
}
@Subscribe
public void onEventListener(ReminderEvent event) {
switch (event.getType()) {
case ReminderEvent.ON_CHILD_ADDED:
mView.add(event.getReminder());
break;
// ...
}
}
This pattern repeated across login, medicines, profile, familiar, and add flows, which made the academic codebase easier to navigate at the cost of some boilerplate.
The main shell uses bottom navigation across reminders, medicines, and profile fragments. ButterKnife handles view binding, Glide loads profile images, and release builds enable ProGuard shrinking. Automated tests are limited to default template unit and instrumented stubs; most validation was manual on devices.
Design decisions
The interface is Spanish-first and organized around three daily tasks: see upcoming reminders, manage medicines, and adjust account settings. Visual cues differentiate medicine types with dedicated icons, and the alarm screen uses large type and a single completion action to reduce friction during interruptions.
Bottom navigation to mirror how users switch between schedule, inventory, and account
Dialog-based add flows for medicines and reminders to keep context on the current tab
Full-screen alarm activity instead of a small notification-only pattern for visibility
One familiar contact rather than a full caregiver network to stay within prototype scope
In-app feedback collection to practice linking UX opinions to backend storage
Challenges and tradeoffs
Local AlarmManager schedules and Firebase reminder records could drift if reminders were edited or removed without canceling pending intents
SMS delivery depends on runtime permissions and device telephony support, which is brittle compared to push or email
MVP plus EventBus added structure for learning but increased ceremony versus a single ViewModel layer
Low-stock warnings are UI-driven rather than proactive background checks
Health-adjacent features were modeled responsibly as a student prototype, not a clinically validated product
What I learned
Building iMedibox as a second pass taught me that repeating a project idea can be more valuable than starting from zero, as long as the scope shifts toward implementation quality. I learned to separate Firebase access, presenters, and Android system APIs, and I saw firsthand how reminder apps need clear ownership of both cloud state and on-device scheduling.
How to structure a multi-module Android app around MVP and feature folders
Why medication apps need explicit alarm and dose-confirmation flows, not only list views
That caregiver features introduce permission and privacy questions early, even in prototypes
Current status
This project is no longer maintained and should be understood as an academic prototype from 2020. Firebase projects, signing keys, and Play Store distribution were out of scope for this version. I keep it in my portfolio because it shows a deliberate second iteration on medication management: from an earlier university concept to a working Android build with sync, alarms, and family notifications.
If I revisited this today
Unify reminder state with WorkManager or alarm cancellation APIs so database edits always match scheduled alarms
Replace direct SMS with a consent-based push or messaging channel and clearer privacy copy
Migrate from MVP + EventBus to Jetpack Compose, ViewModel, and Kotlin coroutines with a single navigation graph
Add proper low-stock and adherence history instead of one-off snackbar warnings
Treat health data with stricter security rules, audit logging, and explicit non-medical-device disclaimers
Extract shared domain models into a module if I ever built another iteration, without duplicating portfolio narratives across projects