/PerfectGymCoach

A gym workout app born from the frustration of using badly designed apps with terrible UX and infinite number of paywalls

Primary LanguageKotlin

ElevateFitness (previously PerfectGymCoach)

A gym workout app born from the frustration of using badly designed apps with terrible UX and infinite number of paywalls.

Smart workouts and statistics

Intuitive program creation

Dynamic theming

Planned features

  1. Improvements to plan generation
  2. Integration of Gemini Nano (on-device) into plan generation (this is as soon as Google makes the sdk available)
  3. Persistent notification during workout
  4. Watch OS support

Known issues

  1. Plan generation is very bad
  2. There is a bug where system bar icon colours are sometimes not correct (also the API I use is deprecated)
  3. The dialog with the description of exercises in the workout is not the prettiest, it would be nice to have a different one with more info and e.g. stats
  4. Missing stats tab (I don't know what to put there)
  5. History scroll-down to week has wrong offset

"Useful" elements and patterns

Despite my disclaimer below, this repo has seen some interest from the open source community so following are some elements that might be of interest to a developer looking at this app:

  1. Dependency injection with Hilt
    • Application definition here
    • ViewModels (learn more)
    • Repository pattern (Note: I use one repository for the whole app, it would probably be more appropriate -also depending on the size of the app- to have multiple ones -with a common interface- depending on the data source it needs to interface with)
  2. Jetpack compose: the whole application is built using compose, where the ui is defined directly in kotlin. See ui/screens or ui/components
  3. This application relies on Compose Destinations, an easy way to navigate between screens and forward useful objects.
    • See graphs definition here
    • See RootGraph.kt where I define the navigation for the bottom bar.
  4. Material 3 components
    • Just look around, most (all?) components should be material 3. Note: since this app was built during the very initial stages of material 3 release some components may be outdated or the might be a better way of implementing them.
    • Dynamic theming
    • FullScreenImageCard should be the implementation of a Card with image when it goes full screen (see the result of this animation). At the time there was nothing similar in compose, now I don't know :)
    • Search Bar: this was actually implemented before material 3 search bar became available in compose and does not fully respect the guidelines because I think it's prettier this way :)
  5. Control media playing on device

Disclaimer

This app is pretty much a mess, it is open source as I've had this habit for quite some time now but it probably shouldn't /(ㄒoㄒ)/~~

Feel free to contribute/make any suggestion for this project :)

Acknowledgments

I do not own any of the images used in this app. They are copyright free and were collected mostly through pexels and unsplash. Many thanks to all the artist that made their images freely available: Lukas, Alesia Kozik, Tima Miroshnichenko, Bruno Bueno, Cottonbro Studio, Andrea Piacquadio, Li Sun, Gustavo Fring, Ketut Subiyanto, Ivan Samkov, Mart Production, Jonathan Borba, Max Vakhtbovych, Anete Lusina, Monstera, Andres Ayrton, Pixabay, Daniel Apodaca, Sinitta Leunen, Leon Ardho, Anastasia Shuraeva, Ruslan Khmelevsky, Barbara Olsen, Anna Shvets, Ronald Slaton, Scott Webb.

Some of the features/design elements were inspired by Progression (my favourite workout app by far, until the big subscription wall was introduced) and GymRun.

Privacy policy was inspired by WrichikBasu/ShakeAlarmClock.