Andrew Ridgway c589e5f9e4
design: Material Design 3 redesign across all layouts and themes
- colors.xml: replaced legacy palette with M3 semantic tokens
  (primary, secondary, tertiary, surface containers, outline, status)
- themes.xml + values-night/themes.xml: switched to
  Theme.Material3.DayNight.NoActionBar, mapped all M3 color roles,
  transparent system bars for edge-to-edge, M3 typography
- attrs.xml: custom semantic attrs (colorSuccess, colorWarning, colorInfo)
- strings.xml: added accessibility labels, loading/empty/error strings
- activity_login.xml: centered branding, M3 headline/body, skeleton card
- activity_main.xml: edge-to-edge CoordinatorLayout, M3 AppBar/toolbar,
  health indicator group, M3 banner, M3 TabLayout
- fragment_job_form.xml: grouped fields in outlined cards (12dp radius),
  FilledBox text inputs, TonalButtons, 16dp margins
- fragment_job_status.xml: chip-style badge, LinearProgressIndicator,
  centered card with error/try-again states
- fragment_result.xml: SuggestionChip badge, WebView fills space,
  bottom action bar in outlined card
- activity_admin.xml + item_admin_user.xml: M3 card list items,
  proper type scale hierarchy
- Updated drawables to use theme attributes

Refs DESIGN.md Material Design 3 + Amazon/Google guidelines.
2026-07-18 23:48:33 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00
2026-07-18 23:38:41 +10:00

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):

  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 <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 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.

Description
No description provided
Readme 253 KiB
Languages
Kotlin 100%