noahjutz / splitfit Goto Github PK
View Code? Open in Web Editor NEWSave workout routines and track your progress.
License: GNU General Public License v3.0
Save workout routines and track your progress.
License: GNU General Public License v3.0
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()
}
Check for open source software:
There is an online training platform named splitfit. So I suggest to rename the project to something else.
Use ViewModel SavedStateHandle, inject using koin
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())
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.
Would close noahjutz/GymRoutines#32
When focusing a TextField, the software keyboard doesn't always pop up. Reopening the app fixes the problem.
Reason: Unknown
Might be upstream
Currently, single-character values are not selected on tap as a workaround for a bug where you cant replace them with the same value.
let's translate on weblate - it's easier than on github
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/
Instead of using an Int value, use Duration
along with a TypeConverter
s to convert using inSeconds
and back using Int.seconds
.
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()) }
}
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.
Applies to:
Clean up the current code in CreateRoutineScreen
by creating a Table
composable.
For localization, extract UI strings to string resources.
App requests the following permissions for no reason:
Reason: Unknown
Add the following:
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.
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:
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.
When creating a new exercise/routine and leaving without any modifications, don't save that exercise/routine.
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.
Instead of using a coroutine scope within Repository
, make ViewModels / UI do that by using viewModelScope
or rememberCoroutineScope()
.
Now that CreateExerciseViewModel has been revamped, the previous workaround, disallowing users from unchecking a checkbox if all others are unchecked, is removed.
Koin seems to be more lightweight and suitable for smaller projects, as opposed to Kodein. https://insert-koin.io
Because it's used in CreateRoutineScreen, RoutinesScreen and ExercisesScreen, share the code.
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.
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.
instead of using onDispose
to call a ViewModel function, override onCleared
in the ViewModel itself
This causes the listed exercises to be filtered, even though the search bar is hidden, when returning to ExercisesScreen.
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.
In order to increase stability and code quality, start migrating to full TDD.
Make up button cancel and add a fab to confirm
Whether @Composable fun onDispose
or ViewModel.onCleared
is used, the callback is not made when the entire app is stopped. Maybe use SavedStateHandle?
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.