This is a TODO list app with location reminders that remind the user to do something when the user is at a specific location. The app will require the user to create an account and log in to set and access reminders (for more details, see the description section below).
- This project was created based on educational purposes according to Advanced Android Kotlin Development Nanodegree.
- In order not to break the terms of service, the API key is not provided in this repo. You can put your API key in the (google_maps_api.xml) file from this path ("app/src/debug/res/values/google_maps_api.xml") or directly press this link.
- User Authentication: Signup, Login & Logout
- Firebase Authentication
- Map View & Styling
- Geofencing
- MVVM
- Testing
- Compatibility
- Login: There is a Login screen to ask users to log in using an email address or a Google account. Upon successful login, navigate the user to the Reminders screen. If there is no account, the app should navigate to a Registration (Signup) screen.
- Signup: There is a Registration screen to allow a user to register using an email address or a Google account.
- Logout: The users can log out of the app and when the app starts again they are required to log in first.
-
Map view: There is a Map view that shows the user's current location.
- It first asks the user's location access permission to show his/her current location on the map.
- The location access is handled in cases of user denial that the user is shown the right error messages.
-
POI: The app asks the user to select a point of interest (POI) on the map to create a reminder.
- The app asks the user to select a location or POI on the map and add a new marker at that location.
- The selected POI can be just a simple POI or an area or specific latitude and longitude. The POI has a location name.
- Upon saving, the selected location is returned to the Save Reminder page and the user is asked to input the title and description for the reminder.
- When the reminder is saved, a geofencing request is created. Allowing the user to take Circular Radius for the geofence is a bonus.
- Compatibility: The app works on all the different Android versions including Android Q.
- Map Styling: The Map Styling is done using the map styling wizard to have a nice-looking map. Users have the option to change the map type from the toolbar items.
- Geofencing: When the user enters a geofence, a reminder is retrieved from the local storage and a notification showing the reminder title will appear, even if the app is not open.
Reminders: There is a screen to add a new reminder when a user reaches the selected location. Each new reminder includes:
- title
- description
- selected location Note:
- The user-entered data is captured using live data and data binding.
- (RemindersLocalRepository) is used to save the reminder to the local DB, and the geofencing request is created after confirmation.
There is a screen that displays the reminders retrieved from local storage.
- If there are no reminders, it displays a "No Data" indicator. If there are any errors, it displays an error message.
- The user can navigate from the Reminders list view screen to another screen to create a new reminder.
For each reminder, a geofencing request, in the background that fires up a notification when the user enters the geofencing area, is created.
- Details are displayed about a reminder when a selected POI is reached and the user clicked on the notification.
- When the user clicks a notification, a new screen appears to display the reminder details.
- The app follows the MVVM design pattern and uses ViewModels to hold the live data objects, do the validation, and interact with the data sources.
- Automation Testing using ViewMatchers and ViewInteractions to simulate user interactions with the app.
- Testing for Snackbar and Toast messages. Testing the fragments’ navigation.
- Inserting and retrieving data using DAO.
- Predictable errors like data not found.