The "4Health" application for Android systems (in the mobile version and for tablets) has been implemented fully using the Kotlin language, it is designed to support the physical activity of people practicing jogging, hiking, Nordic walking, cycling... The tasks carried out by the application include, m.in:
- Create route runs
- Storing created routes
- Controlling user activity
- Visualization of The User's Weekly Activity
- Create activity time measurements
- Visualize your route with Google Maps
- Connect to an external user authentication database (Firebase)
- Data cache
- Registration/ User Login
- Keeping individual user statistics
The application uses a number of libraries to improve performance, visually improve the UI and provide data using external APIs, which include:
• Android Jetpack View Binding
• Kotlin coroutines
• SQLite Database
• MPAndroidChart
– data visualization
• Maps SDK for Android
- Access to Google Maps.
• Directions API
– Google API, request in the form of JSON provides component points between the beginning and end of the route, estimates the time of the route, determines the distance and returns postal addresses of specific points.
• Street View Static API
- Google API, request with an argument containing a specific location on the map returns its static view from Google Street View in the form of an image.
• Glide
– a library that loads images from a link in imageView, additionally creates an image token for a given url, thus it does not require the Internet to reload / repeatedly the image.
• Volley
– Making requests/ queries to external APIs / https pages
• Google Firebase Firestorm
- External database for user authentication
• GSON
– parsing JSON objects
The improvement includes features such as:
• Creating profiles
- Creating online users kept in a remote database
• Google Firebase Firestorm
- External database for user authentication
• Chart Page
- Page dedicated to logged in users, keeping them weekly total activity, and a daily training challenge
• UI Improvements
- new animations for a more natural user experience (custom transition animations using viewpager2), improved bottom menu and home page style
1-2: Route detail card, presents the title of the route, its length, estimated travel time, postal addresses of the beginning and end of the route, also contains a fragment of the map with the route and a fragment of the timer 3: A fragment of the user's activity history on a given route, time of overcoming, date of setting the record and day of the week
1-2: The route detail card, presents the title of the route, its length, estimated travel time, postal addresses of the beginning and end of the route, also contains a fragment of the map with the route and a fragment of the timer 3: A fragment of the user's activity history on a given route, the time of overcoming, the date of setting the record and the day of the week.
The application implements a full range of animations using ObjectAnimator in SplashActivity, the possibilities of animation components of the application with animations written in xml files and using MotionLayout on the main page or ...
Start Screen + Splash Screen |
Track Details + Track History |
additionally animations reacting to the change in values returned from the accelerometer sensor.
Presented fragment of the stopwatch implemented inside the fragment of details. In order to ensure the correct operation of the application when changing the orientation of the position, the ViewModel class was used, which is part of the Android Jetpack. Due to the longer lifecycle behavior, the class does not reconstruct itself when changing the orientation of the device.
The application does not require an Internet connection in order to use previously created routes. The returned request results have been thoughtfully saved in the internal database to ensure offline use (waypoints returned from the directions API and site views from the Static Street View API).
For privacy and security reasons, the API key for Google's interfaces is stored in the local.properties file (excluded in the .gitignore file) and returns by reference via BuildConfig.<name>