Splitfit was renamed to GymRoutines and the source code was moved to codeberg.
New repository: https://codeberg.org/noahjutz/GymRoutines
Save workout routines and track your progress.
License: GNU General Public License v3.0
Splitfit was renamed to GymRoutines and the source code was moved to codeberg.
New repository: https://codeberg.org/noahjutz/GymRoutines
Because it's used in CreateRoutineScreen, RoutinesScreen and ExercisesScreen, share the code.
Currently, single-character values are not selected on tap as a workaround for a bug where you cant replace them with the same value.
Check for open source software:
Clean up the current code in CreateRoutineScreen
by creating a Table
composable.
https://doc.insert-koin.io/#/koin-android/viewmodel?id=viewmodel-and-injection-parameters
Instead of constructing an object like this:
SomeViewModel(id, get(Repository::class.java))
use koin's built in injection parameters.
val appModule = module {
viewModel { (id : String) -> SomeViewModel(id, get(), get()) }
}
Instead of using a coroutine scope within Repository
, make ViewModels / UI do that by using viewModelScope
or rememberCoroutineScope()
.
Whether @Composable fun onDispose
or ViewModel.onCleared
is used, the callback is not made when the entire app is stopped. Maybe use SavedStateHandle?
When creating a new exercise/routine and leaving without any modifications, don't save that exercise/routine.
Applies to:
In order to increase stability and code quality, start migrating to full TDD.
The checked state of an exercise in PickExerciseScreen seems to be bound to position, not content. This becomes a problem when the user filters exercises by name (implemented: #43) and positions change accordingly.
Currently, DataStore preferences are often handled withing compose UI components rather than their viewModels. In order to improve code quality, move this responsibility to ViewModels.
When focusing a TextField, the software keyboard doesn't always pop up. Reopening the app fixes the problem.
Reason: Unknown
Might be upstream
Current package names are:
com.noahjutz.splitfit.fdroid
for F-Droid build flavorcom.noahjutz.splitfit.googleplay
for Google Play build flavorcom.noahjutz.splitfit
is currently published on google play.In order to avoid confusiong among users that use both stores, remove the suffix (.fdroid
/.googleplay
).
Removing .googleplay
should be easy.
Removing .fdroid
might require some changes in fdroiddata because com.noahjutz.splitfit.fdroid
is already published on F-Droid.
Replacing this will most likely be version name suffixes.
For localization, extract UI strings to string resources.
Now that CreateExerciseViewModel has been revamped, the previous workaround, disallowing users from unchecking a checkbox if all others are unchecked, is removed.
Instead of using an Int value, use Duration
along with a TypeConverter
s to convert using inSeconds
and back using Int.seconds
.
let's translate on weblate - it's easier than on github
instead of using onDispose
to call a ViewModel function, override onCleared
in the ViewModel itself
Use ViewModel SavedStateHandle, inject using koin
Add the following:
In dependencies.kt, use better naming to reflect what the dependencies actually are. Also, find a better way to structure the objects grouping together dependencies. Options include:
App requests the following permissions for no reason:
Reason: Unknown
In order to have the same apk signature and allow users to seamlessly update using both github releases and f-droid, use reproducible builds. https://f-droid.org/en/docs/Reproducible_Builds/
Would close noahjutz/GymRoutines#32
Hi,
I'm working on filling this workout plan, but I couldn't figure out where Splitfit stores its files.
May you please tell me where can I find the config files to be able to share my workout plan?
PS. I've a ton of the suggestions, so I'll post them one by one. Furthermore, I'll post them depending on my personal experience because there are critical fixings/feature requests. I wish to find some time to response to them.
Unfortunately I haven't any knowledge in Kotlin, so PR is impossible to me.
This is because observers are only notified when the value is replaced, not when its properties change.
val m = MutableStateFlow(Routine("test initial"))
m.value.name = "test updated" // This line does not cause an update
m.value = m.value.copy(name = "test updated") // This line does.
The default name of the backup is splitfit-backup.sqlite3
I suggest adding a timestamp for it (something like splitfit-backup-<yyyy-MM-dd_HH-mm-ss.SSSSSS>.sqlite3
)
DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS")
.withZone(ZoneOffset.UTC)
.format(Instant.now())
The app currently uses ProcessPhoenix to restart after exporting/importing the database. Not only is this bad UX, it doesn't work on API 30+ currently.
Restarting the app is a workaround. Instead of reopening the database after closing it, the entire app is restarted. It was easier to implement, but it should be possible to do it the right way.
First, double check if closing the database is necessary.
There is an online training platform named splitfit. So I suggest to rename the project to something else.
This causes the listed exercises to be filtered, even though the search bar is hidden, when returning to ExercisesScreen.
var reps = set.reps.formatString()
fun Double?.formatString(): String {
// Handle null
if (this == null) return ""
// Handle x.0
if (this == floor(this)) return this.toInt().toString()
// Anything else
return this.toString()
}
Cards such as SetGroupCard rows, Routine and Exercise items in RoutinesScreen/ExercisesScreen are initially elevated, which looks weird when scrolling through a LazyColumn or opening a new screen.
I suggest adding a new field for adding image(animated & static)/video explains the exercise just like most other apps.
https://www.tutorialspoint.com/how-to-display-animated-gif-images-in-android-using-kotlin
Currently, there is no compose implementation of ItemTouchHelper, but it will probably be introduced in the coming updates.
Koin seems to be more lightweight and suitable for smaller projects, as opposed to Kodein. https://insert-koin.io
Make up button cancel and add a fab to confirm
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.