Skip to content

Ux-ui#246

Merged
omeritzics merged 16 commits intomainfrom
ux-ui
Mar 9, 2026
Merged

Ux-ui#246
omeritzics merged 16 commits intomainfrom
ux-ui

Conversation

@omeritzics
Copy link
Owner

@omeritzics omeritzics commented Mar 8, 2026

Summary by CodeRabbit

  • New Features

    • Smoother page transition animations for app navigation.
  • Improvements

    • Consistent, responsive spacing and padding across app lists and headers.
    • Update status shown as a styled chip for clearer metadata.
    • Denser, more consistent grid and list item layout.
  • Localization

    • Added hints and names for many additional app sources and platforms across multiple languages.

@coderabbitai
Copy link

coderabbitai bot commented Mar 8, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Updates UI spacing to Material 3 expressive constants across the apps and settings pages, replaces some SizedBox literals, introduces a SharedAxisTransition-based navigation to AppPage, adds new translation keys for provider names and accessibility hints, and removes automatic lint/format auto-fix steps from CI.

Changes

Cohort / File(s) Summary
Apps page UI & navigation
lib/pages/apps.dart
Replaced many literal SizedBox gaps with M3 spacing constants; increased padding values in loading/no-content and list/grid tiles; replaced "updated" row with a Chip; changed navigation to use PageRouteBuilder + SharedAxisTransition to open AppPage; adjusted FlexibleSpaceBar paddings and responsive grid spacing.
Settings spacing & semantics
lib/pages/settings.dart
Added top-level spacing constants (height8, height16, height32); removed local duplicates; replaced SliderTheme-wrapped slider with plain Slider (calls Slider with year2023: false); updated Semantics hints for footer buttons to use translation keys.
Translations (additions)
assets/translations/en.json, assets/translations/de.json, assets/translations/es.json, assets/translations/fr.json, assets/translations/he.json
Added three hint keys (appSourceHint, appLogsHint, wikiHint) and provider/platform name entries (gitlab, codeberg, izzyondroid, sourcehut, apkcombo, apkpure, aptoide, uptodown, huaweiappgallery, rustore, jenkins, apkmirror, telegramapp, neutroncode, html) across language files.
CI workflow
.github/workflows/ci.yml
Removed auto-fix / format / commit steps that previously ran in CI, eliminating automatic lint/format correction and commit flow.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • Ux UI #245 — Touches lib/pages/settings.dart and updates footer action button semantics/layout; strongly related to the settings footer hint changes.

Poem

🐰 In gutters small and paddings wide,
I hop through grids where chips now hide,
Transitions glide, translations sing,
CI trimmed its trailing string,
A tiny hop — a polished tide. 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Ux-ui' is vague and generic, providing no meaningful information about the specific changes in the changeset. Replace with a descriptive title that captures the main changes, such as 'Implement M3 spacing system and UI refinements' or 'Update app page layout and add new translation keys'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ux-ui

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.

@gemini-code-assist
Copy link

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly refines the user interface and experience by standardizing spacing, improving navigation flows, and modernizing component appearances. It focuses on creating a more consistent and accessible design, particularly within the app listing and settings screens, through the introduction of new spacing constants, updated component styling, and enhanced interactive elements.

Highlights

  • UI Spacing and Consistency: Introduced a comprehensive set of SizedBox constants for various heights and widths, aligning with M3 Expressive spacing principles (4dp baseline grid), and replaced direct SizedBox usages with these new constants across the AppsPage.
  • App Icon Navigation: Implemented navigation to a dedicated AppPage with a SharedAxisTransition when an app icon is tapped, enhancing user interaction and providing a smoother visual experience.
  • Enhanced 'Updated' Status Display: Refactored the visual representation of the 'updated' status for apps from a simple Row with an icon and text to a more modern and themed Chip widget, improving its aesthetic integration.
  • Padding Adjustments: Increased various padding values throughout the AppsPage (e.g., SingleChildScrollView, ListTile, icon paddings) to provide more generous and visually appealing spacing between UI elements.
  • Simplified Slider Styling: Removed the custom SliderTheme wrapping the update interval slider in the SettingsPage, simplifying its styling and potentially aligning it more closely with default Material Design aesthetics.
  • Improved Footer Button Layout and Accessibility: Refactored the persistent footer buttons in the SettingsPage to use an Expanded widget with mainAxisAlignment.spaceEvenly for better distribution, and added Semantics widgets and visualDensity.compact to IconButtons for enhanced accessibility and visual refinement.
Changelog
  • lib/pages/apps.dart
    • Replaced direct SizedBox usages with new height16 constant.
    • Added new SizedBox constants for various heights (20, 28, 40, 48, 56, 64) and widths (8, 12, 20, 24).
    • Updated horizontal padding for SingleChildScrollView from 16 to 20.
    • Modified top padding for 'no apps' message from 8.0 to 12.
    • Implemented navigation to AppPage with SharedAxisTransition on app icon tap.
    • Changed 'updated' status display from a Row to a Chip widget.
    • Adjusted ListTile content padding from horizontal: 20, vertical: 8 to horizontal: 24, vertical: 12.
    • Updated padding for push_pin and circle icons from 8.0 to 12.
    • Replaced const SizedBox(height: 12) with height12 constant.
    • Replaced const SizedBox(height: 8) with height8 constant.
    • Modified horizontal padding for app name from 8.0 to 12.
    • Updated const SizedBox(height: 2) to const SizedBox(height: 4).
    • Adjusted horizontal padding for app author from 8.0 to 12.
    • Replaced const SizedBox(height: 8) with height8 constant.
    • Modified horizontal padding for app description from 8.0 to 12.
    • Updated FlexibleSpaceBar title padding values.
  • lib/pages/settings.dart
    • Removed SliderTheme wrapper from the update interval slider.
    • Added year2023: false parameter to the Slider widget.
    • Refactored persistent footer buttons to use Expanded and mainAxisAlignment.spaceEvenly.
    • Added Semantics widgets with labels and hints to footer IconButtons.
    • Applied visualDensity.compact to footer IconButtons.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces several UI/UX improvements, primarily focused on updating spacing to follow Material 3 guidelines, enhancing visual components like status indicators with Chip widgets, and improving accessibility with Semantics. The changes are generally positive, but there are a couple of critical compilation errors that need to be addressed. Specifically, a spacing constant is used out of its scope in lib/pages/apps.dart, and an invalid parameter year2023 is used on a Slider widget in lib/pages/settings.dart. I've also included a suggestion to improve how constants are defined for better performance and maintainability.

Comment on lines +178 to +196
// M3 Expressive spacing constants (based on 4dp baseline grid)
const height4 = SizedBox(height: 4);
const height8 = SizedBox(height: 8);
const height12 = SizedBox(height: 12);
const height16 = SizedBox(height: 16);
const height20 = SizedBox(height: 20);
const height24 = SizedBox(height: 24);
const height28 = SizedBox(height: 28);
const height32 = SizedBox(height: 32);
const height40 = SizedBox(height: 40);
const height48 = SizedBox(height: 48);
const height56 = SizedBox(height: 56);
const height64 = SizedBox(height: 64);
const width4 = SizedBox(width: 4);
const width6 = SizedBox(width: 6);
const width8 = SizedBox(width: 8);
const width12 = SizedBox(width: 12);
const width16 = SizedBox(width: 16);
const width20 = SizedBox(width: 20);
const width24 = SizedBox(width: 24);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Defining these const spacing widgets inside the build method is not ideal for performance and code organization. It's better to define them outside the build method, for instance, as top-level constants at the beginning of the file. This improves readability and ensures they are only defined once. This would also solve the scope issue with height16 used in showChangeLogDialog (line 65).

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 CI Build Failed

The automated build process failed. Please review the build logs and fix the issues before requesting another review.

Next steps:

  1. Check the build logs for specific errors
  2. Fix the identified issues
  3. Push your fixes to this branch
  4. The CI will automatically re-run

Once the build passes, this review will be dismissed automatically.

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
lib/pages/apps.dart (1)

1587-1587: ⚠️ Potential issue | 🟡 Minor

Unused variable screenHeight.

screenHeight is declared but never used in the responsive grid logic. Remove it to avoid dead code.

🧹 Suggested fix
          final screenWidth = MediaQuery.of(context).size.width;
-          final screenHeight = MediaQuery.of(context).size.height;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` at line 1587, The variable screenHeight declared as
`final screenHeight = MediaQuery.of(context).size.height;` is unused and should
be removed to eliminate dead code; locate this line in the responsive grid logic
(look for `MediaQuery.of(context).size.height` / `screenHeight`) and delete the
declaration so the code compiles without the unused variable warning.
🧹 Nitpick comments (3)
lib/pages/apps.dart (3)

885-885: Inconsistent use of spacing constants.

Line 885 uses a literal const SizedBox(height: 4) while height4 is already defined at line 179. For consistency with the M3 spacing system established in this file, use the predefined constant.

♻️ Suggested fix
-                  const SizedBox(height: 4),
+                  height4,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` at line 885, Replace the literal const SizedBox(height:
4) with the predefined spacing constant height4 to keep spacing consistent with
the M3 system; locate the occurrence of const SizedBox(height: 4) in the
build/layout where spacing is used and swap it to use height4 (the existing
constant defined earlier) so all gaps use the same spacing constants.

958-976: Consider extracting the "Updated" Chip to a reusable widget.

This Chip implementation is nearly identical to lines 594-612, differing only in icon size (14 vs 16) and font size (10 vs 12). Extracting to a parameterized helper would reduce duplication and ensure consistent styling.

♻️ Example extraction
Widget _buildUpdatedChip({double iconSize = 16, double fontSize = 12}) {
  return Chip(
    avatar: Icon(
      Icons.check_circle,
      color: Theme.of(context).colorScheme.primary,
      size: iconSize,
    ),
    label: Text(
      tr('updated'),
      style: TextStyle(
        color: Theme.of(context).colorScheme.primary,
        fontSize: fontSize,
      ),
    ),
    backgroundColor: Theme.of(context).colorScheme.primaryContainer,
    side: BorderSide(
      color: Theme.of(context).colorScheme.primary.withOpacity(0.3),
      width: 1,
    ),
  );
}

Then use _buildUpdatedChip() for horizontal tiles and _buildUpdatedChip(iconSize: 14, fontSize: 10) for grid tiles.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 958 - 976, Extract the duplicated Chip into
a single reusable helper named _buildUpdatedChip that accepts parameters for
iconSize and fontSize (e.g., _buildUpdatedChip({double iconSize = 16, double
fontSize = 12})), use Theme.of(context).colorScheme inside the helper to keep
styling consistent, and replace both inline Chip occurrences (the horizontal
tile and the grid tile) with calls to _buildUpdatedChip() and
_buildUpdatedChip(iconSize: 14, fontSize: 10) respectively; ensure the helper is
defined in the same widget/class scope so it can access the BuildContext.

1711-1715: Minor: Left padding (28) deviates from 4dp grid.

The M3 spacing system uses multiples of 4, but 28 is not a standard value (24 or 32 would be). If this is intentional for visual alignment with the actions area, consider adding a brief comment. Otherwise, 24 may be more consistent.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 1711 - 1715, titlePadding uses const
EdgeInsets.only(left: 28, right: 88, bottom: 24) which violates the M3 4dp grid;
change the left padding to a standard multiple of 4 (preferably 24 or 32) or add
a comment explaining the intentional 28px alignment. Update the EdgeInsets in
the widget where titlePadding is set (reference: titlePadding / EdgeInsets.only)
to use the chosen value and, if keeping 28, add an inline comment clarifying why
it deviates to avoid future regressions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@lib/pages/settings.dart`:
- Around line 1109-1149: The Semantics widgets use hardcoded English hint
strings (e.g., 'Open app source repository', 'Open Updatium wiki documentation',
'View application logs'); replace those hint values with localized calls (use
tr('appSourceHint'), tr('wikiHint'), tr('appLogsHint') or similar keys) in the
Semantics constructors so hint: tr('...') is used consistently alongside label:
tr('...'); then add the corresponding translation keys/values to your locale
resource files so non‑English users get localized accessibility hints.
- Around line 1138-1143: The Transform wrapping the Icon(Icons.help) uses
Matrix4.identity() which does nothing; either remove the Transform entirely
(leave Icon(Icons.help) for both branches) or, if you intended to mirror for RTL
when context.locale.languageCode == 'he', replace the identity matrix with a
horizontal-flip transform (apply a Y-axis flip) so the icon is actually
mirrored; update the branch that currently reads Transform(...
Matrix4.identity() ...) accordingly.

---

Outside diff comments:
In `@lib/pages/apps.dart`:
- Line 1587: The variable screenHeight declared as `final screenHeight =
MediaQuery.of(context).size.height;` is unused and should be removed to
eliminate dead code; locate this line in the responsive grid logic (look for
`MediaQuery.of(context).size.height` / `screenHeight`) and delete the
declaration so the code compiles without the unused variable warning.

---

Nitpick comments:
In `@lib/pages/apps.dart`:
- Line 885: Replace the literal const SizedBox(height: 4) with the predefined
spacing constant height4 to keep spacing consistent with the M3 system; locate
the occurrence of const SizedBox(height: 4) in the build/layout where spacing is
used and swap it to use height4 (the existing constant defined earlier) so all
gaps use the same spacing constants.
- Around line 958-976: Extract the duplicated Chip into a single reusable helper
named _buildUpdatedChip that accepts parameters for iconSize and fontSize (e.g.,
_buildUpdatedChip({double iconSize = 16, double fontSize = 12})), use
Theme.of(context).colorScheme inside the helper to keep styling consistent, and
replace both inline Chip occurrences (the horizontal tile and the grid tile)
with calls to _buildUpdatedChip() and _buildUpdatedChip(iconSize: 14, fontSize:
10) respectively; ensure the helper is defined in the same widget/class scope so
it can access the BuildContext.
- Around line 1711-1715: titlePadding uses const EdgeInsets.only(left: 28,
right: 88, bottom: 24) which violates the M3 4dp grid; change the left padding
to a standard multiple of 4 (preferably 24 or 32) or add a comment explaining
the intentional 28px alignment. Update the EdgeInsets in the widget where
titlePadding is set (reference: titlePadding / EdgeInsets.only) to use the
chosen value and, if keeping 28, add an inline comment clarifying why it
deviates to avoid future regressions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0321ff13-fd0f-4f10-ac0d-baade44c992c

📥 Commits

Reviewing files that changed from the base of the PR and between b45c53f and 534f232.

📒 Files selected for processing (2)
  • lib/pages/apps.dart
  • lib/pages/settings.dart

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
assets/translations/de.json (1)

96-99: ⚠️ Potential issue | 🟡 Minor

Several keys remain untranslated (still in English).

The following keys at lines 96-99 and 144-147 are still in English: failedToExport, exportAlreadyInProgress, failedToCreateExportFile, exportDirNotAccessible, networkError, invalidUrlFormat, accessDenied, importFailed. These should be translated to German.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/de.json` around lines 96 - 99, The JSON file contains
untranslated English strings; replace the values for the keys failedToExport,
exportAlreadyInProgress, failedToCreateExportFile, exportDirNotAccessible,
networkError, invalidUrlFormat, accessDenied, and importFailed with their
correct German translations (e.g., "Export fehlgeschlagen", "Export bereits im
Gange", "Exportdatei konnte nicht erstellt werden", "Exportverzeichnis ist nicht
zugänglich", "Netzwerkfehler", "Ungültiges URL-Format", "Zugriff verweigert",
"Import fehlgeschlagen") so the de.json localization is fully in German and keys
remain unchanged.
lib/pages/settings.dart (1)

1216-1224: ⚠️ Potential issue | 🟠 Major

Missing filterDays translation key.

The tr('filterDays') call at line 1222 references a translation key that doesn't exist in any of the translation files. This will display the raw key string or cause a translation error at runtime.

Add the filterDays key to all translation files:

  • en.json: "filterDays": "Filter by days"
  • es.json: "filterDays": "Filtrar por días"
  • de.json: "filterDays": "Nach Tagen filtern"
  • fr.json: "filterDays": "Filtrer par jours"
  • he.json: "filterDays": "סינון לפי ימים"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/settings.dart` around lines 1216 - 1224, The TextField uses
tr('filterDays') which is missing from the translation bundles; add the
"filterDays" key with the provided localized values to each translation file
(en.json, es.json, de.json, fr.json, he.json) so tr('filterDays') resolves
correctly—update en.json to "filterDays": "Filter by days", es.json to
"filterDays": "Filtrar por días", de.json to "filterDays": "Nach Tagen filtern",
fr.json to "filterDays": "Filtrer par jours", and he.json to "filterDays":
"סינון לפי ימים".
assets/translations/es.json (1)

96-99: ⚠️ Potential issue | 🟡 Minor

Several keys remain untranslated (still in English).

The following keys at lines 96-99 and 144-147 are still in English and should be translated to Spanish: failedToExport, exportAlreadyInProgress, failedToCreateExportFile, exportDirNotAccessible, networkError, invalidUrlFormat, accessDenied, importFailed.

This may also be contributing to the pipeline failure for missing translation keys.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/es.json` around lines 96 - 99, Update the Spanish
translation file by replacing the English values for the translation keys
failedToExport, exportAlreadyInProgress, failedToCreateExportFile,
exportDirNotAccessible and the keys networkError, invalidUrlFormat,
accessDenied, importFailed with proper Spanish translations (i.e., modify the
values for these keys in assets/translations/es.json), save the file, and run
the translations/checks to ensure no missing keys remain; target the string
entries for these exact keys so automated pipelines pick up the changes.
assets/translations/he.json (1)

78-78: ⚠️ Potential issue | 🟡 Minor

Extensive untranslated English strings in Hebrew locale.

This file contains many keys still in English that should be translated to Hebrew. Notable examples include:

  • Line 78: installStatusOfXWillBeResetExplanation
  • Lines 96-99: Export-related errors
  • Lines 144-147: Network/import errors
  • Lines 154, 156, 161, 167, 171, 173: Various notification descriptions
  • Lines 215, 220, 235, 242, 246: Explanation texts
  • Lines 252-253, 264, 273-276, 282, 284, 286: Various settings labels
  • Lines 292-296, 302-303, 306, 310, 321, 328, 331, 333-334: More settings
  • Lines 360-365, 367, 370-373: Documentation and warning texts
  • Lines 384-392, 420-422: Pluralized messages
  • Lines 441-442, 450-451: Certificate and plural forms

This incomplete translation significantly impacts Hebrew-speaking users. Consider prioritizing translation of user-facing strings.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/he.json` at line 78, Several user-facing entries in the
Hebrew locale remain in English and must be translated into Hebrew; update the
values for keys such as installStatusOfXWillBeResetExplanation and the listed
export/import/network/notification/setting/documentation/certificate keys (e.g.,
the export-related error keys around lines 96-99, network/import errors around
144-147, notification descriptions at 154/156/161/167/171/173, the explanation
keys at 215/220/235/242/246, settings labels around 252-286/292-334,
documentation/warning texts at 360-373, pluralized messages at 384-422, and
certificate/plural forms at 441-451) with proper Hebrew translations; preserve
existing placeholders, newline escapes (\n), and pluralization patterns exactly
as in the English originals, and ensure no key names or JSON structure are
changed.
assets/translations/fr.json (1)

96-99: ⚠️ Potential issue | 🟡 Minor

Several keys remain untranslated (still in English).

The following keys at lines 96-99 and 144-147 are still in English: failedToExport, exportAlreadyInProgress, failedToCreateExportFile, exportDirNotAccessible, networkError, invalidUrlFormat, accessDenied, importFailed. These should be translated to French.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/fr.json` around lines 96 - 99, Replace the untranslated
English values for the listed translation keys with their French equivalents:
update "failedToExport", "exportAlreadyInProgress", "failedToCreateExportFile",
"exportDirNotAccessible", "networkError", "invalidUrlFormat", "accessDenied",
and "importFailed" in the translations file so each key maps to the correct
French string (e.g., "failedToExport" -> "Échec de l'exportation",
"exportAlreadyInProgress" -> "Exportation déjà en cours",
"failedToCreateExportFile" -> "Échec de la création du fichier d'export",
"exportDirNotAccessible" -> "Le répertoire d'exportation n'est pas accessible",
"networkError" -> "Erreur réseau", "invalidUrlFormat" -> "Format d'URL
invalide", "accessDenied" -> "Accès refusé", "importFailed" -> "Échec de
l'importation"); ensure proper JSON string escaping and consistent punctuation
with surrounding entries.
assets/translations/en.json (1)

1-447: ⚠️ Potential issue | 🟠 Major

Add missing filterDays translation key to translation files.

The code references tr('filterDays') in settings.dart at line 1222 within the LogsDialog widget, but this key is not defined in any translation file. Add the translation key with an appropriate label for the logs filtering dialog.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/translations/en.json` around lines 1 - 447, The translation file is
missing the "filterDays" key referenced by tr('filterDays') in settings.dart
inside the LogsDialog widget; add a new top-level entry "filterDays": "Filter
days" (or another suitable short label) to the en.json translations so the
LogsDialog can display the filter label without falling back to a missing key
error.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@assets/translations/de.json`:
- Around line 96-99: The JSON file contains untranslated English strings;
replace the values for the keys failedToExport, exportAlreadyInProgress,
failedToCreateExportFile, exportDirNotAccessible, networkError,
invalidUrlFormat, accessDenied, and importFailed with their correct German
translations (e.g., "Export fehlgeschlagen", "Export bereits im Gange",
"Exportdatei konnte nicht erstellt werden", "Exportverzeichnis ist nicht
zugänglich", "Netzwerkfehler", "Ungültiges URL-Format", "Zugriff verweigert",
"Import fehlgeschlagen") so the de.json localization is fully in German and keys
remain unchanged.

In `@assets/translations/en.json`:
- Around line 1-447: The translation file is missing the "filterDays" key
referenced by tr('filterDays') in settings.dart inside the LogsDialog widget;
add a new top-level entry "filterDays": "Filter days" (or another suitable short
label) to the en.json translations so the LogsDialog can display the filter
label without falling back to a missing key error.

In `@assets/translations/es.json`:
- Around line 96-99: Update the Spanish translation file by replacing the
English values for the translation keys failedToExport, exportAlreadyInProgress,
failedToCreateExportFile, exportDirNotAccessible and the keys networkError,
invalidUrlFormat, accessDenied, importFailed with proper Spanish translations
(i.e., modify the values for these keys in assets/translations/es.json), save
the file, and run the translations/checks to ensure no missing keys remain;
target the string entries for these exact keys so automated pipelines pick up
the changes.

In `@assets/translations/fr.json`:
- Around line 96-99: Replace the untranslated English values for the listed
translation keys with their French equivalents: update "failedToExport",
"exportAlreadyInProgress", "failedToCreateExportFile", "exportDirNotAccessible",
"networkError", "invalidUrlFormat", "accessDenied", and "importFailed" in the
translations file so each key maps to the correct French string (e.g.,
"failedToExport" -> "Échec de l'exportation", "exportAlreadyInProgress" ->
"Exportation déjà en cours", "failedToCreateExportFile" -> "Échec de la création
du fichier d'export", "exportDirNotAccessible" -> "Le répertoire d'exportation
n'est pas accessible", "networkError" -> "Erreur réseau", "invalidUrlFormat" ->
"Format d'URL invalide", "accessDenied" -> "Accès refusé", "importFailed" ->
"Échec de l'importation"); ensure proper JSON string escaping and consistent
punctuation with surrounding entries.

In `@assets/translations/he.json`:
- Line 78: Several user-facing entries in the Hebrew locale remain in English
and must be translated into Hebrew; update the values for keys such as
installStatusOfXWillBeResetExplanation and the listed
export/import/network/notification/setting/documentation/certificate keys (e.g.,
the export-related error keys around lines 96-99, network/import errors around
144-147, notification descriptions at 154/156/161/167/171/173, the explanation
keys at 215/220/235/242/246, settings labels around 252-286/292-334,
documentation/warning texts at 360-373, pluralized messages at 384-422, and
certificate/plural forms at 441-451) with proper Hebrew translations; preserve
existing placeholders, newline escapes (\n), and pluralization patterns exactly
as in the English originals, and ensure no key names or JSON structure are
changed.

In `@lib/pages/settings.dart`:
- Around line 1216-1224: The TextField uses tr('filterDays') which is missing
from the translation bundles; add the "filterDays" key with the provided
localized values to each translation file (en.json, es.json, de.json, fr.json,
he.json) so tr('filterDays') resolves correctly—update en.json to "filterDays":
"Filter by days", es.json to "filterDays": "Filtrar por días", de.json to
"filterDays": "Nach Tagen filtern", fr.json to "filterDays": "Filtrer par
jours", and he.json to "filterDays": "סינון לפי ימים".

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ab3fbb82-0a4f-4b94-b470-6c478e74d3f8

📥 Commits

Reviewing files that changed from the base of the PR and between 534f232 and f708cc3.

📒 Files selected for processing (6)
  • assets/translations/de.json
  • assets/translations/en.json
  • assets/translations/es.json
  • assets/translations/fr.json
  • assets/translations/he.json
  • lib/pages/settings.dart

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Line 85: Replace the branch input value that currently uses github.head_ref
with a fallback expression so manual workflow_dispatch runs get a valid branch;
change the action input that sets branch: ${{ github.head_ref }} to use the
combined expression ${{ github.head_ref || github.ref_name }} (so
stefanzweifel/git-auto-commit-action@v7 receives the PR head branch for
pull_request events and the dispatch branch for manual runs).

In @.github/workflows/nightly.yml:
- Line 61: The workflow uses branch: ${{ github.head_ref }} which is empty for
push and workflow_dispatch events; update that setting to use github.ref_name
instead so the auto-commit step targets the correct branch for both push and
manual runs (replace the branch: ${{ github.head_ref }} occurrence with branch:
${{ github.ref_name }} in the job configuration).

In @.github/workflows/release.yml:
- Line 61: The workflow uses github.head_ref for the auto-commit branch (the
`branch: ${{ github.head_ref }}` entry), but `workflow_dispatch` does not set
github.head_ref; update that branch reference to use github.ref_name instead so
the auto-commit step has a valid branch target when the workflow runs via
`workflow_dispatch`.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 939d3501-5fe5-47cb-b6cb-cabf5b2c67d3

📥 Commits

Reviewing files that changed from the base of the PR and between f708cc3 and 9ec405a.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • .github/workflows/nightly.yml
  • .github/workflows/release.yml

omeritzics and others added 3 commits March 8, 2026 23:46
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Removed auto-fix linting and formatting steps from CI workflow.
@github-actions github-actions bot dismissed their stale review March 8, 2026 22:03

CI Build Passed - Automatically dismissing previous rejection as the build now succeeds.

Replaced Chip widget with Row widget for updated status display.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (5)
lib/pages/apps.dart (5)

513-540: Inconsistent navigation transitions between onTap and onLongPress.

The onTap handler uses SharedAxisTransition (lines 513-528), but onLongPress (lines 534-539) still uses a plain MaterialPageRoute. Both navigate to the same AppPage destination. Consider unifying the transition behavior for consistency.

♻️ Proposed fix to unify transitions

Extract a helper method or apply the same transition to both:

         onLongPress: () {
           Navigator.push(
             context,
-            MaterialPageRoute(
-              builder: (context) => AppPage(appId: listedApps[appIndex].app.id),
+            PageRouteBuilder(
+              pageBuilder: (context, animation, secondaryAnimation) =>
+                  AppPage(appId: listedApps[appIndex].app.id),
+              transitionsBuilder:
+                  (context, animation, secondaryAnimation, child) {
+                return SharedAxisTransition(
+                  animation: animation,
+                  secondaryAnimation: secondaryAnimation,
+                  transitionType: SharedAxisTransitionType.horizontal,
+                  child: child,
+                );
+              },
             ),
           );
         },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 513 - 540, The onTap navigation uses a
PageRouteBuilder with SharedAxisTransition while onLongPress uses
MaterialPageRoute, causing inconsistent transitions; update onLongPress to use
the same PageRouteBuilder + SharedAxisTransition targeting AppPage(appId:
listedApps[appIndex].app.id) (or extract a helper like buildAppPageRoute(appId)
that returns the PageRouteBuilder and use it in both onTap and onLongPress) so
both Navigator.push calls produce identical animated transitions.

885-885: Inconsistent use of spacing constant.

Line 885 uses const SizedBox(height: 4) directly instead of the height4 constant defined at line 179. For consistency with the M3 spacing system approach used elsewhere in this widget, consider using the constant.

♻️ Proposed fix
-                  const SizedBox(height: 4),
+                  height4,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` at line 885, Replace the literal const SizedBox(height:
4) with the existing height4 spacing constant to keep spacing consistent with
the M3 spacing system; locate the widget tree where const SizedBox(height: 4) is
used (near the AppsPage/Apps widget group) and swap it to use height4 so the
code uses the predefined spacing constant defined earlier (height4).

808-814: Grid view navigation uses different transition than list view.

The grid tile's onTap handler (lines 808-814) uses a plain MaterialPageRoute, while the horizontal list tile (lines 659-674) uses SharedAxisTransition. This creates an inconsistent navigation experience between grid and list views. Consider applying the same transition to both for visual consistency.

♻️ Proposed fix to use SharedAxisTransition
           } else {
             Navigator.push(
               context,
-              MaterialPageRoute(
-                builder: (context) =>
-                    AppPage(appId: listedApps[index].app.id),
+              PageRouteBuilder(
+                pageBuilder: (context, animation, secondaryAnimation) =>
+                    AppPage(appId: listedApps[index].app.id),
+                transitionsBuilder:
+                    (context, animation, secondaryAnimation, child) {
+                  return SharedAxisTransition(
+                    animation: animation,
+                    secondaryAnimation: secondaryAnimation,
+                    transitionType: SharedAxisTransitionType.horizontal,
+                    child: child,
+                  );
+                },
               ),
             );
           }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 808 - 814, The grid tap currently navigates
using Navigator.push with MaterialPageRoute (see MaterialPageRoute,
Navigator.push, AppPage) causing a different transition than the horizontal list
which uses SharedAxisTransition; update the grid tile's onTap navigation to wrap
AppPage in the same SharedAxisTransition-based route as the list (use a
PageRouteBuilder or the same route builder used by the list) so the push uses
the shared-axis animation variant and duration/options match the horizontal
list's implementation; ensure you replace MaterialPageRoute with the same
route-building logic and reference the existing SharedAxisTransition usage so
both grid and list use identical transitions.

178-196: Several spacing constants appear unused in this file.

Constants like height20, height28, height40, height48, height56, height64, width8, width12, width20, width24 are declared but don't appear to be used within this file. Consider either:

  1. Moving these to a shared constants file if they're part of a design system used across the app
  2. Removing unused constants to reduce clutter
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 178 - 196, Several spacing constants
(height20, height28, height40, height48, height56, height64, width8, width12,
width20, width24) are declared but unused here; either remove them from
lib/pages/apps.dart or move them into a shared spacing constants file (e.g.,
spacing.dart) that exports common SizedBox constants. To fix: search the repo
for usages of those symbols, and if used across multiple files create a shared
constants file (export it where needed) and import it into this file, otherwise
delete the unused constant declarations from apps.dart to reduce clutter.

1708-1712: Minor inconsistency with 4dp baseline grid.

The comment at line 178 mentions "M3 Expressive spacing constants (based on 4dp baseline grid)", but left: 28 doesn't align to this grid (28 is not divisible by 4). Consider using 24 or 32 for consistency with the spacing system, unless 28 is intentional for visual alignment with specific elements.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/pages/apps.dart` around lines 1708 - 1712, The titlePadding left value
(titlePadding: const EdgeInsets.only(left: 28, ...)) breaks the 4dp baseline
grid; change the left: 28 to a 4dp-grid-aligned value (e.g., left: 24 or left:
32) in the widget/property that sets titlePadding so it matches the "M3
Expressive spacing constants" mentioned in the comment, unless 28 was
intentionally chosen for a specific visual alignment—if so, add an inline
comment explaining the exception.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@lib/pages/apps.dart`:
- Around line 513-540: The onTap navigation uses a PageRouteBuilder with
SharedAxisTransition while onLongPress uses MaterialPageRoute, causing
inconsistent transitions; update onLongPress to use the same PageRouteBuilder +
SharedAxisTransition targeting AppPage(appId: listedApps[appIndex].app.id) (or
extract a helper like buildAppPageRoute(appId) that returns the PageRouteBuilder
and use it in both onTap and onLongPress) so both Navigator.push calls produce
identical animated transitions.
- Line 885: Replace the literal const SizedBox(height: 4) with the existing
height4 spacing constant to keep spacing consistent with the M3 spacing system;
locate the widget tree where const SizedBox(height: 4) is used (near the
AppsPage/Apps widget group) and swap it to use height4 so the code uses the
predefined spacing constant defined earlier (height4).
- Around line 808-814: The grid tap currently navigates using Navigator.push
with MaterialPageRoute (see MaterialPageRoute, Navigator.push, AppPage) causing
a different transition than the horizontal list which uses SharedAxisTransition;
update the grid tile's onTap navigation to wrap AppPage in the same
SharedAxisTransition-based route as the list (use a PageRouteBuilder or the same
route builder used by the list) so the push uses the shared-axis animation
variant and duration/options match the horizontal list's implementation; ensure
you replace MaterialPageRoute with the same route-building logic and reference
the existing SharedAxisTransition usage so both grid and list use identical
transitions.
- Around line 178-196: Several spacing constants (height20, height28, height40,
height48, height56, height64, width8, width12, width20, width24) are declared
but unused here; either remove them from lib/pages/apps.dart or move them into a
shared spacing constants file (e.g., spacing.dart) that exports common SizedBox
constants. To fix: search the repo for usages of those symbols, and if used
across multiple files create a shared constants file (export it where needed)
and import it into this file, otherwise delete the unused constant declarations
from apps.dart to reduce clutter.
- Around line 1708-1712: The titlePadding left value (titlePadding: const
EdgeInsets.only(left: 28, ...)) breaks the 4dp baseline grid; change the left:
28 to a 4dp-grid-aligned value (e.g., left: 24 or left: 32) in the
widget/property that sets titlePadding so it matches the "M3 Expressive spacing
constants" mentioned in the comment, unless 28 was intentionally chosen for a
specific visual alignment—if so, add an inline comment explaining the exception.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0259ceee-0933-4dec-9f3d-187f856b3298

📥 Commits

Reviewing files that changed from the base of the PR and between 1e36a72 and 907c898.

📒 Files selected for processing (1)
  • lib/pages/apps.dart

@omeritzics omeritzics merged commit 1d64668 into main Mar 9, 2026
10 of 11 checks passed
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