# ResBuilder Android Native Android client for [ResBuilder AI](https://git.aridgwayweb.com/armistace/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): 1. User taps Sign In → native Google account picker 2. App receives a Google ID token 3. Token is exchanged for a backend session token via `POST /auth/google-token` 4. Session token is sent as `Authorization: Bearer ` 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`: ```kotlin private val webClientId = "YOUR_WEB_CLIENT_ID.apps.googleusercontent.com" ``` This must match the `GOOGLE_CLIENT_ID` configured on the backend. ## Build ```bash ./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 session - `GET /auth/me` — current user info - `POST /build_resume` | `/build_cover_letter` — submit generation job - `GET /job/{id}` — poll job status - `POST /upload/resume` | `/upload/cover_letter` — extract text from PDF/DOCX - `POST /scrape-job` — extract text from SEEK URL - `GET /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.