{"id":22411014,"url":"https://github.com/alielderawi/geoassistant","last_synced_at":"2026-01-04T21:48:41.607Z","repository":{"id":264464681,"uuid":"881986215","full_name":"AliElDerawi/GeoAssistant","owner":"AliElDerawi","description":"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.","archived":false,"fork":false,"pushed_at":"2025-01-31T17:20:12.000Z","size":6075,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-31T18:26:22.123Z","etag":null,"topics":["accessibility","android","bindingadapter","clean-architecture","design-patterns","firebaseui","flow","geofencing","kotlin-android","kotlin-coroutines","map","mvvm-architecture","notifications","reactive-programming","reactive-ui","reactiveui","room","test-automation","testing","unit-testing"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AliElDerawi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-01T16:29:19.000Z","updated_at":"2025-01-31T17:20:15.000Z","dependencies_parsed_at":"2025-01-13T19:29:48.032Z","dependency_job_id":"5333e20c-6ada-4b9a-8c3e-f7e86aaebb39","html_url":"https://github.com/AliElDerawi/GeoAssistant","commit_stats":null,"previous_names":["alielderawi/locationreminders","alielderawi/locationsreminder","alielderawi/geoassistant"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FGeoAssistant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FGeoAssistant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FGeoAssistant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FGeoAssistant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AliElDerawi","download_url":"https://codeload.github.com/AliElDerawi/GeoAssistant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236636256,"owners_count":19181029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","android","bindingadapter","clean-architecture","design-patterns","firebaseui","flow","geofencing","kotlin-android","kotlin-coroutines","map","mvvm-architecture","notifications","reactive-programming","reactive-ui","reactiveui","room","test-automation","testing","unit-testing"],"created_at":"2024-12-05T13:12:45.713Z","updated_at":"2025-10-15T19:32:41.860Z","avatar_url":"https://github.com/AliElDerawi.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GeoAssistant [![Build Status][ci-image]][ci]\n\n**\"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.\"**\n\nGeoAssistant 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**.\n\n## Summary\n\nThis project demonstrates:\n\n- Clean architecture with MVVM and Repository pattern.\n- Offline support with Room database.\n- Robust Unit and Automated Testing.\n- Best practices for managing permissions, including seamless user experience.\n- Integration with Firebase Auth UI for easy login.\n- Google Maps integration and notification handling following best practices.\n- Background data updates using WorkManager.\n\n## Main Features of the Project\n\n- **MVVM and Repository Architecture**: Implements an MVVM and Repository pattern for scalable and maintainable architecture.\n- **Offline Mode**: Supports offline data access using Room for local storage.\n- **Testing**: Implements Unit and Automated Testing for all project features (Logic, Room, Repository, ViewModel, Navigation, Scenario).\n- **Permission Handling**: Manages user permissions with best practices to enhance the user experience.\n- **Maps Integration**: Implements Google Maps with optimized map interactions and efficient location handling.\n- **Orientation Support**: Adapts to portrait and landscape orientations without losing data.\n- **Geofence Functionality**: Allows users to create geofences and receive reminders, ensuring clean implementation with MVVM.\n- **Background Data Updates**: Uses WorkManager for one-time data updates.\n- **Accessible UI**: Dynamically generated ContentDescriptions for accessibility.\n- **Modern UI Design**: Utilizes single-activity architecture with multiple fragments.\n- **Reactive UI**: Uses DataBindingAdapter and Kotlin Flow for a reactive user experience.\n- **Firebase Authentication**: Incorporates Firebase Auth UI for a seamless login experience.\n- **Dependency Injection**: Koin (v4) used for improved modularity and testability.\n\n## Project Resources\n\n- [Starter Project Code](https://github.com/udacity/nd940-android-kotlin-c4-starter/tree/master): Get the starter code for the project.\n- [Project Rubric](https://docs.google.com/document/d/1w2jWUxAgwJBtsJmOk0h8rU7dr9Zq33k0HvhgQ-VZBYI/edit?usp=sharing): View the project rubric.\n- [Android Kotlin Developer Nanodegree Program](https://www.udacity.com/course/android-kotlin-developer-nanodegree--nd940): Learn more about the full program and its related projects.\n\n#### **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.\n\n## Snapshots from the App\n\n### Phone Screens (Portrait)  \n\n\u003cdiv align=\"center\"\u003e\n\u003ctable style=\"width: 100%; table-layout: fixed;\"\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/firebaseui_login_screen.jpg\" height=\"666\" alt=\"Firebase Auth UI Login Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eFirebase Auth UI Login Screen\u003c/strong\u003e\u003cbr\u003eDemonstrates integration with Firebase Auth for a seamless login experience.\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/login_option_screen.jpg\" height=\"666\" alt=\"Firebase UI Login Option Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eFirebase UI Login Option Screen\u003c/strong\u003e\u003cbr\u003eEnables login or account creation via Google accounts or email, demonstrating user-friendly authentication.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/add_reminder_screen.jpg\" height=\"666\" alt=\"Add Location Reminder Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eAdd Location Reminder Screen\u003c/strong\u003e\u003cbr\u003eAdds reminders with a detailed, user-friendly interface.\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/dynamic_flow_workflow.gif\" height=\"666\" alt=\"Dynamic Flow Workflow Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eDynamic Flow Workflow Screen\u003c/strong\u003e\u003cbr\u003eUses Kotlin Flow for real-time validation of input fields.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/custom_map_style_and_type_screen.jpg\" height=\"666\" alt=\"Google Map With Custom Style and Types Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eGoogle Map With Custom Style and Types Screen\u003c/strong\u003e\u003cbr\u003eImplements map customization, user location display, and geolocation selection.\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd align=\"center\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/dynamic_address_geocoding.gif\" height=\"666\" alt=\"Dynamic Location Address Geocoding Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eDynamic Location Address Geocoding Screen\u003c/strong\u003e\u003cbr\u003eGeocodes locations in the background using WorkManager and Google Geocoder.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n \u003ctd align=\"center\" colspan=\"2\" style=\"width: 50%;\"\u003e\n   \u003cimg src=\"./images/create_geofence_workflow.gif\" height=\"666\" alt=\"Create Geofence Workflow Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eCreate Geofence Workflow Screen\u003c/strong\u003e\u003cbr\u003eShows geofence creation and notification handling following MVVM and clean architecture principles.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n### Phone Screens (Landscape)  \n\n\u003cdiv align=\"center\"\u003e\n\u003ctable style=\"width: 100%; table-layout: fixed;\"\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\" style=\"width: 100%;\"\u003e\n   \u003cimg src=\"./images/map_with_marker_landscape_screen.jpg\" height=\"300\" alt=\"Map With Location Marker Screen in Landscape Mode\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eMap With Location Marker Screen in Landscape Mode\u003c/strong\u003e\u003cbr\u003eEnsures seamless data saving and retrieval across orientation changes, maintaining a smooth experience.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\" style=\"width: 100%;\"\u003e\n   \u003cimg src=\"./images/geofence_list_landscape_screen.jpg\" height=\"300\" alt=\"Locations Reminder List Screen in Landscape Mode\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eLocations Reminder List Screen in Landscape Mode\u003c/strong\u003e\u003cbr\u003eOptimized for seamless landscape viewing, maintaining consistent UI/UX quality.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\u003c/div\u003e \n\n## Installation Guide\n\nThis project requires creating an account on Firebase to enable Firebase Auth UI and Google Maps API Key. Follow these steps to run the app:\n\n1. **Clone the Repository**: Clone the project repository using Git.\n2. **Open in Android Studio**: Open the project in **Android Studio Ladybug (2024.2.1 Patch 2)** or later.\n3. **Set up Firebase Account**: Connect the project to your Firebase console and add `google-services.json` to the app.\n4. **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.\n5. **Add Map API Key**: Add the Map API key to the `local.properties` file or follow the [Secrets Gradle Plugin guide](https://developers.google.com/maps/documentation/places/android-sdk/secrets-gradle-plugin).\n6. **Build the Project**: Use **Gradle Plugin v8.7.2** to build the project.\n\n**Note:** Ensure you have the latest version of Android Studio and the Gradle build tool installed. Please look at the [official guide](https://developer.android.com/studio/install) if needed.\n\n## Main Included External Libraries\n\n- **[Koin (v4)](https://github.com/InsertKoinIO/koin)**: Dependency injection framework, allowing modularity and making the project easier to test.\n- **[Timber](https://github.com/JakeWharton/timber)**: Logging utility for easier debugging.\n- **[FusedLocationProvider](https://developer.android.com/develop/sensors-and-location/location/retrieve-current)**: Fetches user's last known location.\n- **[MapsSdk](https://developers.google.com/maps/documentation/android-sdk/start)**: Integrates Google Maps functionality.\n- **[FirebaseUI](https://firebase.google.com/docs/auth/android/firebaseui)**: Manages login and account creation via Firebase.\n- **[Glide](https://github.com/bumptech/glide)**: Efficient image loading and caching.\n- **[Retrofit](https://github.com/square/retrofit)**: REST API management.\n- **[Moshi](https://github.com/square/moshi)**: JSON parsing.\n- **[JUnit (v4)](https://github.com/junit-team/junit4)**: Unit testing.\n- **[Robolectric](https://github.com/robolectric/robolectric)**: Unit test environment.\n- **[Mockito (v5)](https://github.com/mockito/mockito)**: Mocking framework for testing.\n- **[Security Crypto](https://developer.android.com/jetpack/androidx/releases/security)**: Encrypts user-sensitive data to ensure security.\n- **[Secrets Gradle Plugin](https://developers.google.com/maps/documentation/places/android-sdk/secrets-gradle-plugin)**: Secure management of sensitive data.\n- **[KSP](https://developer.android.com/build/migrate-to-ksp)**: Annotation processing plugin for for improved build performance.\n\n## Contributing\n\nContributions 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.\n\n### How to Contribute\n\n- **Fork the Repository**: Click the \"Fork\" button at the top.\n- **Create a Feature Branch**: Branch off from `main` for any features (`git checkout -b feature/your-feature`).\n- **Submit a Pull Request**: Submit a PR describing your changes.\n\n## Contact\n\nFeel free to reach out for any collaboration opportunities or if you have any questions. I'd love to hear your thoughts and contributions!\nCheck my **[GitHub profile](https://github.com/AliElDerawi)**.\n\n## License\n\nThis project is open-source and licensed under the Apache 2.0 License. The LICENSE file in this repository provides more details\n\n[ci-image]: https://img.shields.io/github/actions/workflow/status/AliElDerawi/GeoAssistant/android-kotlin-ci.yml?label=Build%20Status\u0026logo=github\n[ci]: https://github.com/AliElDerawi/GeoAssistant/actions?query=workflow%3ABuild\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falielderawi%2Fgeoassistant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falielderawi%2Fgeoassistant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falielderawi%2Fgeoassistant/lists"}