Skip to content

feat: bundle Geist fonts locally and add F-Droid metadata (Option B) - #51

Merged
Devasy merged 1 commit into
Revamp-of-UIfrom
option-b-bundle-fonts-fdroid-metadata
Jun 16, 2026
Merged

feat: bundle Geist fonts locally and add F-Droid metadata (Option B)#51
Devasy merged 1 commit into
Revamp-of-UIfrom
option-b-bundle-fonts-fdroid-metadata

Conversation

@Devasy

@Devasy Devasy commented Jun 16, 2026

Copy link
Copy Markdown
Owner
  • Remove google_fonts dependency; replace with bundled variable font files (Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed)
  • Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:) across 31 dart files β€” no runtime Google CDN fetch, F-Droid build-compatible
  • Declare fonts in pubspec.yaml flutter.fonts section
  • Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet) and auto-update config for F-Droid submission

- Remove google_fonts dependency; replace with bundled variable font files
  (Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed)
- Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:)
  across 31 dart files β€” no runtime Google CDN fetch, F-Droid build-compatible
- Declare fonts in pubspec.yaml flutter.fonts section
- Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet)
  and auto-update config for F-Droid submission

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

βš™οΈ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 94e34c24-5367-4347-aa52-65e6443c2baa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • πŸ” Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Devasy
Devasy merged commit 7126bc6 into Revamp-of-UI Jun 16, 2026
3 checks passed
@Devasy
Devasy deleted the option-b-bundle-fonts-fdroid-metadata branch June 16, 2026 17:29
Devasy added a commit that referenced this pull request Jun 16, 2026
* feat: add workout summary screen and enhance app theme colors

- Implemented WorkoutSummaryScreen to display post-workout details including duration, volume, sets, and exercises.
- Added visual elements such as trophy header and muscle groups trained section.
- Refactored AppTheme to centralize color management through AppColors, improving maintainability and consistency across the app.
- Updated theme properties for better visual coherence and modern styling.

* feat: add predictive back page transitions for Android in AppTheme

* Refactor Programs Screen and add Week Structure Editor

- Updated ProgramsScreen to improve UI elements and replace AppTheme with AppColors.
- Enhanced FloatingActionButton styles and added new RFWidgets for better consistency.
- Implemented a new ProgramWeekEditorStep widget for editing week structures in training programs.
- Introduced ProgramWeekTile for displaying collapsible week cards in ProgramDetailScreen.
- Added functionality for managing deload weeks and intensity factors within the week editor.
- Improved overall code organization and readability across the modified files.

* feat: Enhance UI with new glassmorphic components and charts

- Introduced `GlassCard` with gradient background and accent border option.
- Added `AmbientGlow` for decorative ambient effects.
- Implemented `RFNavBar` for a custom bottom navigation bar with glassmorphism.
- Created `Sparkline` and `VolumeChart` widgets for data visualization.
- Developed `WheelPickerField` for weight and reps input with haptic feedback.
- Updated `WorkoutHeader` with gradient background and improved text styles.
- Refined `AppTheme` with new color definitions and text styles using Google Fonts.
- Added Google Fonts dependency for enhanced typography.

* feat: add personal records feature

- Introduced PersonalRecord model to track best weight, reps, and volume for exercises.
- Implemented PRManager to manage personal records, including checking and updating records after workouts.
- Added methods in storage service for saving and retrieving personal records.
- Updated UI to display personal records in the Analytics screen and Workout Summary screen.
- Enhanced onboarding process to prompt for user name and handle version updates.
- Refactored various screens to improve layout and user experience.

* feat: update exercise library screen tests with new icon and text changes

* feat: update .gitignore and CLAUDE.md for new graphify output and project guidelines; remove MainActivity.kt

* analytics_screen.dart

_FrequencyGrid: added w >= 0 && guard so future-dated sessions can't insert negative map keys
_MuscleVolumeChart: early-return isEmpty when maxVol == 0 (prevents NaN); converted volume display via settings.toDisplay + settings.unitLabel
dashboard_widgets.dart

startOfWeek now truncated to midnight (DateTime(y,m,d)) before subtracting weekdays β€” fixes the bug where sessions earlier in the day than "now" were excluded
Volume StatGridCard now uses settings.toDisplay(weeklyVolume) and 'Volume (${settings.unitLabel})'
edit_workout_session_screen.dart

drops: s.drops?.toList() β€” defensive copy prevents shared-mutation with the original WorkoutSession
exercise_details_sheet.dart

Added else branch on delete failure β€” shows error SnackBar instead of silently doing nothing
Set chips now use settings.toDisplay(s.weight) + settings.unitLabel
Growth trend label uses settings.toDisplay(growthModel.slope) + settings.unitLabel
exercise_input_section.dart

Icon(Icons.auto_awesome_rounded, …) β†’ const Icon(…)
exercise_progress_view.dart

DropdownButton.value guarded with ids.contains(selected) ? selected : null β€” prevents assert/crash when the selected exercise id is no longer in the performed set
profile_sections.dart

const _SectionDivider() and const _ComingSoonBadge() constructors + all call sites updated
rf_inputs.dart

Added onLongPressEnd to _StepButton (wired to GestureDetector.onLongPressEnd)
_NumberPickerSheetState now holds Timer? _holdTimer; onLongPress assigns _holdTimer = Timer.periodic(…), onLongPressEnd cancels it, dispose() also cancels it β€” no more leaked timers
session_details_sheet.dart

Volume banner: settings.toDisplay(session.totalVolume) + 'Volume ${settings.unitLabel}'
Per-exercise total: settings.toDisplay(log.totalVolume) + settings.unitLabel
Per-set row: settings.toDisplay(set.weight) formatted + settings.unitLabel
targets_tab.dart

Added _isSubmitting bool; _submit guards against re-entry and wraps provider call in try/finally; GlowButton.onPressed is null while submitting
workout_flow_screen.dart

_toggleDropset: weight controller text now uses settings.toDisplay(_currentWeight) with proper decimal formatting (matching _loadLastSessionData)
_addDrop: new drop controller text also uses settings.toDisplay(newWeight)
WorkoutHeader now receives restSeconds: _restSeconds
workout_header.dart

Added optional restSeconds field (defaults to 90 for backwards compatibility); _OptionsMenu receives widget.restSeconds instead of the hardcoded literal
workout_summary_screen.dart

volStr built from settings.toDisplay(session.totalVolume); label updated to 'Volume (${settings.unitLabel})'

* feat: enhance UI components and improve data handling across screens

* feat: update ExerciseLibraryScreen tests to include SettingsProvider in widget setup

* feat: enhance workout session data collection by including weight in HealthConnectService

* feat: update Android build configuration, enhance analytics screen, and improve UI components

* feat: add muscle recovery and growth tracking features in WorkoutProvider and MLService

* feat: refactor NumberInputCard to StatefulWidget and enhance RFNavBar design

* feat: enhance ProfileScreen and ProfileSections with Google Fonts for improved typography

* feat: update Create button in ProgramsScreen to allow for non-full width display

* feat: Integrate Gemini AI features for personalized coaching and insights

- Added GeminiService for AI integration, including chat and program generation capabilities.
- Implemented GeminiContextBuilder to create context strings for AI prompts.
- Introduced _WeeklyInsightsCard to display weekly insights based on user workouts.
- Added AiSettingsSection in profile settings for managing Gemini API key and model selection.
- Updated home screen to include weekly insights and AI coach button.
- Enhanced ProgramsScreen with AI program generator button.
- Updated SettingsProvider to manage Gemini API key and insights storage.
- Added necessary dependencies for Google Generative AI.

* feat: enhance various screens and models with improved error handling, UI adjustments, and new features

* feat: improve error handling in program saving and adjust opacity calculation in body heatmap

* Add comprehensive tests for MLService, model serialization, PRManager, and WorkoutProvider

- Implement tests for MLService covering growth model training, set recommendations, default recommendations, target completion prediction, and muscle recovery score computation.
- Create model serialization tests for WorkoutSet, ExerciseLog, WorkoutSession, Exercise, MuscleGroup, Target, GrowthModel, Routine, PersonalRecord, TrainingProgram, and ProgramExerciseSlot to ensure data integrity during JSON serialization/deserialization.
- Introduce tests for PRManager to validate loading records, backfilling from sessions, checking and updating personal records, and retrieving records.
- Enhance WorkoutProvider tests to verify initialization, session and routine loading, active workout management, and exercise name retrieval.

* fix: ensure opacity calculation in heatmap drawing is explicitly a double

* chore: update version to 2.0.0+21 in pubspec.yaml

* feat: enhance UI responsiveness with layout adjustments and breakpoints across multiple screens

* feat: enhance UI layout and responsiveness with padding adjustments for floating action buttons and improved data representation

* feat: add advanced metrics toggle and display estimated 1RM badge in workout input section

* Add widget tests for AnalyticsScreen and ExerciseProgressView

- Implement comprehensive widget tests for the AnalyticsScreen, covering the Overview, Targets, and Records tabs.
- Validate functionality such as tab switching, data display, and interaction with UI elements.
- Add widget tests for ExerciseProgressView, including exercise picker, chart mode toggle, and set progression chart.
- Ensure tests cover empty states, search functionality, and interaction with various UI components.

* feat: update app label handling and improve navigation in home screen

* feat: Implement Gemini AI service for AI coach functionality (#49)

* feat: Implement Gemini AI service for AI coach functionality

- Added GeminiAiService to handle AI coach chat, program generation, and insights using Google Generative AI.
- Created IAiService interface to define the contract for AI services.
- Developed GeminiContextBuilder to construct context for AI interactions.
- Introduced ConversationManager to manage AI conversations, including persistence and active conversation logic.
- Implemented storage service methods for saving and retrieving AI conversations.
- Built AiCoachViewModel to orchestrate AI interactions and manage conversation state.
- Added unit tests for AiCoachViewModel, CoachToolService, and ConversationManager to ensure functionality and persistence.
- Updated analytics and exercise progress views to use the new GeminiAiService.

* feat: Enhance Gemini AI service with token usage tracking and UI updates for AI coach

* feat: Refactor AiCoachViewModel and related services for improved readability and error handling

* feat: Improve error handling and async behavior in Gemini AI service usage tracking

---------

Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>

* feat: Add muscle volume trend chart and recent sessions section in MuscleDetailSheet

* docs: add conversational routine optimizer design spec

Replaces the one-shot optimizer sheet with a dedicated conversational
optimizer screen that reuses the coach streaming tool-loop, adds an
interactive ask_user_questions tool, gates on insufficient data, and
persists sessions to a separate optimizer inbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor: remove one-shot routine optimizer (replaced by conversational flow)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add Conversation.kind and AI question models (QuestionSpec, AnswerSpec, PendingQuestions)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: scope ConversationManager by kind ('coach' | 'optimizer')

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add ask_user_questions tool declaration and optimizer system prompt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add RFQuestionCard reusable widget (option chips + custom input)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: rewrite RoutineOptimizerViewModel as conversational streaming VM with ask_user_questions pausing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: handle aborted completer and await appendMessage in submitAnswers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add RoutineOptimizerScreen (conversational UI with question card + history inbox)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* style: fix magic padding values and header button consistency in RoutineOptimizerScreen

* feat: add data gate (<3 sessions) and navigate to RoutineOptimizerScreen from routine card

* feat: add testBody method for RoutineOptimizerScreen to facilitate widget testing

* feat: add workout summary screen and enhance app theme colors (#50)

feat: add workout summary screen, health analytics, and production APK signing

- Workout summary screen with session details
- Sleep HR chart and debug log buffer  
- HealthHistoryManager for sleep/heart rate data
- Workout heart rate analysis and recovery metrics
- EC P-256 production keystore signing via GitHub Secrets
- Split-per-ABI APK builds for arm64, armeabi-v7a, x86_64
- FUTURE_IMPROVEMENTS.md documenting Options B & C (F-Droid, fastlane)

* test: update lastNightSleep test to sum all periods in the night window

* feat: bundle Geist fonts locally and add F-Droid metadata (Option B) (#51)

- Remove google_fonts dependency; replace with bundled variable font files
  (Geist-Variable.ttf + GeistMono-Variable.ttf from Vercel v1.7.2, MIT licensed)
- Replace all 377 GoogleFonts.geist/geistMono() calls with TextStyle(fontFamily:)
  across 31 dart files β€” no runtime Google CDN fetch, F-Droid build-compatible
- Declare fonts in pubspec.yaml flutter.fonts section
- Add fdroid/metadata/com.devasy.repforge.yml with anti-features (NonFreeNet)
  and auto-update config for F-Droid submission

Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Devasy Patel <110348311+Devasy23@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@Devasy
Devasy restored the option-b-bundle-fonts-fdroid-metadata branch June 16, 2026 19:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant