A gym workout & physique tracking Android app built with Java, Realm, and RecyclerView.
- Build & manage workout routines — define exercises with target weight, reps, sets
- Log live workout sessions — track completed sets, take photos mid-workout
- View personal records — aggregate max weight per exercise across all workouts
- Workout history — browse past sessions with detailed set logs
- Progress photos — capture bodyweight and physique photos, compare side-by-side over time
- Multi-user support — each user's data is completely partitioned; no data bleed
- Android Studio (latest)
- Android SDK installed (API 36+)
-
Clone the repo
git clone https://github.com/Ajtn05/Android-Dev-Final.git cd Android-Dev-Final -
Configure your SDK path
cp local.properties.example local.properties
Then edit
local.propertiesand set your SDK path:- macOS:
sdk.dir=/Users/YOUR_USERNAME/Library/Android/Sdk - Windows:
sdk.dir=C:\Users\YOUR_USERNAME\AppData\Local\Android\Sdk - Linux:
sdk.dir=/home/YOUR_USERNAME/Android/Sdk
(You can find your SDK path in Android Studio: Settings > SDK Manager > SDK Location)
- macOS:
-
Open in Android Studio
- File → Open → select this folder
- Android Studio will sync Gradle and download dependencies
-
Build & Run
./gradlew assembleDebug
Or use Android Studio's Run button (Shift+F10)
app/src/main/
├── java/nellas/labs/
│ ├── User, Exercise, Routine, SetLog, WorkoutLog, ProgressPhoto (Realm models)
│ ├── LoginActivity, RegisterActivity, AdminActivity (auth & user mgmt)
│ ├── HomeActivity, RoutineEditActivity, SessionActivity (routine workflow)
│ ├── RecordsActivity, HistoryActivity (stats & logs)
│ ├── PhotosActivity, PhotoViewerActivity (progress tracking)
│ ├── *Adapter classes (RecyclerView adapters)
│ └── PhotoHelper, NavBar (shared utilities)
├── res/layout/
│ ├── activity_*.xml (screen layouts)
│ ├── row_*.xml, cell_*.xml (list/grid rows)
│ └── view_bottom_nav.xml (shared navigation bar)
└── AndroidManifest.xml
gradle/
├── wrapper/ (gradle build tool)
build.gradle, settings.gradle, gradle.properties
local.properties.example (copy to local.properties)
- Java 11 (no Kotlin)
- Realm Classic 10.19.0 — local NoSQL database
- RecyclerView + RealmRecyclerViewAdapter — efficient lists
- Picasso 2.71828 — image loading
- Dexter 6.2.3 — runtime permissions (camera, storage)
- Android Image Cropper — photo crop & resize
- Material Design 1.14.0 — UI components
- All user data is partitioned by
ownerId(no cross-user data bleed) - Every Realm query for app data must filter
.equalTo("ownerId", currentUserUuid) - Realm database is local; resets on schema version changes (
deleteRealmIfMigrationNeeded()) - Photos are saved to
getExternalCacheDir()as JPEG files
- Register two different users
- Log in as User A → build a routine, run a session, add a progress photo
- Log out / clear SharedPreferences
- Log in as User B → verify you see NONE of User A's data
Build fails with "SDK not found"
- Check
local.properties: does thesdk.dirpath exist on your machine? - Run
./gradlew --versionto verify Gradle can find the SDK
Gradle sync fails
- Make sure you have Android SDK API 36 installed (Android Studio → SDK Manager → Platforms)
Camera/gallery not working
- Grant permissions when the app prompts
- On Android 6+, runtime permissions are requested via Dexter
School project — final Android development assignment.