A fully-featured Android notes application built with Jetpack Compose, Room Database, WorkManager, and Material3. Users can create, view, edit, and delete notes, with support for scheduling reminder notifications at a chosen date and time.
- Create notes with a title, content body, and an optional reminder time
- View all notes on the Home screen with a title preview, content snippet, and scheduled reminder time
- Edit existing notes from the detail screen
- Delete notes with a confirmation dialog to prevent accidental deletion
- Immediate notifications when a note is saved, navigating back to the Home screen
- Scheduled reminder notifications using WorkManager, navigating directly to the Note Detail screen when tapped
- Full navigation between Home, Add/Edit, and Detail screens using Jetpack Compose Navigation
com.example.notesapp/
├── data/
│ ├── NoteEntity.kt # Room entity (id, title, content, notificationTimeMillis)
│ ├── NoteDao.kt # CRUD operations via Room DAO
│ ├── NoteDatabase.kt # Room database singleton
│ └── NoteRepository.kt # Abstracts database and notification scheduling
├── navigation/
│ ├── NavGraph.kt # Navigation routes and NavHost setup
│ └── HomeScreen.kt # Home screen and NoteCard composables
├── notifications/
│ ├── NotificationHelper.kt # Notification channel setup and display logic
│ └── ReminderScheduler.kt # WorkManager scheduling and cancellation
│ └── ReminderWorker.kt # CoroutineWorker that fires the reminder notification
├── ui/
│ ├── NoteViewModel.kt # ViewModel with StateFlow for notes and selected note
│ ├── AddEditScreen.kt # Add and edit note screen with date/time picker
│ └── DetailScreen.kt # Note detail screen with edit and delete options
└── MainActivity.kt # Entry point; handles deep-link intents from notifications
| Component | Library |
|---|---|
| UI | Jetpack Compose + Material3 |
| Navigation | Jetpack Compose Navigation |
| Database | Room (with KSP annotation processing) |
| Async | Kotlin Coroutines + Flow |
| Background work | WorkManager |
| ViewModel | Lifecycle ViewModel Compose |
| Notifications | NotificationCompat + NotificationManagerCompat |
- Android Studio Hedgehog (2023.1.1) or later
- Android SDK API 26 or higher (minSdk 26)
- JDK 11
-
Clone the repository:
git clone https://github.com/jennabeachcodes/NotesApp.git
-
Open the project in Android Studio via File → Open.
-
Let Gradle sync complete.
-
Run on an emulator or physical device running Android 8.0 (API 26) or higher.
Note: On Android 13+ (API 33), the app will request the
POST_NOTIFICATIONSpermission on first launch. Notifications will not appear if this permission is denied.
- Tap the + floating action button on the Home screen.
- Enter a title and content.
- Optionally tap Set Reminder to choose a date and time for a scheduled notification.
- Tap Save Note. An immediate notification will appear confirming the note was saved.
- Tap any note card on the Home screen to open the Note Detail screen.
- The full note content is displayed, along with the scheduled reminder time if one was set.
- From the Note Detail screen, tap the edit icon in the top bar.
- Make changes and tap Save Note.
- From the Note Detail screen, tap the delete icon in the top bar.
- Confirm deletion in the dialog. The note and any scheduled reminder are permanently removed.
- Immediate notification: fires when any note is saved. Tapping it opens the Home screen.
- Scheduled notification: fires at the chosen reminder time. Tapping it opens the specific Note Detail screen directly.
Notes are stored locally using Room Database. The NoteEntity contains the following fields:
| Field | Type | Description |
|---|---|---|
id |
Int |
Auto-generated primary key |
title |
String |
Note title |
content |
String |
Full note body |
notificationTimeMillis |
Long? |
Scheduled reminder time in epoch milliseconds (nullable) |
All CRUD operations are performed via NoteDao using Kotlin coroutines and Flow for reactive updates. The NoteRepository coordinates between the DAO and ReminderScheduler, ensuring reminders are always in sync with the database state.
Two types of notifications are implemented:
Immediate notification — triggered every time a note is saved. Shows a "New note added!" message and navigates to the Home screen when tapped.
Scheduled notification — triggered by a WorkManager OneTimeWorkRequest with an initial delay calculated from the chosen reminder time. Shows the note title and navigates directly to the Note Detail screen when tapped. WorkManager ensures the notification fires reliably even if the app is killed or the device restarts.
Reminders are automatically cancelled when a note is deleted or when the reminder time is removed during editing.
This app is designed to be usable by everyone, including users who rely on assistive technologies.
TalkBack Compatibility: All interactive elements include contentDescription values via Jetpack Compose's Modifier.semantics block. Buttons, icons, cards, and form fields are all announced correctly by TalkBack, including contextual descriptions such as the scheduled reminder time on each note card. Icon buttons in the top bar (edit, delete, back) carry descriptive labels so TalkBack users always know what action will be performed.
Text Scaling: All text uses Material3 typography styles (titleMedium, bodyLarge, labelSmall, etc.), which are defined in sp units internally. This means the app fully respects the user's system font size preference, allowing text to scale up or down without breaking layouts.
Color Contrast: The app uses Material3's built-in dynamic color scheme (MaterialTheme.colorScheme), which is designed to meet WCAG AA contrast requirements. Surface, on-surface, primary, and on-primary pairings are used consistently throughout all screens, ensuring readability in both light and dark modes.
Interactive Element Labeling: Form inputs use the label parameter on OutlinedTextField, which is automatically exposed to accessibility services. Destructive actions such as note deletion require confirmation via a dialog, giving users a chance to recover from accidental taps.
Home Screen
├── Tap note card → Note Detail Screen
│ ├── Tap edit icon → Add/Edit Screen → Home Screen (on save)
│ └── Tap delete icon → Confirmation dialog → Home Screen (on confirm)
└── Tap FAB (+) → Add/Edit Screen → Home Screen (on save)
Notifications
├── Immediate notification → Home Screen
└── Scheduled notification → Note Detail Screen (deep-linked by noteId)
| Permission | Purpose |
|---|---|
POST_NOTIFICATIONS |
Display reminder and save-confirmation notifications (Android 13+) |
SCHEDULE_EXACT_ALARM |
Allow WorkManager to fire reminders at precise times |
- Notes are stored locally only; there is no cloud sync or backup.
- If the
POST_NOTIFICATIONSpermission is denied on Android 13+, no notifications will appear. The app remains fully functional for note creation and management. - Scheduled notifications depend on WorkManager's scheduling window and may fire slightly late on devices with aggressive battery optimisation enabled.
This project is provided for educational purposes only as part of the course 26W-CST8410 - Advanced Mobile Applications at Algonquin College, Ottawa, ON, Canada.