My Resumes history, modern M3 redesign, authenticated exports #2

Merged
armistace merged 10 commits from feature/my-resumes-modern into master 2026-08-04 23:58:13 +10:00
15 changed files with 756 additions and 227 deletions
Showing only changes of commit c589e5f9e4 - Show all commits

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/banner_warning" />
<corners android:radius="8dp" />
<shape xmlns:android="http://schemas.android.com/apk"
android:shape="rectangle">
<solid android:color="?attr/colorWarningContainer" />
<corners android:radius="12dp" />
</shape>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/android"
android:shape="rectangle">
<solid android:color="?attr/colorSurfaceContainerHighest" />
<corners android:radius="8dp" />
</shape>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:fillColor="?attr/colorOnSurface"
android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0" />
</vector>

View File

@ -1,25 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:background="?attr/colorSurface"
android:orientation="vertical"
tools:context=".ui.AdminActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:background="?attr/colorSurface"
app:elevation="0dp"
app:liftOnScroll="false">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/adminToolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
android:background="?attr/colorSurface"
app:navigationIcon="?attr/homeAsUpIndicator"
app:navigationIconTint="?attr/colorOnSurface"
app:title="@string/admin_title"
xmlns:app="http://schemas.android.com/apk/res-auto" />
app:titleCentered="true"
app:titleTextAppearance="?attr/textAppearanceTitleLarge"
app:titleTextColor="?attr/colorOnSurface" />
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="16dp"
android:layout_weight="1"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/adminRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:clipToPadding="false"
android:contentDescription="@string/admin_title"
android:padding="8dp" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

View File

@ -1,42 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/colorBackground">
android:background="?attr/colorSurface"
android:padding="16dp"
tools:context=".ui.LoginActivity">
<ProgressBar
android:id="@+id/loginProgress"
android:layout_width="wrap_content"
<!-- Skeleton loading placeholder visible while auth is checked -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/loginSkeletonCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:layout_marginHorizontal="16dp"
android:visibility="gone"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="24dp">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:background="?attr/colorSurfaceContainerHigh" />
<View
android:layout_width="160dp"
android:layout_height="24dp"
android:layout_marginTop="16dp"
android:background="?attr/colorSurfaceContainerHigh" />
<View
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="24dp"
android:background="?attr/colorSurfaceContainerHigh" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<ImageView
android:id="@+id/appIcon"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_marginBottom="24dp"
android:background="?attr/colorPrimaryContainer"
android:contentDescription="@string/cd_app_logo"
android:importantForAccessibility="yes"
android:padding="24dp"
android:src="@drawable/ic_launcher_foreground"
app:layout_constraintBottom_toTopOf="@id/loginTitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:tint="?attr/colorOnPrimaryContainer" />
<TextView
android:id="@+id/loginTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginBottom="8dp"
android:text="@string/app_title"
android:textAppearance="?attr/textAppearanceHeadline3"
android:textColor="?attr/colorPrimary"
app:layout_constraintBottom_toTopOf="@id/googleSignInButton"
android:textAppearance="?attr/textAppearanceHeadlineLarge"
android:textColor="?attr/colorOnSurface"
app:layout_constraintBottom_toTopOf="@id/loginSubtitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" />
<com.google.android.gms.common.SignInButton
android:id="@+id/googleSignInButton"
<TextView
android:id="@+id/loginSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="24dp"
android:text="@string/checking_auth"
android:textAppearance="?attr/textAppearanceBodyMedium"
android:textColor="?attr/colorOnSurfaceVariant"
app:layout_constraintBottom_toTopOf="@id/googleSignInButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/loginTitle" />
<ProgressBar
android:id="@+id/loginProgress"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginBottom="24dp"
android:contentDescription="@string/cd_loading"
android:indeterminateTint="?attr/colorPrimary"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/loginTitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.gms.common.SignInButton
android:id="@+id/googleSignInButton"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="24dp"
android:contentDescription="@string/cd_google_sign_in"
android:minWidth="200dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/loginSubtitle" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,25 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true"
tools:context=".ui.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
android:background="?attr/colorSurface"
android:fitsSystemWindows="true"
app:elevation="0dp"
app:liftOnScroll="false">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.MaterialComponents.Dark"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:title="@string/app_title"
app:titleTextColor="@color/white">
app:titleCentered="true"
app:titleTextAppearance="?attr/textAppearanceTitleLarge"
app:titleTextColor="?attr/colorOnSurface">
<LinearLayout
android:id="@+id/healthContainer"
@ -27,14 +35,18 @@
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:layout_marginEnd="16dp"
android:background="?attr/colorSurfaceContainer"
android:gravity="center_vertical"
android:orientation="horizontal">
android:minHeight="32dp"
android:orientation="horizontal"
android:paddingHorizontal="12dp"
android:paddingVertical="4dp">
<ImageView
android:id="@+id/healthIndicator"
android:layout_width="12dp"
android:layout_height="12dp"
android:contentDescription="@string/app_name"
android:contentDescription="@string/cd_health_indicator"
android:src="@drawable/ic_circle_status" />
<TextView
@ -43,35 +55,51 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/unknown_user"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="@color/white" />
android:textAppearance="?attr/textAppearanceLabelMedium"
android:textColor="?attr/colorOnSurface" />
</LinearLayout>
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout>
<TextView
android:id="@+id/usageBanner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
android:background="@drawable/bg_banner_warning"
android:drawableStart="@drawable/ic_circle_status"
android:drawableTint="?attr/colorWarning"
android:gravity="center_vertical"
android:minHeight="48dp"
android:padding="12dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:text="@string/usage_limit_banner"
android:textColor="@color/banner_warning_text"
android:visibility="gone" />
android:textAppearance="?attr/textAppearanceBodyMedium"
android:textColor="?attr/colorOnSurface"
android:visibility="gone"
tools:visibility="visible" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurface"
android:contentDescription="@string/app_title"
app:tabBackground="?attr/colorSurface"
app:tabGravity="fill"
app:tabMode="fixed" />
app:tabIndicatorColor="?attr/colorPrimary"
app:tabMode="fixed"
app:tabTextAppearance="?attr/textAppearanceLabelLarge"
app:tabTextColor="?attr/colorOnSurfaceVariant"
app:tabSelectedTextColor="?attr/colorOnSurface" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
android:layout_height="match_parent"
android:background="?attr/colorSurface"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,33 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:fillViewport="true"
android:padding="16dp">
tools:context=".ui.JobFormFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hint_job_title"
android:textAppearance="?attr/textAppearanceTitleMedium"
android:textColor="?attr/colorOnSurface" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="@string/hint_job_title"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
app:boxBackgroundColor="?attr/colorSurfaceContainer"
app:hintTextColor="?attr/colorOnSurfaceVariant"
style="@style/Widget.Material3.TextInputLayout.FilledBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/jobTitleInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
android:inputType="text"
android:minHeight="48dp" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:baselineAligned="false"
android:orientation="horizontal">
<com.google.android.material.textfield.TextInputLayout
@ -35,29 +64,37 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/hint_seek_url"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
app:boxBackgroundColor="?attr/colorSurfaceContainer"
app:hintTextColor="?attr/colorOnSurfaceVariant"
style="@style/Widget.Material3.TextInputLayout.FilledBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/seekUrlInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textUri" />
android:inputType="textUri"
android:minHeight="48dp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/scrapeButton"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:contentDescription="@string/cd_scrape_job"
android:minWidth="64dp"
android:text="@string/button_scrape" />
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginTop="16dp"
android:hint="@string/hint_job_description"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
app:boxBackgroundColor="?attr/colorSurfaceContainer"
app:hintTextColor="?attr/colorOnSurfaceVariant"
style="@style/Widget.Material3.TextInputLayout.FilledBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/jobDescriptionInput"
@ -67,13 +104,47 @@
android:inputType="textMultiLine"
android:minLines="4" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/docInputTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/hint_your_resume"
android:textAppearance="?attr/textAppearanceTitleMedium"
android:textColor="?attr/colorOnSurface" />
<com.google.android.material.button.MaterialButton
android:id="@+id/uploadButton"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_height="48dp"
android:contentDescription="@string/cd_upload_document"
android:text="@string/button_upload" />
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/docInputLayout"
@ -81,7 +152,9 @@
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="@string/hint_your_resume"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
app:boxBackgroundColor="?attr/colorSurfaceContainer"
app:hintTextColor="?attr/colorOnSurfaceVariant"
style="@style/Widget.Material3.TextInputLayout.FilledBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/docInput"
@ -91,21 +164,24 @@
android:inputType="textMultiLine"
android:minLines="6" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.button.MaterialButton
android:id="@+id/submitButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="16dp"
android:text="@string/generate_resume" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:contentDescription="@string/cd_loading"
android:indeterminateTint="?attr/colorPrimary"
android:visibility="gone" />
</LinearLayout>
</ScrollView>

View File

@ -1,22 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp">
android:padding="16dp">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
app:cardCornerRadius="12dp"
app:cardElevation="4dp">
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="24dp">
@ -24,45 +30,53 @@
android:id="@+id/statusBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@drawable/bg_banner_warning"
android:background="@drawable/bg_status_badge"
android:contentDescription="@string/status_queued"
android:gravity="center"
android:minHeight="32dp"
android:paddingHorizontal="16dp"
android:paddingVertical="4dp"
android:text="@string/status_queued"
android:textAppearance="?attr/textAppearanceBody2"
android:textStyle="bold" />
android:textAppearance="?attr/textAppearanceLabelLarge"
android:textColor="?attr/colorOnPrimary" />
<ProgressBar
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/statusProgress"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="24dp" />
android:layout_marginTop="24dp"
android:contentDescription="@string/content_generation_running"
android:indeterminate="true"
app:indicatorColor="?attr/colorPrimary"
app:trackColor="?attr/colorSurfaceContainerHighest" />
<TextView
android:id="@+id/statusMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="@string/job_wait_message"
android:textAppearance="?attr/textAppearanceBody1" />
android:textAppearance="?attr/textAppearanceBodyLarge"
android:textColor="?attr/colorOnSurface" />
<TextView
android:id="@+id/statusDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:textAppearance="?attr/textAppearanceCaption"
android:gravity="center"
android:textAppearance="?attr/textAppearanceBodySmall"
android:textColor="?attr/colorOnSurfaceVariant"
android:visibility="gone" />
<com.google.android.material.button.MaterialButton
android:id="@+id/tryAgainButton"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_height="48dp"
android:layout_marginTop="24dp"
android:minWidth="120dp"
android:text="@string/try_again"
android:visibility="gone" />
</LinearLayout>

View File

@ -1,21 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:background="?attr/colorSurface"
android:orientation="vertical"
tools:context=".ui.ResultFragment">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
app:cardCornerRadius="8dp"
app:cardElevation="2dp">
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="48dp"
android:orientation="horizontal"
android:padding="12dp">
@ -23,11 +31,15 @@
android:id="@+id/resultBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_banner_warning"
android:background="@drawable/bg_status_badge"
android:contentDescription="@string/status_completed"
android:gravity="center"
android:minHeight="32dp"
android:paddingHorizontal="12dp"
android:paddingVertical="4dp"
android:text="@string/status_completed"
android:textStyle="bold" />
android:textAppearance="?attr/textAppearanceLabelLarge"
android:textColor="?attr/colorOnPrimary" />
<View
android:layout_width="0dp"
@ -36,16 +48,21 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/copyButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:contentDescription="@string/cd_copy_result"
android:minWidth="64dp"
android:text="@string/copy_text" />
<com.google.android.material.button.MaterialButton
android:id="@+id/newButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginStart="4dp"
android:contentDescription="@string/cd_new_job"
android:minWidth="64dp"
android:text="@string/new_job" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
@ -54,31 +71,46 @@
android:id="@+id/resultWebView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginHorizontal="12dp"
android:layout_weight="1" />
android:layout_marginHorizontal="16dp"
android:layout_weight="1"
android:contentDescription="@string/result_preview" />
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:orientation="horizontal">
android:orientation="horizontal"
android:padding="12dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/pdfButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:contentDescription="@string/cd_export_pdf"
android:text="@string/export_pdf" />
<com.google.android.material.button.MaterialButton
android:id="@+id/docxButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:contentDescription="@string/cd_export_docx"
android:text="@string/export_docx" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

View File

@ -1,15 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="2dp">
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:strokeWidth="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="64dp"
android:orientation="horizontal"
android:padding="16dp">
@ -23,28 +28,35 @@
android:id="@+id/userEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/textAppearanceBody1"
android:textStyle="bold" />
android:textAppearance="?attr/textAppearanceBodyLarge"
android:textColor="?attr/colorOnSurface" />
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/textAppearanceBody2" />
android:layout_marginTop="2dp"
android:textAppearance="?attr/textAppearanceBodyMedium"
android:textColor="?attr/colorOnSurfaceVariant" />
<TextView
android:id="@+id/userUsage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/textAppearanceCaption" />
android:layout_marginTop="4dp"
android:textAppearance="?attr/textAppearanceLabelSmall"
android:textColor="?attr/colorOnSurfaceVariant" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/actionButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:text="@string/block_user" />
android:contentDescription="@string/cd_admin_action"
android:minWidth="72dp"
android:text="@string/block_user"
android:textColor="?attr/colorError" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>

View File

@ -1,16 +1,90 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.ResBuilder" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<style name="Theme.ResBuilder" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary color roles (dark) -->
<item name="colorPrimary">#D0BCFF</item>
<item name="colorOnPrimary">#381E72</item>
<item name="colorPrimaryContainer">#4F378B</item>
<item name="colorOnPrimaryContainer">#EADDFF</item>
<item name="colorPrimaryInverse">#6750A4</item>
<!-- Secondary color roles (dark) -->
<item name="colorSecondary">#CCC2DC</item>
<item name="colorOnSecondary">#332D41</item>
<item name="colorSecondaryContainer">#4A4458</item>
<item name="colorOnSecondaryContainer">#E8DEF8</item>
<!-- Tertiary color roles (dark) -->
<item name="colorTertiary">#EFB8C8</item>
<item name="colorOnTertiary">#492532</item>
<item name="colorTertiaryContainer">#633B48</item>
<item name="colorOnTertiaryContainer">#FFD8E4</item>
<!-- Surface color roles (dark) -->
<item name="android:colorBackground">#1D1B20</item>
<item name="colorSurface">#1D1B20</item>
<item name="colorOnSurface">#E6E1E5</item>
<item name="colorSurfaceVariant">#49454F</item>
<item name="colorOnSurfaceVariant">#CAC4D0</item>
<item name="colorSurfaceContainerLowest">#16141C</item>
<item name="colorSurfaceContainerLow">#1D1B20</item>
<item name="colorSurfaceContainer">#211F26</item>
<item name="colorSurfaceContainerHigh">#27252D</item>
<item name="colorSurfaceContainerHighest">#36343B</item>
<item name="colorSurfaceInverse">#E6E0E9</item>
<item name="colorOnSurfaceInverse">#322F35</item>
<!-- Outline -->
<item name="colorOutline">#938F99</item>
<item name="colorOutlineVariant">#49454F</item>
<!-- Error (dark) -->
<item name="colorError">#F2B8B5</item>
<item name="colorOnError">#601410</item>
<item name="colorErrorContainer">#8C1D18</item>
<item name="colorOnErrorContainer">#F9DEDC</item>
<!-- Status and custom semantic color attrs (dark) -->
<item name="colorSuccess">#81C784</item>
<item name="colorOnSuccess">#003D00</item>
<item name="colorSuccessContainer">#1B5E1F</item>
<item name="colorOnSuccessContainer">#D9F6DA</item>
<item name="colorWarning">#FFB74D</item>
<item name="colorOnWarning">#4A2C00</item>
<item name="colorWarningContainer">#693B00</item>
<item name="colorOnWarningContainer">#FFE3B6</item>
<item name="colorInfo">#64B5F6</item>
<item name="colorOnInfo">#0B4576</item>
<item name="colorInfoContainer">#0B4576</item>
<item name="colorOnInfoContainer">#D4EAFB</item>
<!-- System bars - edge-to-edge ready (dark) -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">false</item>
<!-- M3 Typography and shape defaults inherited from Material3 parent -->
<item name="textAppearanceDisplayLarge">@style/TextAppearance.Material3.DisplayLarge</item>
<item name="textAppearanceDisplayMedium">@style/TextAppearance.Material3.DisplayMedium</item>
<item name="textAppearanceDisplaySmall">@style/TextAppearance.Material3.DisplaySmall</item>
<item name="textAppearanceHeadlineLarge">@style/TextAppearance.Material3.HeadlineLarge</item>
<item name="textAppearanceHeadlineMedium">@style/TextAppearance.Material3.HeadlineMedium</item>
<item name="textAppearanceHeadlineSmall">@style/TextAppearance.Material3.HeadlineSmall</item>
<item name="textAppearanceTitleLarge">@style/TextAppearance.Material3.TitleLarge</item>
<item name="textAppearanceTitleMedium">@style/TextAppearance.Material3.TitleMedium</item>
<item name="textAppearanceTitleSmall">@style/TextAppearance.Material3.TitleSmall</item>
<item name="textAppearanceBodyLarge">@style/TextAppearance.Material3.BodyLarge</item>
<item name="textAppearanceBodyMedium">@style/TextAppearance.Material3.BodyMedium</item>
<item name="textAppearanceBodySmall">@style/TextAppearance.Material3.BodySmall</item>
<item name="textAppearanceLabelLarge">@style/TextAppearance.Material3.LabelLarge</item>
<item name="textAppearanceLabelMedium">@style/TextAppearance.Material3.LabelMedium</item>
<item name="textAppearanceLabelSmall">@style/TextAppearance.Material3.LabelSmall</item>
<!-- Default M3 component styles inherited from Material3 parent; explicit overrides kept to a minimum -->
<item name="materialButtonStyle">@style/Widget.Material3.Button</item>
<item name="materialButtonOutlinedStyle">@style/Widget.Material3.Button.OutlinedButton</item>
<item name="android:windowBackground">?attr/colorSurface</item>
</style>
</resources>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Semantic status color attributes used across ResBuilder UI -->
<attr name="colorSuccess" format="color" />
<attr name="colorOnSuccess" format="color" />
<attr name="colorSuccessContainer" format="color" />
<attr name="colorOnSuccessContainer" format="color" />
<attr name="colorWarning" format="color" />
<attr name="colorOnWarning" format="color" />
<attr name="colorWarningContainer" format="color" />
<attr name="colorOnWarningContainer" format="color" />
<attr name="colorInfo" format="color" />
<attr name="colorOnInfo" format="color" />
<attr name="colorInfoContainer" format="color" />
<attr name="colorOnInfoContainer" format="color" />
</resources>

View File

@ -1,20 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<!-- Material Design 3 semantic color tokens -->
<!-- Primary palette -->
<color name="primary">#6750A4</color>
<color name="on_primary">#FFFFFF</color>
<color name="primary_container">#EADDFF</color>
<color name="on_primary_container">#21005D</color>
<!-- Secondary palette -->
<color name="secondary">#625B71</color>
<color name="on_secondary">#FFFFFF</color>
<color name="secondary_container">#E8DEF8</color>
<color name="on_secondary_container">#1D192B</color>
<!-- Tertiary palette -->
<color name="tertiary">#7D5260</color>
<color name="on_tertiary">#FFFFFF</color>
<color name="tertiary_container">#FFD8E4</color>
<color name="on_tertiary_container">#31111D</color>
<!-- Surface colors -->
<color name="surface">#FFFBFE</color>
<color name="on_surface">#1D1B20</color>
<color name="surface_variant">#E7E0EC</color>
<color name="on_surface_variant">#49454F</color>
<color name="surface_container_lowest">#FFFFFF</color>
<color name="surface_container_low">#F5EFF7</color>
<color name="surface_container">#F3EDF7</color>
<color name="surface_container_high">#ECE6F0</color>
<color name="surface_container_highest">#E6E0E9</color>
<!-- Outline -->
<color name="outline">#79747E</color>
<color name="outline_variant">#CAC4D0</color>
<!-- Status / Semantic colors -->
<color name="success">#4CAF50</color>
<color name="on_success">#FFFFFF</color>
<color name="success_container">#D9F6DA</color>
<color name="on_success_container">#1F5E22</color>
<color name="warning">#FF9800</color>
<color name="on_warning">#FFFFFF</color>
<color name="warning_container">#FFE3B6</color>
<color name="on_warning_container">#693B00</color>
<color name="error">#F44336</color>
<color name="on_error">#FFFFFF</color>
<color name="error_container">#F9DEDC</color>
<color name="on_error_container">#410E0B</color>
<color name="info">#2196F3</color>
<color name="on_info">#FFFFFF</color>
<color name="info_container">#D4EAFB</color>
<color name="on_info_container">#0B4576</color>
<!-- Inverse surface -->
<color name="inverse_surface">#322F35</color>
<color name="inverse_on_surface">#F5EFF7</color>
<color name="inverse_primary">#D0BCFF</color>
<!-- Status indicator palettes (kept for programmatic tint compatibility) -->
<color name="status_healthy">@color/success</color>
<color name="status_degraded">@color/warning</color>
<color name="status_unhealthy">@color/error</color>
<!-- Legacy aliases to avoid breaking any remaining references during migration -->
<color name="purple_200">@color/primary_container</color>
<color name="purple_500">@color/primary</color>
<color name="purple_700">@color/on_primary_container</color>
<color name="teal_200">@color/secondary_container</color>
<color name="teal_700">@color/secondary</color>
<!-- Legacy neutral aliases kept for programmatic compatibility in unchanged Kotlin code -->
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="status_healthy">#FF4CAF50</color>
<color name="status_degraded">#FFFFC107</color>
<color name="status_unhealthy">#FFF44336</color>
<color name="banner_warning">#FFFFF3E0</color>
<color name="banner_warning_text">#FFE65100</color>
<color name="status_badge_queued">#FF9E9E9E</color>
<color name="status_badge_running">#FF2196F3</color>
<color name="status_badge_completed">#FF4CAF50</color>
<color name="status_badge_failed">#FFF44336</color>
<color name="banner_warning">@color/warning_container</color>
<color name="banner_warning_text">@color/on_warning_container</color>
<color name="status_badge_queued">@color/surface_container_highest</color>
<color name="status_badge_running">@color/info</color>
<color name="status_badge_completed">@color/success</color>
<color name="status_badge_failed">@color/error</color>
</resources>

View File

@ -45,6 +45,19 @@
<string name="copied_to_clipboard">Copied to clipboard</string>
<string name="nothing_to_copy">Nothing to copy</string>
<!-- Accessibility labels -->
<string name="cd_app_logo">resBuilder app logo</string>
<string name="cd_google_sign_in">Sign in with Google</string>
<string name="cd_loading">Loading</string>
<string name="cd_health_indicator">Service health indicator</string>
<string name="cd_scrape_job">Scrape job description from SEEK URL</string>
<string name="cd_upload_document">Upload existing resume or cover letter</string>
<string name="cd_copy_result">Copy generated text to clipboard</string>
<string name="cd_new_job">Start a new job</string>
<string name="cd_export_pdf">Export as PDF</string>
<string name="cd_export_docx">Export as DOCX</string>
<string name="cd_admin_action">Toggle user block status</string>
<!-- Admin -->
<string name="admin_title">Admin Panel</string>
<string name="block_user">Block</string>
@ -52,4 +65,14 @@
<string name="admin_action_success">Action completed</string>
<string name="admin_action_failed">Action failed</string>
<string name="usage_format">%1$d / %2$d</string>
<!-- Screen reader / empty / loading labels -->
<string name="content_generation_running">Content generation is running</string>
<string name="estimated_time">Estimated: %1$s</string>
<string name="empty_state_title">Nothing here yet</string>
<string name="empty_state_message">Submit a job to see results.</string>
<string name="error_state_title">Something went wrong</string>
<string name="error_state_message">We could not load this screen. Please try again.</string>
<string name="usage_limit_title">Free limit reached</string>
<string name="result_preview">Result preview</string>
</resources>

View File

@ -1,16 +1,92 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.ResBuilder" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<style name="Theme.ResBuilder" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary color roles -->
<item name="colorPrimary">@color/primary</item>
<item name="colorOnPrimary">@color/on_primary</item>
<item name="colorPrimaryContainer">@color/primary_container</item>
<item name="colorOnPrimaryContainer">@color/on_primary_container</item>
<item name="colorPrimaryInverse">@color/inverse_primary</item>
<!-- Secondary color roles -->
<item name="colorSecondary">@color/secondary</item>
<item name="colorOnSecondary">@color/on_secondary</item>
<item name="colorSecondaryContainer">@color/secondary_container</item>
<item name="colorOnSecondaryContainer">@color/on_secondary_container</item>
<!-- Tertiary color roles -->
<item name="colorTertiary">@color/tertiary</item>
<item name="colorOnTertiary">@color/on_tertiary</item>
<item name="colorTertiaryContainer">@color/tertiary_container</item>
<item name="colorOnTertiaryContainer">@color/on_tertiary_container</item>
<!-- Surface color roles -->
<item name="android:colorBackground">@color/surface</item>
<item name="colorSurface">@color/surface</item>
<item name="colorOnSurface">@color/on_surface</item>
<item name="colorSurfaceVariant">@color/surface_variant</item>
<item name="colorOnSurfaceVariant">@color/on_surface_variant</item>
<item name="colorSurfaceContainerLowest">@color/surface_container_lowest</item>
<item name="colorSurfaceContainerLow">@color/surface_container_low</item>
<item name="colorSurfaceContainer">@color/surface_container</item>
<item name="colorSurfaceContainerHigh">@color/surface_container_high</item>
<item name="colorSurfaceContainerHighest">@color/surface_container_highest</item>
<item name="colorSurfaceInverse">@color/inverse_surface</item>
<item name="colorOnSurfaceInverse">@color/inverse_on_surface</item>
<!-- Outline -->
<item name="colorOutline">@color/outline</item>
<item name="colorOutlineVariant">@color/outline_variant</item>
<!-- Error -->
<item name="colorError">@color/error</item>
<item name="colorOnError">@color/on_error</item>
<item name="colorErrorContainer">@color/error_container</item>
<item name="colorOnErrorContainer">@color/on_error_container</item>
<!-- Status and custom semantic color attrs -->
<item name="colorSuccess">@color/success</item>
<item name="colorOnSuccess">@color/on_success</item>
<item name="colorSuccessContainer">@color/success_container</item>
<item name="colorOnSuccessContainer">@color/on_success_container</item>
<item name="colorWarning">@color/warning</item>
<item name="colorOnWarning">@color/on_warning</item>
<item name="colorWarningContainer">@color/warning_container</item>
<item name="colorOnWarningContainer">@color/on_warning_container</item>
<item name="colorInfo">@color/info</item>
<item name="colorOnInfo">@color/on_info</item>
<item name="colorInfoContainer">@color/info_container</item>
<item name="colorOnInfoContainer">@color/on_info_container</item>
<!-- System bars - edge-to-edge ready -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
<!-- M3 Typography and shape defaults inherited from Material3 parent -->
<item name="textAppearanceDisplayLarge">@style/TextAppearance.Material3.DisplayLarge</item>
<item name="textAppearanceDisplayMedium">@style/TextAppearance.Material3.DisplayMedium</item>
<item name="textAppearanceDisplaySmall">@style/TextAppearance.Material3.DisplaySmall</item>
<item name="textAppearanceHeadlineLarge">@style/TextAppearance.Material3.HeadlineLarge</item>
<item name="textAppearanceHeadlineMedium">@style/TextAppearance.Material3.HeadlineMedium</item>
<item name="textAppearanceHeadlineSmall">@style/TextAppearance.Material3.HeadlineSmall</item>
<item name="textAppearanceTitleLarge">@style/TextAppearance.Material3.TitleLarge</item>
<item name="textAppearanceTitleMedium">@style/TextAppearance.Material3.TitleMedium</item>
<item name="textAppearanceTitleSmall">@style/TextAppearance.Material3.TitleSmall</item>
<item name="textAppearanceBodyLarge">@style/TextAppearance.Material3.BodyLarge</item>
<item name="textAppearanceBodyMedium">@style/TextAppearance.Material3.BodyMedium</item>
<item name="textAppearanceBodySmall">@style/TextAppearance.Material3.BodySmall</item>
<item name="textAppearanceLabelLarge">@style/TextAppearance.Material3.LabelLarge</item>
<item name="textAppearanceLabelMedium">@style/TextAppearance.Material3.LabelMedium</item>
<item name="textAppearanceLabelSmall">@style/TextAppearance.Material3.LabelSmall</item>
<!-- Default M3 component styles inherited from Material3 parent; explicit overrides kept to a minimum -->
<item name="materialButtonStyle">@style/Widget.Material3.Button</item>
<item name="materialButtonOutlinedStyle">@style/Widget.Material3.Button.OutlinedButton</item>
<!-- Window background uses surface so app surfaces are always theme-aware -->
<item name="android:windowBackground">?attr/colorSurface</item>
</style>
</resources>