"A Geofence (Locations) Reminder app that helps users select a location on the map and get a reminder notification when they enter that location using Android Geofence."
GeoAssistant is a geofence-based reminder app that lets users select locations on the map and receive notifications when they enter them, utilizing Android Geofence technology. It follows best practices for Android development with Kotlin. This project is part of the Udacity Android Kotlin Developer Nanodegree Program.
This project demonstrates:
- Clean architecture with MVVM and Repository pattern.
- Offline support with Room database.
- Robust Unit and Automated Testing.
- Best practices for managing permissions, including seamless user experience.
- Integration with Firebase Auth UI for easy login.
- Google Maps integration and notification handling following best practices.
- Background data updates using WorkManager.
- MVVM and Repository Architecture: Implements an MVVM and Repository pattern for scalable and maintainable architecture.
- Offline Mode: Supports offline data access using Room for local storage.
- Testing: Implements Unit and Automated Testing for all project features (Logic, Room, Repository, ViewModel, Navigation, Scenario).
- Permission Handling: Manages user permissions with best practices to enhance the user experience.
- Maps Integration: Implements Google Maps with optimized map interactions and efficient location handling.
- Orientation Support: Adapts to portrait and landscape orientations without losing data.
- Geofence Functionality: Allows users to create geofences and receive reminders, ensuring clean implementation with MVVM.
- Background Data Updates: Uses WorkManager for one-time data updates.
- Accessible UI: Dynamically generated ContentDescriptions for accessibility.
- Modern UI Design: Utilizes single-activity architecture with multiple fragments.
- Reactive UI: Uses DataBindingAdapter and Kotlin Flow for a reactive user experience.
- Firebase Authentication: Incorporates Firebase Auth UI for a seamless login experience.
- Dependency Injection: Koin (v4) used for improved modularity and testability.
- Starter Project Code: Get the starter code for the project.
- Project Rubric: View the project rubric.
- Android Kotlin Developer Nanodegree Program: Learn more about the full program and its related projects.
Note: Many improvements and features in this project are not included in the Project Rubric as it was initially a project for the Udacity Nanodegree Program.
This project requires creating an account on Firebase to enable Firebase Auth UI and Google Maps API Key. Follow these steps to run the app:
- Clone the Repository: Clone the project repository using Git.
- Open in Android Studio: Open the project in Android Studio Ladybug (2024.2.1 Patch 2) or later.
- Set up Firebase Account: Connect the project to your Firebase console and add
google-services.json
to the app. - Set up Google Maps API Key: Connect the project to your Google Cloud Console, enable the Google Maps API key, and add it using the Secret Gradle Plugin.
- Add Map API Key: Add the Map API key to the
local.properties
file or follow the Secrets Gradle Plugin guide. - Build the Project: Use Gradle Plugin v8.7.2 to build the project.
Note: Ensure you have the latest version of Android Studio and the Gradle build tool installed. Please look at the official guide if needed.
- Koin (v4): Dependency injection framework, allowing modularity and making the project easier to test.
- Timber: Logging utility for easier debugging.
- FusedLocationProvider: Fetches user's last known location.
- MapsSdk: Integrates Google Maps functionality.
- FirebaseUI: Manages login and account creation via Firebase.
- Glide: Efficient image loading and caching.
- Retrofit: REST API management.
- Moshi: JSON parsing.
- JUnit (v4): Unit testing.
- Robolectric: Unit test environment.
- Mockito (v5): Mocking framework for testing.
- Security Crypto: Encrypts user-sensitive data to ensure security.
- Secrets Gradle Plugin: Secure management of sensitive data.
- KSP: Annotation processing plugin for for improved build performance.
Contributions are welcome! Please open an issue or submit a pull request for improvements or bug fixes. Please feel free to reach out if you'd like to add new features or expand on existing ones.
- Fork the Repository: Click the "Fork" button at the top.
- Create a Feature Branch: Branch off from
main
for any features (git checkout -b feature/your-feature
). - Submit a Pull Request: Submit a PR describing your changes.
Feel free to reach out for any collaboration opportunities or if you have any questions. I'd love to hear your thoughts and contributions! Check my GitHub profile.
This project is open-source and licensed under the Apache 2.0 License. The LICENSE file in this repository provides more details