Skip to content

A geofence-based reminder app built with Kotlin features clean architecture, robust testing, offline support, Firebase integration, best practices for permissions, reactive UI, and background updates using WorkManager.

License

Notifications You must be signed in to change notification settings

AliElDerawi/GeoAssistant

Repository files navigation

GeoAssistant

"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.

Summary

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.

Main Features of the Project

  • 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.

Project Resources

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.

Snapshots from the App

Phone Screens (Portrait)

Firebase Auth UI Login Screen

Firebase Auth UI Login Screen
Demonstrates integration with Firebase Auth for a seamless login experience.

Firebase UI Login Option Screen

Firebase UI Login Option Screen
Enables login or account creation via Google accounts or email, demonstrating user-friendly authentication.

Add Location Reminder Screen

Add Location Reminder Screen
Adds reminders with a detailed, user-friendly interface.

Dynamic Flow Workflow Screen

Dynamic Flow Workflow Screen
Uses Kotlin Flow for real-time validation of input fields.

Google Map With Custom Style and Types Screen

Google Map With Custom Style and Types Screen
Implements map customization, user location display, and geolocation selection.

Dynamic Location Address Geocoding Screen

Dynamic Location Address Geocoding Screen
Geocodes locations in the background using WorkManager and Google Geocoder.

Create Geofence Workflow Screen

Create Geofence Workflow Screen
Shows geofence creation and notification handling following MVVM and clean architecture principles.

Phone Screens (Landscape)

Map With Location Marker Screen in Landscape Mode

Map With Location Marker Screen in Landscape Mode
Ensures seamless data saving and retrieval across orientation changes, maintaining a smooth experience.

Locations Reminder List Screen in Landscape Mode

Locations Reminder List Screen in Landscape Mode
Optimized for seamless landscape viewing, maintaining consistent UI/UX quality.

Installation Guide

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:

  1. Clone the Repository: Clone the project repository using Git.
  2. Open in Android Studio: Open the project in Android Studio Ladybug (2024.2.1 Patch 2) or later.
  3. Set up Firebase Account: Connect the project to your Firebase console and add google-services.json to the app.
  4. 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.
  5. Add Map API Key: Add the Map API key to the local.properties file or follow the Secrets Gradle Plugin guide.
  6. 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.

Main Included External Libraries

  • 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.

Contributing

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.

How to Contribute

  • 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.

Contact

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.

License

This project is open-source and licensed under the Apache 2.0 License. The LICENSE file in this repository provides more details

About

A geofence-based reminder app built with Kotlin features clean architecture, robust testing, offline support, Firebase integration, best practices for permissions, reactive UI, and background updates using WorkManager.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages