Reviewed-on: #2
ResBuilder Android
Native Android client for ResBuilder AI — an AI-powered resume and cover letter generator.
Overview
This app connects to the ResBuilder backend API to let users:
- Authenticate via Google Sign-In
- Paste or scrape job descriptions (including SEEK URLs)
- Upload existing resumes/cover letters (PDF/DOCX)
- Submit AI generation jobs
- View generated documents as rendered HTML
- Export results as PDF or DOCX
Architecture
com.example.resbuilder
├── data
│ ├── model # Pydantic-style data classes (User, Job, etc.)
│ └── remote # OkHttp API client with Bearer token auth
└── ui
├── LoginActivity # Google Sign-In via Credential Manager
├── MainActivity # Tab navigation + fragment container
├── JobFormFragment # Job details, upload, scrape, submit
├── JobStatusFragment # Poll job status (2s interval, 10min max)
├── ResultFragment # HTML preview, copy, export
└── AdminActivity # Admin user management (optional)
Authentication
Uses Google Sign-In for Android (compliant with Google OAuth policy):
- User taps Sign In → native Google account picker
- App receives a Google ID token
- Token is exchanged for a backend session token via
POST /auth/google-token - Session token is sent as
Authorization: Bearer <token>on every API call
No WebView. No embedded user-agents. No cookies.
Requirements
- Android SDK 29+ (Android 10)
- Compile SDK 36
- Java 11
- Gradle 9.4.1
Dependencies
| Library | Purpose |
|---|---|
| OkHttp 4.12.0 | HTTP client, cookie jar, interceptor |
| Gson 2.10.1 | JSON serialization |
| Material Components 1.10.0 | UI components (M3) |
| Play Services Auth 20.7.0 | Google Sign-In |
Configuration
Set your Google Web Client ID in LoginActivity.kt:
private val webClientId = "YOUR_WEB_CLIENT_ID.apps.googleusercontent.com"
This must match the GOOGLE_CLIENT_ID configured on the backend.
Build
./gradlew assembleDebug
APK output: app/build/outputs/apk/debug/app-debug.apk
API
The app talks to https://resume.aridgwayweb.com (configurable in ApiClient.kt).
Key endpoints used:
POST /auth/google-token— exchange Google ID token for sessionGET /auth/me— current user infoPOST /build_resume|/build_cover_letter— submit generation jobGET /job/{id}— poll job statusPOST /upload/resume|/upload/cover_letter— extract text from PDF/DOCXPOST /scrape-job— extract text from SEEK URLGET /export/{id}/pdf|/export/{id}/docx— download generated document
Project Structure
app/src/main/
├── java/com/example/resbuilder/
│ ├── data/
│ │ ├── model/Models.kt
│ │ └── remote/ApiClient.kt
│ └── ui/
│ ├── LoginActivity.kt
│ ├── MainActivity.kt
│ ├── JobFormFragment.kt
│ ├── JobStatusFragment.kt
│ ├── ResultFragment.kt
│ ├── AdminActivity.kt
│ └── AdminUserAdapter.kt
├── res/layout/
│ ├── activity_login.xml
│ ├── activity_main.xml
│ ├── fragment_job_form.xml
│ ├── fragment_job_status.xml
│ ├── fragment_result.xml
│ └── activity_admin.xml
└── res/values/
├── colors.xml
├── strings.xml
└── themes.xml
Design System
See .agents/design/DESIGN.md for the Material Design 3 + Amazon/Google design guidelines used across the app.
License
Same as the backend project.
Description
Languages
Kotlin
100%