Skip to content

Not working -> Working?#350

Closed
omeritzics wants to merge 17 commits into
workingfrom
not-working
Closed

Not working -> Working?#350
omeritzics wants to merge 17 commits into
workingfrom
not-working

Conversation

@omeritzics
Copy link
Copy Markdown
Owner

@omeritzics omeritzics commented May 27, 2026

Summary by CodeRabbit

  • New Features

    • Installed apps browser added to Add App flow
    • APK file size displayed on app details
  • Improvements

    • More reliable split/XAPK selection for varied devices and densities
    • Translation placeholders standardized across many languages
    • Safer Android edge‑to‑edge handling and more robust loading indicators
    • Logs and related UI now update reactively
    • App version and dependency updates in release
  • Bug Fixes

    • Avoided crashes when device info is unavailable
  • Documentation

    • README wording and feature list updated

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 27, 2026

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

Review profile: CHILL

Plan: Pro

Run ID: 5c61b22a-1df3-409f-9f72-a1d67ba130c1

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
📝 Walkthrough

Walkthrough

Replace slang helpers with a new bridge and plural helper; normalize translation placeholders to named ICU variables across locales; update imports and many UI widgets; improve provider reactivity and APK selection; tweak app sources; and adjust CI/workflow and dependency configuration.

Changes

Localization and App Infrastructure Upgrade

Layer / File(s) Summary
Slang converter and plural helper
lib/services/slang_converter.dart, lib/services/slang-converter.dart
Add slang_converter.dart (t(), plural(), String.t extension) and remove old re-exports/helpers.
Translation placeholder normalization
assets/translations/*.json
Replace anonymous {} placeholders with named ICU variables ({count}, {app}, {error}) across pluralized messages and retry/notification blocks.
Import path updates
lib/app_sources/*, lib/components/*, lib/pages/*, lib/providers/*, lib/services/*
Mass update from slang-converter.dart to slang_converter.dart and adapt callers to the new bridge.
UI modernization & page features
lib/pages/app.dart, lib/pages/add_app.dart, lib/pages/apps.dart, lib/pages/settings.dart, lib/pages/import_export.dart, lib/pages/safe_mode_dialog.dart
Replace M3E progress widgets with Flutter defaults, show APK file size via HEAD, add installed-apps picker, inject default form values, simplify dialogs, and remove OpenSourcePackagesDialog.
Providers & APK selection
lib/providers/logs_provider.dart, lib/providers/apps_provider.dart, lib/providers/native_provider.dart, lib/providers/source_provider.dart
LogsProvider → ChangeNotifier with notifyListeners; AppsProvider adds density bucket logic, stricter XAPK manifest validation, ABI regex matching, density-aware filtering, and rewritten split selection; native font load guarded per-platform.
App source fixes
lib/app_sources/fdroid.dart, lib/app_sources/codeberg.dart, lib/app_sources/whatsapp.dart
FDroid scrapes author/changelog with resilient try/catch and normalizes changelog URLs; Codeberg delegates to Gitea and uses Codeberg search API; WhatsApp APK fallback URL updated.
CI, config, tooling
.github/workflows/*, .gitignore, analysis_options.yaml, android/settings.gradle.kts, pubspec.yaml, README.md
Remove prepare auto-fix/commit from some workflows (build now top-level), set git identity in nightly auto-fix step, bump GitGuardian action, add .kilo/ to .gitignore, add analyzer ignores, bump Gradle plugin and many dependencies, and small README wording fixes.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

"I hop and tinker in the code,
placeholders neat, no more odd load.
Slang renamed, translations sing,
APK sizes shown—what joy they bring.
🐰✨"

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch not-working

@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Comprehensive refactoring with translation system overhaul, APK handling improvements, and locale fixes

✨ Enhancement 🐞 Bug fix

Grey Divider

Walkthroughs

Description
• **Standardized translation system**: Replaced custom slang-converter with new slang_converter
  service featuring helper functions (t() and plural()) for improved translation handling across
  all 40+ language files
• **Enhanced APK handling**: Implemented XAPK manifest validation, device density bucket mapping,
  and improved ABI pattern matching with regex for more precise APK selection
• **Improved progress indicators**: Replaced custom CircularProgressIndicatorM3E and
  LinearProgressIndicatorM3E with standard Flutter components throughout the app
• **Fixed locale codes**: Corrected Indonesian locale from 'in' to 'id' and Kurdish from 'kmr'
  to 'en', 'KMR' (proper ISO 639-1 compliance)
• **Enhanced reactivity**: Changed LogsProvider from Provider to ChangeNotifierProvider with
  notifyListeners() calls for reactive updates
• **Improved app sources**: Refactored F-Droid metadata extraction with HTML parsing, replaced
  GitHub dependency in Codeberg with native implementation, and updated WhatsApp APK fallback URL
• **Added features**: APK file size display, "Installed Apps" quick-select button, dynamic form
  field defaults, and native showLicensePage() for open-source packages
• **Standardized translation placeholders**: Updated all 40+ translation files to use semantic named
  placeholders ({count}, {error}, {app}) instead of generic {}
• **Updated dependencies**: Android Gradle plugin to 9.2.1, multiple Flutter packages, and added
  loading_indicator_m3e dependency
• **Configuration improvements**: Added analyzer lint rule exceptions, Git user configuration for
  automated fixes, and error handling for edge-to-edge mode setup
Diagram
flowchart LR
  A["slang-converter<br/>old system"] -->|"replaced with"| B["slang_converter<br/>new service"]
  B --> C["t() function<br/>translations"]
  B --> D["plural() function<br/>smart mapping"]
  
  E["Custom Progress<br/>Indicators"] -->|"replaced with"| F["Standard Flutter<br/>Components"]
  
  G["XAPK Processing"] -->|"enhanced with"| H["Manifest Validation<br/>& Density Filtering"]
  
  I["Locale Codes"] -->|"fixed to"| J["ISO 639-1<br/>Compliance"]
  
  K["Translation Files<br/>40+ languages"] -->|"standardized"| L["Semantic Named<br/>Placeholders"]

Loading

Grey Divider

File Changes

1. lib/pages/app.dart ✨ Enhancement +78/-69

APK file size display and progress indicator refactoring

• Added APK file size fetching and display functionality with _fetchApkFileSize() and
 formatFileSize() methods
• Replaced custom CircularProgressIndicatorM3E and LinearProgressIndicatorM3E with standard
 Flutter CircularProgressIndicator and LinearProgressIndicator
• Refactored app settings dialog to use dynamic default values from app properties instead of
 hardcoded form fields
• Changed import from slang-converter to slang_converter (underscore naming convention)

lib/pages/app.dart


2. lib/providers/apps_provider.dart ✨ Enhancement +153/-12

Enhanced XAPK handling with density and ABI filtering

• Added XAPK manifest validation to ensure split_apks is a list
• Implemented getDeviceDensityBucket() method to map device pixel ratio to density buckets
• Enhanced APK filtering with more precise ABI pattern matching using regex
• Added _filterByDensity() method for density-based APK selection with fallback logic
• Refactored selectApksForInstallation() to use manifest-based selection with device capability
 matching

lib/providers/apps_provider.dart


3. lib/pages/settings.dart ✨ Enhancement +5/-148

Simplified open-source packages dialog and improved logs reactivity

• Removed OpenSourcePackagesDialog class and replaced with native showLicensePage() function
• Changed LogsProvider from Provider to ChangeNotifierProvider in main.dart
• Changed context.read() to context.watch() for LogsProvider to enable reactive updates
• Removed dependency on pubspec_parse package
• Added year2023: false parameter to Slider widget

lib/pages/settings.dart


View more (84)
4. lib/app_sources/fdroid.dart ✨ Enhancement +59/-50

Improved F-Droid metadata extraction with HTML parsing

• Refactored author fetching to use F-Droid package page HTML parsing instead of GitLab metadata
• Restructured changelog fetching logic with separate try-catch blocks for better error handling
• Changed import from slang-converter to slang_converter

lib/app_sources/fdroid.dart


5. lib/pages/apps.dart ✨ Enhancement +34/-23

Replaced custom progress indicators with standard Flutter components

• Replaced CircularProgressIndicatorM3E and LinearProgressIndicatorM3E with standard Flutter
 indicators
• Added LoadingIndicatorM3E import and conditional loading state display
• Improved empty state UI with conditional rendering based on loading status
• Changed import from slang-converter to slang_converter

lib/pages/apps.dart


6. lib/pages/add_app.dart ✨ Enhancement +84/-2

Added installed apps quick-select feature

• Added dynamic default value initialization for app-specific form fields
• Implemented "Installed Apps" button to allow quick selection of installed applications
• Changed import from slang-converter to slang_converter

lib/pages/add_app.dart


7. lib/main.dart 🐞 Bug fix +20/-10

Fixed locale codes and improved error handling

• Fixed locale code for Indonesian from 'in' to 'id' (correct ISO 639-1 code)
• Fixed locale code for Kurdish from 'kmr' to 'en', 'KMR' (proper locale variant)
• Added error handling for edge-to-edge mode setup with try-catch block
• Changed LogsProvider from Provider to ChangeNotifierProvider
• Added // ignore_for_file: implementation_imports comment at top
• Changed import from slang-converter to slang_converter

lib/main.dart


8. lib/services/slang_converter.dart ✨ Enhancement +63/-0

New translation converter service with helper functions

• Created new file with translation helper functions and extensions
• Implemented t() function as shorthand for translation
• Added plural() function with smart argument mapping for different translation keys
• Provides bridge between simple_localization and application code

lib/services/slang_converter.dart


9. lib/providers/source_provider.dart ✨ Enhancement +34/-2

Improved ABI matching and added form fields

• Enhanced ABI pattern matching with more precise regex for filename-based filtering
• Added appId and appSourceURL form fields to combined app-specific settings
• Changed import from slang-converter to slang_converter

lib/providers/source_provider.dart


10. lib/app_sources/codeberg.dart ✨ Enhancement +26/-7

Replaced GitHub dependency with native Codeberg implementation

• Removed GitHub class dependency and replaced with direct Codeberg implementation
• Implemented custom Codeberg API search using repository search endpoint
• Changed import from slang-converter to slang_converter

lib/app_sources/codeberg.dart


11. lib/providers/native_provider.dart Error handling +18/-5

Added platform safety checks for system font loading

• Added platform check to only load system font on Android
• Wrapped font loading in try-catch block with null safety checks
• Added debug print for error logging

lib/providers/native_provider.dart


12. lib/pages/import_export.dart ✨ Enhancement +3/-4

Replaced custom progress indicators

• Replaced LinearProgressIndicatorM3E with standard LinearProgressIndicator
• Changed import from slang-converter to slang_converter
• Removed progress_indicator_m3e dependency

lib/pages/import_export.dart


13. lib/pages/safe_mode_dialog.dart ✨ Enhancement +4/-4

Replaced custom progress indicator

• Replaced CircularProgressIndicatorM3E with standard CircularProgressIndicator
• Changed import from slang-converter to slang_converter

lib/pages/safe_mode_dialog.dart


14. lib/providers/logs_provider.dart ✨ Enhancement +4/-2

Made LogsProvider reactive with ChangeNotifier

• Changed LogsProvider to extend ChangeNotifier for reactive updates
• Added notifyListeners() calls in add() and get() methods
• Changed import from slang-converter to slang_converter

lib/providers/logs_provider.dart


15. lib/app_sources/github.dart 🐞 Bug fix +2/-1

Added GitHub source name initialization

• Added name = 'GitHub' initialization in constructor
• Changed import from slang-converter to slang_converter

lib/app_sources/github.dart


16. lib/app_sources/bitbucket.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/bitbucket.dart


17. lib/app_sources/whatsapp.dart 🐞 Bug fix +1/-2

Updated WhatsApp APK fallback URL

• Changed fallback APK URL from direct CDN link to WhatsApp website URL

lib/app_sources/whatsapp.dart


18. lib/app_sources/gitea.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/gitea.dart


19. lib/app_sources/gitlab.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/gitlab.dart


20. lib/providers/notifications_provider.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/providers/notifications_provider.dart


21. lib/app_sources/sourcehut.dart Formatting +2/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/sourcehut.dart


22. lib/app_sources/apkcombo.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/apkcombo.dart


23. lib/pages/security_disclaimer.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/pages/security_disclaimer.dart


24. lib/services/github_star_prompt.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/services/github_star_prompt.dart


25. lib/app_sources/rustore.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/rustore.dart


26. lib/app_sources/aptoide.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/aptoide.dart


27. lib/components/generated_form.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/components/generated_form.dart


28. lib/providers/settings_provider.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/providers/settings_provider.dart


29. lib/app_sources/directAPKLink.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/directAPKLink.dart


30. lib/app_sources/huaweiappgallery.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/huaweiappgallery.dart


31. lib/app_sources/vivoappstore.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/vivoappstore.dart


32. lib/pages/home.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/pages/home.dart


33. lib/services/githubstars.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/services/githubstars.dart


34. lib/app_sources/html.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/html.dart


35. lib/app_sources/fdroidrepo.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/fdroidrepo.dart


36. lib/app_sources/telegramapp.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/telegramapp.dart


37. lib/app_sources/tencent.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/tencent.dart


38. lib/app_sources/uptodown.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/app_sources/uptodown.dart


39. lib/components/category_chip.dart Formatting +1/-1

Updated import naming convention

• Changed import from slang-converter to slang_converter

lib/components/category_chip.dart


40. android/settings.gradle.kts Dependencies +1/-1

Updated Android Gradle plugin dependency

• Updated Android Gradle plugin version from 8.13.2 to 9.2.1

android/settings.gradle.kts


41. assets/translations/en.json Formatting +531/-531

Reformatted translations and updated placeholder syntax

• Reformatted entire JSON file with consistent indentation (4 spaces)
• Updated plural translation keys to use {count} placeholder instead of {}
• Updated named placeholders in translations (e.g., {app}, {error}, {n})

assets/translations/en.json


42. README.md 📝 Documentation +11/-5

Documentation improvements and FAQ expansion

• Fixed typo: "accessability" to "accessibility"
• Fixed typo: "DNS-over-HTTP" to "DNS-over-HTTPS"
• Added new feature: "Editing basic app information after adding it"
• Fixed typo: "open a pull" to "open a pull request"
• Fixed typo: "intrested" to "interested"
• Fixed typo: "getting involved into" to "getting involved in"
• Added new FAQ section comparing Updatium with other Obtainium forks

README.md


43. assets/translations/pl.json ✨ Enhancement +53/-53

Standardize placeholder names in Polish translations

• Replaced generic placeholder {} with semantic variable names {count}, {error}, and {app}
 in translation strings
• Updated pluralization strings for time units, app counts, and update status messages
• Improved translation clarity by using named placeholders instead of positional ones

assets/translations/pl.json


44. assets/translations/cs.json ✨ Enhancement +39/-39

Standardize placeholder names in Czech translations

• Replaced generic {} placeholders with semantic names {count}, {error}, and {app}
• Updated all pluralization forms for consistency across time units and app-related messages
• Enhanced readability of translation strings with explicit variable naming

assets/translations/cs.json


45. assets/translations/bg.json ✨ Enhancement +28/-28

Standardize placeholders and fix formatting in Bulgarian

• Replaced {} with semantic placeholders {count}, {error}, and {app}
• Fixed indentation issue for codeberg key (added missing spaces)
• Updated all pluralization strings for consistency

assets/translations/bg.json


46. assets/translations/hu.json ✨ Enhancement +27/-27

Standardize placeholder names in Hungarian translations

• Replaced generic {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Improved translation maintainability with explicit placeholder naming

assets/translations/hu.json


47. assets/translations/ml.json ✨ Enhancement +27/-27

Standardize placeholder names in Malayalam translations

• Replaced {} placeholders with semantic names {count}, {error}, and {app}
• Updated all pluralization forms for consistency
• Enhanced clarity of Malayalam translation strings

assets/translations/ml.json


48. assets/translations/ru.json ✨ Enhancement +38/-38

Standardize placeholder names in Russian translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated all pluralization forms (one, few, other) for consistency
• Improved Russian translation maintainability with explicit variable naming

assets/translations/ru.json


49. assets/translations/en-KMR.json ✨ Enhancement +27/-27

Standardize placeholder names in Kurdish translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app counts
• Enhanced clarity of Kurdish (Kurmanji) translation strings

assets/translations/en-KMR.json


50. assets/translations/ar.json ✨ Enhancement +35/-35

Standardize placeholder names in Arabic translations

• Replaced {} with semantic placeholders {count}, {error}, and {app}
• Updated all pluralization forms (one, two, other) for consistency
• Improved Arabic translation clarity with explicit variable naming

assets/translations/ar.json


51. assets/translations/he.json ✨ Enhancement +24/-24

Standardize placeholder names in Hebrew translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization forms (one, two, other) for consistency
• Fixed typo in bgUpdateGotErrorRetryInMinutes (removed extra })
• Enhanced Hebrew translation maintainability

assets/translations/he.json


52. assets/translations/ja.json ✨ Enhancement +27/-27

Standardize placeholder names in Japanese translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated all pluralization strings for consistency
• Improved Japanese translation clarity with explicit variable naming

assets/translations/ja.json


53. assets/translations/ug.json ✨ Enhancement +27/-27

Standardize placeholder names in Uyghur translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Enhanced Uyghur translation maintainability with explicit placeholder naming

assets/translations/ug.json


54. assets/translations/uk.json ✨ Enhancement +27/-27

Standardize placeholder names in Ukrainian translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated pluralization strings for consistency
• Improved Ukrainian translation clarity with explicit variable naming

assets/translations/uk.json


55. assets/translations/bn.json ✨ Enhancement +26/-26

Standardize placeholder names in Bengali translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app counts
• Enhanced Bengali translation maintainability with explicit placeholder naming

assets/translations/bn.json


56. assets/translations/ro.json ✨ Enhancement +27/-27

Standardize placeholder names in Romanian translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated pluralization strings for consistency
• Improved Romanian translation clarity with explicit variable naming

assets/translations/ro.json


57. assets/translations/hi.json ✨ Enhancement +27/-27

Standardize placeholder names in Hindi translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Enhanced Hindi translation maintainability with explicit placeholder naming

assets/translations/hi.json


58. assets/translations/tr.json ✨ Enhancement +27/-27

Standardize placeholder names in Turkish translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated pluralization strings for consistency
• Improved Turkish translation clarity with explicit variable naming

assets/translations/tr.json


59. assets/translations/bs.json ✨ Enhancement +26/-26

Standardize placeholder names in Bosnian translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Enhanced Bosnian translation maintainability with explicit placeholder naming

assets/translations/bs.json


60. assets/translations/et.json ✨ Enhancement +27/-27

Standardize placeholder names in Estonian translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated pluralization strings for consistency
• Improved Estonian translation clarity with explicit variable naming

assets/translations/et.json


61. assets/translations/sv.json ✨ Enhancement +27/-27

Standardize placeholder names in Swedish translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Enhanced Swedish translation maintainability with explicit placeholder naming

assets/translations/sv.json


62. assets/translations/zh-TW.json ✨ Enhancement +27/-27

Standardize placeholder names in Traditional Chinese translations

• Replaced generic {} with semantic placeholders {count}, {error}, and {app}
• Updated all pluralization strings for consistency
• Improved Traditional Chinese translation clarity with explicit variable naming

assets/translations/zh-TW.json


63. assets/translations/it.json ✨ Enhancement +27/-27

Standardize placeholder names in Italian translations

• Replaced {} with semantic variable names {count}, {error}, and {app}
• Updated pluralization strings for time units and app-related messages
• Enhanced Italian translation maintainability with explicit placeholder naming

assets/translations/it.json


64. assets/translations/fa.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/fa.json


65. assets/translations/ca.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/ca.json


66. assets/translations/vi.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/vi.json


67. assets/translations/en-EO.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/en-EO.json


68. assets/translations/fr.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/fr.json


69. assets/translations/da.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/da.json


70. assets/translations/id.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/id.json


71. assets/translations/zh.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/zh.json


72. assets/translations/ko.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/ko.json


73. assets/translations/gl.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/gl.json


74. assets/translations/de.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/de.json


75. assets/translations/pt.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/pt.json


76. assets/translations/es.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/es.json


77. assets/translations/pt-BR.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/pt-BR.json


78. assets/translations/nl.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/nl.json


79. assets/translations/hy.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/hy.json


80. assets/translations/ms.json ✨ Enhancement +27/-27

Standardize translation placeholders with semantic names

• Replaced generic placeholder {} with semantic named placeholders like {count}, {error}, and
 {app} across multiple translation strings
• Updated pluralization strings for app removal, rate limiting, background updates, and app-related
 messages
• Improved translation clarity by using explicit parameter names instead of positional arguments

assets/translations/ms.json


81. pubspec.yaml Dependencies +18/-15

Update version and dependency versions with launcher icon config

• Updated version from 26.4.0+2604141 to 26.5.0+2605261
• Updated multiple dependency versions including shared_preferences, fluttertoast, animations,
 sqflite, hsluv, connectivity_plus, background_fetch, markdown, pubspec_parse,
 dns_client, yaml, flutter_foreground_task, and path
• Added new dependency loading_indicator_m3e: ^0.1.1 and updated Flutter launcher icon
 configuration with adaptive icon settings

pubspec.yaml


82. analysis_options.yaml ⚙️ Configuration changes +5/-0

Configure analyzer to ignore specific lint rules

• Added analyzer configuration block to ignore specific lint rules: constant_identifier_names,
 file_names, and non_constant_identifier_names
• This allows the codebase to bypass these linting checks while maintaining other Flutter linting
 standards

analysis_options.yaml


83. .github/workflows/gitguardian.yaml Dependencies +1/-1

Update GitGuardian workflow action version

• Updated GitGuardian action version from v1.50.4 to v1.51.0

.github/workflows/gitguardian.yaml


84. .github/workflows/nightly.yml ⚙️ Configuration changes +2/-0

Configure Git user identity for automated fixes

• Added Git configuration commands to set global user name and email for github-actions[bot]
 before running git pull and dart fix --apply
• Ensures proper Git commit attribution when automated fixes are applied

.github/workflows/nightly.yml


85. .github/workflows/ci.yml Additional files +0/-65

...

.github/workflows/ci.yml


86. .github/workflows/release.yml Additional files +0/-65

...

.github/workflows/release.yml


87. lib/services/slang-converter.dart Additional files +0/-10

...

lib/services/slang-converter.dart


Grey Divider

ⓘ You are approaching your monthly quota for Qodo. Upgrade your plan

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented May 27, 2026

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0)

Grey Divider


Action required

1. Codeberg infinite recursion 🐞 Bug ≡ Correctness
Description
Codeberg constructs new Codeberg instances inside its own constructor and getLatestAPKDetails(),
causing infinite recursion/stack overflow. Since SourceProvider.sources instantiates Codeberg(),
this can crash as soon as sources are accessed (commonly during app startup flows).
Code

lib/app_sources/codeberg.dart[R8-11]

Evidence
The Codeberg constructor and getLatestAPKDetails both instantiate Codeberg(), which recurses
immediately; SourceProvider.sources constructs Codeberg(), making this recursion reachable in normal
execution.

lib/app_sources/codeberg.dart[4-36]
lib/providers/source_provider.dart[1411-1418]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`Codeberg()` recursively instantiates itself in the constructor (and also in `getLatestAPKDetails`), which will stack-overflow at runtime.

### Issue Context
`SourceProvider.sources` eagerly constructs `Codeberg()` as part of the available sources list, so the recursion is triggered by normal app execution.

### Fix Focus Areas
- lib/app_sources/codeberg.dart[4-36]
- lib/providers/source_provider.dart[1411-1418]

### What to change
- Remove all `Codeberg()` calls from within `Codeberg` itself.
- If the goal was to reuse GitHub logic, restore delegation via a non-recursive helper instance (e.g., `GitHub(hostChanged: true)` with appropriate host/name overrides), or copy the needed form-item lists without constructing `Codeberg`.
- Implement `getLatestAPKDetails` and `search` without creating new `Codeberg()` instances.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Invalid Slider argument 🐞 Bug ≡ Correctness
Description
SettingsPage passes an unsupported named parameter year2023 to Flutter’s Slider, which will fail
compilation. The file imports package:flutter/material.dart and does not define a custom Slider
type that accepts this argument.
Code

lib/pages/settings.dart[R398-401]

Evidence
The interval slider is created with year2023: false and Slider comes from
flutter/material.dart, making the named argument invalid for compilation.

lib/pages/settings.dart[398-405]
lib/pages/settings.dart[3-8]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`Slider(year2023: false, ...)` uses a named argument that Flutter’s `Slider` does not support, causing a compile-time error.

### Issue Context
`lib/pages/settings.dart` imports `package:flutter/material.dart`, so `Slider` resolves to Flutter’s widget unless explicitly shadowed (it isn’t).

### Fix Focus Areas
- lib/pages/settings.dart[398-421]
- lib/pages/settings.dart[3-8]

### What to change
- Remove `year2023: false`.
- If you intended to use a different/custom slider widget, replace `Slider` with that widget type and import it explicitly, ensuring its API matches.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. WhatsApp fallback not APK 🐞 Bug ≡ Correctness
Description
When no .apk link is found on the WhatsApp Android page, the code falls back to using the same HTML
page URL as the APK download URL and returns it in APKDetails. This makes downloads/installs fail
(non-APK content) and also makes version parsing likely to fail, throwing NoVersionError.
Code

lib/app_sources/whatsapp.dart[46]

Evidence
The code explicitly assigns the HTML page URL as a fallback apkUrl and returns it in APKDetails;
when version parsing fails it throws NoVersionError(), making the source unreliable when the
fallback path is taken.

lib/app_sources/whatsapp.dart[31-84]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The WhatsApp source fallback sets `apkUrl` to `https://www.whatsapp.com/android` (an HTML page) and then returns it as an APK asset URL.

### Issue Context
`APKDetails` is used downstream as a direct download/install target; providing an HTML page URL will break downloading and also breaks the subsequent version extraction regexes, often resulting in `NoVersionError()`.

### Fix Focus Areas
- lib/app_sources/whatsapp.dart[31-84]

### What to change
- Make the fallback resolve to an actual APK binary URL (e.g., by extracting the correct link from the page, following redirects to the real .apk, or using a stable official direct download endpoint).
- Optionally add a guard: if `apkUrl` doesn’t look like a downloadable APK (e.g., doesn’t contain `.apk`), treat it as an error and surface a clearer message rather than returning it as an APK URL.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ You are approaching your monthly quota for Qodo. Upgrade your plan

Qodo Logo

Copy link
Copy Markdown

@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 updates translation files to use named placeholders instead of positional ones, renames the slang-converter service, and introduces features like display density filtering for split APKs, fetching APK file sizes, and pre-filling URLs from installed apps. Several critical issues were identified in the review, including infinite recursion in the Codeberg class, a compilation error in the Slider widget due to an invalid parameter, potential runtime errors when accessing views.first or context.read without proper safety checks, a non-direct APK URL for WhatsApp, and regex matching bugs that could lead to incorrect ABI selection.

Comment thread lib/app_sources/codeberg.dart
Comment thread lib/app_sources/codeberg.dart Outdated
Comment thread lib/app_sources/codeberg.dart Outdated
Comment thread lib/pages/settings.dart
Comment thread lib/providers/apps_provider.dart Outdated
Comment thread lib/providers/apps_provider.dart
Comment thread lib/providers/source_provider.dart Outdated
Comment thread lib/app_sources/whatsapp.dart Outdated
Comment thread lib/pages/app.dart
Copy link
Copy Markdown

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

Comment thread lib/app_sources/codeberg.dart Outdated
Comment thread lib/pages/settings.dart
Copy link
Copy Markdown

@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: 17

Caution

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

⚠️ Outside diff range comments (1)
lib/providers/apps_provider.dart (1)

1184-1253: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Keep the base APK in the fallback split set.

filterApksByArchitecture() currently returns only ABI-tagged files once it finds a match, and it returns before density filtering when no ABI-tagged files exist. In the fallback paths of selectApksForInstallation(), that can either drop the base APK entirely or leave all density splits in place, so installApkDir() may try to install an invalid split set. Preserve non-config APKs in the result and run density selection on the combined set instead of the ABI matches alone.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/providers/apps_provider.dart` around lines 1184 - 1253,
filterApksByArchitecture currently returns only ABI-tagged APKs and can drop the
base (non-config) APK; change it so that when ABI matches are found you also
include the base/non-config APK(s) from the original apkFiles (i.e., files that
are not ABI or density/split tagged) before applying density filtering, and then
run _filterByDensity on this combined set (not just the ABI matches); update
filterApksByArchitecture to collect matchingApks + baseApks and pass that to
_filterByDensity so callers like selectApksForInstallation/installApkDir receive
a valid split set including the base APK.
🧹 Nitpick comments (2)
lib/providers/native_provider.dart (1)

17-21: 💤 Low value

Consider renaming the flag to clarify non-loading semantics.

Setting _systemFontLoaded = true on non-Android platforms is semantically misleading—the flag name suggests the font was loaded, but here it means "skip future attempts." This works correctly but could confuse future maintainers.

Consider renaming to _systemFontAttempted or _systemFontInitialized, or add a clarifying comment.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/providers/native_provider.dart` around lines 17 - 21, The flag
_systemFontLoaded is misleading because it’s set to true to indicate “don’t try
loading on non-Android” rather than an actual load; rename the flag to something
clearer like _systemFontAttempted or _systemFontInitialized and update all
references (e.g., checks and assignments around Platform.isAndroid and any
places that read _systemFontLoaded) to use the new name, and add a brief comment
where it’s set explaining that true means “no further load attempts required”
(update declarations, the conditional that sets it when !Platform.isAndroid, and
any related logic in this class/method).
analysis_options.yaml (1)

10-14: ⚡ Quick win

Avoid globally disabling naming/file lints.

This globally suppresses high-signal lint rules and can hide new regressions. Prefer targeted // ignore_for_file or local suppressions where exceptions are intentional.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@analysis_options.yaml` around lines 10 - 14, Remove the global suppressions
under the analyzer.errors map (constant_identifier_names, file_names,
non_constant_identifier_names) and instead apply targeted ignores only in the
files that need them by adding `// ignore_for_file: constant_identifier_names`
(or the specific lint name) at the top of those individual Dart files; update
analysis_options.yaml to stop ignoring these lints globally so regressions are
visible and keep any true exceptions confined to the specific files referenced.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/gitguardian.yaml:
- Line 15: The workflow step currently references the mutable tag "uses:
GitGuardian/ggshield/actions/secret@v1.51.0"; replace that tag with the
corresponding immutable commit SHA for that release (e.g. "uses:
GitGuardian/ggshield/actions/secret@<COMMIT_SHA>") to pin the action, confirm
the SHA matches the v1.51.0 release in the GitGuardian/ggshield repo, and run
the workflow to verify the action still executes correctly.

In `@android/settings.gradle.kts`:
- Line 22: The AGP bump in android/settings.gradle.kts
(id("com.android.application") version "9.2.1") plus KGP 2.3.21 conflicts with
the pinned Flutter 3.38.9 in codeql.yml; either update the pinned Flutter
version in codeql.yml to one that supports AGP 9.x / KGP 2.3.x / Gradle 9.x, or
revert the AGP/KGP/Gradle versions back to the Flutter‑3.38 compatible stack
(e.g., AGP 8.11.1, KGP <=2.2.20, Gradle 8.14) in android/settings.gradle.kts and
the Gradle wrapper; after making the chosen change, run flutter analyze
--suggestions and a full Android Gradle build with the pinned Flutter to verify
the toolchain works.

In `@assets/translations/bs.json`:
- Around line 426-429: The plural form for minutes is missing the count
placeholder: update the "minute.other" translation entry to include the {count}
token (e.g., change "min." to include "{count}"), so both "minute.one" and
"minute.other" display the numeric value; modify the "minute.other" key in the
translations JSON (the "minute" object) to include {count} in the string.
- Around line 450-453: The Bosnian translations for the key
"xAndNMoreUpdatesFailed" were left in English; update the values for the "one"
and "other" variants under the xAndNMoreUpdatesFailed object to Bosnian (e.g.,
change "Failed to update {app} and 1 more app." and "Failed to update {app} and
{count} more apps." to their Bosnian equivalents) so the bs.json locale remains
consistent; locate the xAndNMoreUpdatesFailed entry and replace the two string
values accordingly.

In `@assets/translations/en.json`:
- Line 107: Replace the inconsistent locale key "appAuthor" with the canonical
key "author" in the translations (or add an "author" entry mirroring
"appAuthor") so key parity is restored; update the "appAuthor" entry in
assets/translations/en.json to use the exact key name "author" (or duplicate the
value under "author" and remove "appAuthor") to match other locale files.

In `@assets/translations/he.json`:
- Line 419: The Hebrew translation for the retry message has a malformed
placeholder "{count}}" (extra closing brace) in the "other" string; update that
translation string so the placeholder is "{count}" (remove the extra brace) to
restore correct interpolation for the retry message key "other".

In `@assets/translations/nl.json`:
- Around line 455-456: Fix the typo in the Dutch translation string: replace
"bijgwerkt" with the correct "bijgewerkt" in the translation entry where the
plural key "other" (and verify "one" if needed) contains "{app} en nog {count}
apps zijn mogelijk bijgwerkt."; update that "other" value to "{app} en nog
{count} apps zijn mogelijk bijgewerkt." to correct the spelling.

In `@assets/translations/ug.json`:
- Around line 411-412: The translation entries for plural forms ("one" and
"other") use the wrong interpolation token `{error}`; update both values to use
`{count}` so the retry minutes display correctly (change the strings for the
"one" and "other" keys in the translations object to replace `{error}` with
`{count}`).

In `@assets/translations/uk.json`:
- Around line 411-412: The retry-delay placeholder in the background update
error translation is wrong: replace the '{error}' placeholder with the
pluralization/count placeholder '{count}' in both the "one" and "other" strings
for the background update error message (the two lines currently starting with
"Помилка перевірки оновлень у фоновому режимі - спробую знову через {error}
...") so the retry minute(s) render correctly.

In `@assets/translations/vi.json`:
- Line 452: The Vietnamese failure message string under the "other" key contains
a typo: replace "thảnh công" with the correct "thành công" in the value "{app}
và {count} ứng dụng khác đã cập nhật không thảnh công." so it reads "{app} và
{count} ứng dụng khác đã cập nhật không thành công."; update the "other" value
in assets/translations/vi.json accordingly.

In `@lib/app_sources/codeberg.dart`:
- Around line 8-11: The Codeberg class is instantiating itself (using
Codeberg()) in its constructor and delegating to
Codeberg().getLatestAPKDetails(...), causing infinite recursion; replace those
self-instantiations with calls to the base-class/default implementations (e.g.,
use super.additionalSourceAppSpecificSettingFormItems or a shared/static
defaults provider instead of Codeberg() for
additionalSourceAppSpecificSettingFormItems, searchQuerySettingFormItems and
canSearch) and change the delegation in getLatestAPKDetails to call
super.getLatestAPKDetails(...) (or a non-recursive static helper) so the class
uses the parent/default logic rather than constructing a new Codeberg instance.
- Around line 47-64: The search currently treats the API response as HTML and
regexes hrefs; update the logic that builds urls (around requestUrl and res
handling using sourceRequest) to jsonDecode(res.body) and extract owner/name
from the JSON structure (e.g., iterate over response['data'] items to get
repository owner and name), then construct fullUrl and populate the urls map
accordingly; keep the existing error path that throws getUpdatiumHttpError(res)
when res.statusCode != 200.

In `@lib/app_sources/fdroid.dart`:
- Around line 83-104: The enrichment currently parses res.body even on
non-successful HTTP responses; update the FDroid enrichment to first check the
response status (e.g., res.statusCode) and only parse/assign values when the
status indicates success (200 or 2xx) for both the author parsing block that
uses sourceRequest('https://$host/packages/$appId') and the changelog/GitLab
metadata block that uses
sourceRequest('https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/$appId.yml');
if the status is not successful, skip parsing and leave details.names.author and
changelog fallback untouched to avoid overwriting with error pages.

In `@lib/app_sources/whatsapp.dart`:
- Around line 45-46: The fallback that sets apkUrl to
'https://www.whatsapp.com/android' returns HTML not an APK and causes later
failure; instead, when no .apk link is found, stop and surface an error
immediately rather than building APKDetails. In the code path that computes
apkUrl (the variable named apkUrl) before constructing APKDetails, check whether
the discovered URL ends with '.apk' (or was actually found); if not, throw or
return a descriptive error (e.g., "No APK link found for WhatsApp") so callers
can handle the missing artifact instead of attempting to download HTML. Ensure
the error is raised where apkUrl is finalized so APKDetails is only created with
a real APK URL.

In `@lib/pages/add_app.dart`:
- Around line 909-913: The installed-app selection call to changeUserInput
currently passes (app.packageName ?? '', true, false) which leaves
updateUrlInput false and fails to bump the form key; change the third argument
to true (i.e., call changeUserInput(app.packageName ?? '', true, true)) so
updateUrlInput is enabled and the URL input is updated/refreshed when an
installed app is selected.

In `@lib/providers/native_provider.dart`:
- Around line 22-33: When loadSystemFont() fails or fontFilePath is null the
code currently leaves _systemFontLoaded false causing endless retries; update
the null branch and the catch handler in the FontLoader block so that after
detecting fontFilePath == null or catching an exception you set
_systemFontLoaded = true (or another "attempted" flag) and still log the failure
(debugPrint) — locate the FontLoader usage and AndroidSystemFont().getFilePath()
call and set _systemFontLoaded in both the null path and the catch block to
prevent repeated attempts.

In `@README.md`:
- Line 40: The README uses image link syntax `![here](...)` in the localization
sentence ("Updatium currently supports 38 locales...") which renders
incorrectly; change that token to a normal markdown link by replacing
`![here](https://github.com/omeritzics/Updatium/tree/main/assets/translations)`
with
`[here](https://github.com/omeritzics/Updatium/tree/main/assets/translations)`
so the inline reference to the translations folder displays as a clickable link.

---

Outside diff comments:
In `@lib/providers/apps_provider.dart`:
- Around line 1184-1253: filterApksByArchitecture currently returns only
ABI-tagged APKs and can drop the base (non-config) APK; change it so that when
ABI matches are found you also include the base/non-config APK(s) from the
original apkFiles (i.e., files that are not ABI or density/split tagged) before
applying density filtering, and then run _filterByDensity on this combined set
(not just the ABI matches); update filterApksByArchitecture to collect
matchingApks + baseApks and pass that to _filterByDensity so callers like
selectApksForInstallation/installApkDir receive a valid split set including the
base APK.

---

Nitpick comments:
In `@analysis_options.yaml`:
- Around line 10-14: Remove the global suppressions under the analyzer.errors
map (constant_identifier_names, file_names, non_constant_identifier_names) and
instead apply targeted ignores only in the files that need them by adding `//
ignore_for_file: constant_identifier_names` (or the specific lint name) at the
top of those individual Dart files; update analysis_options.yaml to stop
ignoring these lints globally so regressions are visible and keep any true
exceptions confined to the specific files referenced.

In `@lib/providers/native_provider.dart`:
- Around line 17-21: The flag _systemFontLoaded is misleading because it’s set
to true to indicate “don’t try loading on non-Android” rather than an actual
load; rename the flag to something clearer like _systemFontAttempted or
_systemFontInitialized and update all references (e.g., checks and assignments
around Platform.isAndroid and any places that read _systemFontLoaded) to use the
new name, and add a brief comment where it’s set explaining that true means “no
further load attempts required” (update declarations, the conditional that sets
it when !Platform.isAndroid, and any related logic in this class/method).
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d87bffd2-22e1-4a0c-a379-417d3ac82c38

📥 Commits

Reviewing files that changed from the base of the PR and between b7885e7 and ada6bc0.

⛔ Files ignored due to path filters (2)
  • assets/graphics/icon-foreground.png is excluded by !**/*.png
  • pubspec.lock is excluded by !**/*.lock
📒 Files selected for processing (88)
  • .github/workflows/ci.yml
  • .github/workflows/gitguardian.yaml
  • .github/workflows/nightly.yml
  • .github/workflows/release.yml
  • .gitignore
  • README.md
  • analysis_options.yaml
  • android/settings.gradle.kts
  • assets/translations/ar.json
  • assets/translations/bg.json
  • assets/translations/bn.json
  • assets/translations/bs.json
  • assets/translations/ca.json
  • assets/translations/cs.json
  • assets/translations/da.json
  • assets/translations/de.json
  • assets/translations/en-EO.json
  • assets/translations/en-KMR.json
  • assets/translations/en.json
  • assets/translations/es.json
  • assets/translations/et.json
  • assets/translations/fa.json
  • assets/translations/fr.json
  • assets/translations/gl.json
  • assets/translations/he.json
  • assets/translations/hi.json
  • assets/translations/hu.json
  • assets/translations/hy.json
  • assets/translations/id.json
  • assets/translations/it.json
  • assets/translations/ja.json
  • assets/translations/ko.json
  • assets/translations/ml.json
  • assets/translations/ms.json
  • assets/translations/nl.json
  • assets/translations/pl.json
  • assets/translations/pt-BR.json
  • assets/translations/pt.json
  • assets/translations/ro.json
  • assets/translations/ru.json
  • assets/translations/sv.json
  • assets/translations/tr.json
  • assets/translations/ug.json
  • assets/translations/uk.json
  • assets/translations/vi.json
  • assets/translations/zh-TW.json
  • assets/translations/zh.json
  • lib/app_sources/apkcombo.dart
  • lib/app_sources/aptoide.dart
  • lib/app_sources/bitbucket.dart
  • lib/app_sources/codeberg.dart
  • lib/app_sources/directAPKLink.dart
  • lib/app_sources/fdroid.dart
  • lib/app_sources/fdroidrepo.dart
  • lib/app_sources/gitea.dart
  • lib/app_sources/github.dart
  • lib/app_sources/gitlab.dart
  • lib/app_sources/html.dart
  • lib/app_sources/huaweiappgallery.dart
  • lib/app_sources/rustore.dart
  • lib/app_sources/sourcehut.dart
  • lib/app_sources/telegramapp.dart
  • lib/app_sources/tencent.dart
  • lib/app_sources/uptodown.dart
  • lib/app_sources/vivoappstore.dart
  • lib/app_sources/whatsapp.dart
  • lib/components/category_chip.dart
  • lib/components/generated_form.dart
  • lib/main.dart
  • lib/pages/add_app.dart
  • lib/pages/app.dart
  • lib/pages/apps.dart
  • lib/pages/home.dart
  • lib/pages/import_export.dart
  • lib/pages/safe_mode_dialog.dart
  • lib/pages/security_disclaimer.dart
  • lib/pages/settings.dart
  • lib/providers/apps_provider.dart
  • lib/providers/logs_provider.dart
  • lib/providers/native_provider.dart
  • lib/providers/notifications_provider.dart
  • lib/providers/settings_provider.dart
  • lib/providers/source_provider.dart
  • lib/services/github_star_prompt.dart
  • lib/services/githubstars.dart
  • lib/services/slang-converter.dart
  • lib/services/slang_converter.dart
  • pubspec.yaml
💤 Files with no reviewable changes (3)
  • lib/services/slang-converter.dart
  • .github/workflows/ci.yml
  • .github/workflows/release.yml

Comment thread .github/workflows/gitguardian.yaml
Comment thread android/settings.gradle.kts
Comment thread assets/translations/bs.json
Comment thread assets/translations/bs.json
Comment thread assets/translations/en.json Outdated
Comment thread lib/app_sources/fdroid.dart Outdated
Comment thread lib/app_sources/whatsapp.dart Outdated
Comment thread lib/pages/add_app.dart
Comment thread lib/providers/native_provider.dart
Comment thread README.md Outdated
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 27, 2026

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 2 file(s) based on 1 unresolved review comment.

A stacked PR containing fixes has been created.

  • Stacked PR: #353
  • Files modified:
  • android/gradle/wrapper/gradle-wrapper.properties
  • android/settings.gradle.kts

Time taken: 2m 22s

@github-actions github-actions Bot dismissed their stale review May 27, 2026 05:51

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

@omeritzics
Copy link
Copy Markdown
Owner Author

/describe

@qodo-code-review
Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@omeritzics
Copy link
Copy Markdown
Owner Author

/improve

@qodo-code-review
Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@omeritzics
Copy link
Copy Markdown
Owner Author

/describe

@omeritzics omeritzics marked this pull request as draft May 27, 2026 06:58
@omeritzics omeritzics marked this pull request as ready for review May 27, 2026 06:58
Copy link
Copy Markdown

@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

♻️ Duplicate comments (2)
lib/app_sources/codeberg.dart (1)

48-63: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Parse Codeberg search response as JSON, not HTML links.

Line 50 calls api/v1/repos/search, but Line 53-57 treats the payload as HTML and regexes href="...". This can yield empty search results.

#!/bin/bash
set -euo pipefail

curl -sSI "https://codeberg.org/api/v1/repos/search?q=updatium" | sed -n '1,20p'
echo
curl -s "https://codeberg.org/api/v1/repos/search?q=updatium" | head -c 300
echo
echo "If response is JSON, search logic should jsonDecode(res.body) and iterate response['data']."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/app_sources/codeberg.dart` around lines 48 - 63, The code builds
requestUrl and calls sourceRequest but treats res.body as HTML using linkReg and
href regex; instead parse the JSON response (jsonDecode(res.body)), iterate the
top-level list (response['data'] or the appropriate field returned by the API),
extract repository path/name from each item to construct fullUrl and name, and
populate the urls map; update the logic around requestUrl, sourceRequest result
handling, and remove the href regex usage to use JSON fields from each repo
item.
lib/app_sources/fdroid.dart (1)

134-137: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard raw changelog overwrite behind a successful status code.

Line 134-137 assigns details.changeLog from the raw URL response body without checking status, so an error page/body can still replace the fallback changelog.

🔧 Suggested fix
         if ((isGitHub || isGitLab) &&
             (details.changeLog?.indexOf('/blob/') ?? -1) >= 0) {
           try {
-            details.changeLog = (await sourceRequest(
+            final rawRes = await sourceRequest(
               details.changeLog!.replaceFirst('/blob/', '/raw/'),
               additionalSettings,
-            )).body;
+            );
+            if (rawRes.statusCode >= 200 &&
+                rawRes.statusCode < 300 &&
+                rawRes.body.isNotEmpty) {
+              details.changeLog = rawRes.body;
+            }
           } catch (e) {
             // Fail silently
           }
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/app_sources/fdroid.dart` around lines 134 - 137, The code assigns
details.changeLog from the result of sourceRequest without checking the HTTP
status; update the logic around the sourceRequest call (the block that sets
details.changeLog) to first capture the response (e.g., let resp = await
sourceRequest(...)) and only set details.changeLog = resp.body when the response
indicates success (status code 200 OK or equivalent); otherwise leave
details.changeLog unchanged to preserve the fallback. Ensure you reference the
existing symbols details.changeLog and sourceRequest when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lib/providers/source_provider.dart`:
- Around line 627-633: The ABI regex allows false positives because it uses an
optional left separator '[-_\.]?' and requires a separator on the right, so
tokens like "myx86tool" match; update the pattern construction (the abiPattern
variable and its suffix logic) to require a proper token boundary by replacing
the left optional group with a non-capturing alternation for start-or-separator
and make the right boundary allow end-or-separator, e.g. use '(?:^|[-_.])' +
RegExp.escape(abi) + suffix + '(?:$|[-_.])' (adjusting existing suffix handling
for x86/armeabi accordingly) so only full ABI tokens are matched.

In `@README.md`:
- Line 40: The link text "here" is not descriptive; update the markdown at the
sentence containing the translations link so the anchor uses descriptive text
(e.g., "translation files on GitHub" or "Updatium translation files") instead of
"here" and keep the same URL to
https://github.com/omeritzics/Updatium/tree/main/assets/translations so screen
readers and readers skimming the README understand the destination.

---

Duplicate comments:
In `@lib/app_sources/codeberg.dart`:
- Around line 48-63: The code builds requestUrl and calls sourceRequest but
treats res.body as HTML using linkReg and href regex; instead parse the JSON
response (jsonDecode(res.body)), iterate the top-level list (response['data'] or
the appropriate field returned by the API), extract repository path/name from
each item to construct fullUrl and name, and populate the urls map; update the
logic around requestUrl, sourceRequest result handling, and remove the href
regex usage to use JSON fields from each repo item.

In `@lib/app_sources/fdroid.dart`:
- Around line 134-137: The code assigns details.changeLog from the result of
sourceRequest without checking the HTTP status; update the logic around the
sourceRequest call (the block that sets details.changeLog) to first capture the
response (e.g., let resp = await sourceRequest(...)) and only set
details.changeLog = resp.body when the response indicates success (status code
200 OK or equivalent); otherwise leave details.changeLog unchanged to preserve
the fallback. Ensure you reference the existing symbols details.changeLog and
sourceRequest when making the change.
🪄 Autofix (Beta)

❌ Autofix failed (check again to retry)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e50cc271-a870-4a71-b1bf-9268c7213817

📥 Commits

Reviewing files that changed from the base of the PR and between ada6bc0 and c9f312f.

📒 Files selected for processing (18)
  • README.md
  • assets/translations/bs.json
  • assets/translations/en.json
  • assets/translations/he.json
  • assets/translations/nl.json
  • assets/translations/ug.json
  • assets/translations/uk.json
  • assets/translations/vi.json
  • lib/app_sources/codeberg.dart
  • lib/app_sources/fdroid.dart
  • lib/app_sources/whatsapp.dart
  • lib/pages/add_app.dart
  • lib/pages/app.dart
  • lib/pages/settings.dart
  • lib/providers/apps_provider.dart
  • lib/providers/native_provider.dart
  • lib/providers/source_provider.dart
  • pubspec.yaml
💤 Files with no reviewable changes (1)
  • lib/pages/settings.dart
🚧 Files skipped from review as they are similar to previous changes (9)
  • lib/app_sources/whatsapp.dart
  • assets/translations/ug.json
  • assets/translations/uk.json
  • assets/translations/en.json
  • assets/translations/bs.json
  • lib/pages/app.dart
  • assets/translations/nl.json
  • lib/providers/apps_provider.dart
  • assets/translations/vi.json

Comment thread lib/providers/source_provider.dart Outdated
Comment thread README.md Outdated
@omeritzics
Copy link
Copy Markdown
Owner Author

@gemini-code-assist Is the Pull Request ready to merge?

@gemini-code-assist
Copy link
Copy Markdown

Hi @omeritzics, thank you for reaching out!

While I cannot directly perform a merge or approve the pull request, I can provide a status update based on the current state of the PR.

Looking at the recent activity, there are some identified issues (such as the recursion in Codeberg and the invalid Slider argument) that have been flagged by automated tools. It is generally recommended to address these bugs before merging to ensure stability.

Once you have verified that these fixes are implemented and the build is passing, you should be in a good position to merge. If you need help with a specific piece of code or have questions about the remaining tasks, feel free to ask!

@omeritzics
Copy link
Copy Markdown
Owner Author

/review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 27, 2026

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found.

@omeritzics omeritzics force-pushed the not-working branch 3 times, most recently from 411daea to 33d29b8 Compare May 28, 2026 04:48
omeritzics and others added 5 commits May 28, 2026 07:53
Another step towards Slang
style: auto-fix linting and formatting issues
Co-Authored-By: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
style: auto-fix linting and formatting issues
omeritzics and others added 12 commits May 28, 2026 07:53
Remove duplicate appAuthor field
style: auto-fix linting and formatting issues
style: auto-fix linting and formatting issues
This reverts commit bce78bb.
Update lib/providers/source_provider.dart

Update README.md

Fix critical errors

style: auto-fix linting and formatting issues

Another step towards Slang

style: auto-fix linting and formatting issues

Update plugin com.android.application to v9 (#343)

Update pluralization for minutes in bs.json

Update assets/translations/uk.json

Update assets/translations/vi.json

Update assets/translations/ug.json

Update assets/translations/nl.json

Update assets/translations/he.json

Update assets/translations/en.json

Update lib/pages/add_app.dart

Update lib/providers/native_provider.dart

Some fixes

* style: auto-fix linting and formatting issues

* Should fix "Pick export directory"

* Fix app won't open

* Remove prepare job from release workflow

Removed the prepare job and its associated steps from the release workflow.

* style: auto-fix linting and formatting issues

* Update nightly.yml

* Update GitGuardian/ggshield action to v1.51.0 (#347)

Co-authored-by: Omer I.S. <137101815+omeritzics@users.noreply.github.com>

* Update F-Droid source

* Commit

* Add APK file size to app.dart

* Add "Installed Apps" list

* style: auto-fix linting and formatting issues

* Update email configuration for GitHub Actions

* style: auto-fix linting and formatting issues

* Add Kurdish support

* Add Kurdish localization package import

* Kurdish support

* Fix

* Update lib/providers/settings_provider.dart

* Update lib/pages/add_app.dart

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

* Change provider access from watch to read

* Refactor author fetching logic from GitLab

* Update pubspec.yaml

* fix: apply CodeRabbit auto-fixes

Fixed 2 file(s) based on 1 unresolved review comment.

* Change provider access from watch to read

* Update analysis_options.yaml

* Improve fdroid.dart

* Update

* Remove prepare job from CI workflow

Removed the prepare job and its associated steps from the CI workflow.

* Some quality fixes

* Revert "Refactor author fetching logic from GitLab"

This reverts commit e44254e.

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

Refactor Codeberg to extend Gitea functionality

Update lib/app_sources/codeberg.dart

Update lib/pages/settings.dart

Update lib/providers/apps_provider.dart

Update lib/providers/apps_provider.dart

Update lib/providers/source_provider.dart

Update lib/app_sources/whatsapp.dart

Update lib/pages/app.dart

style: auto-fix linting and formatting issues

style: auto-fix linting and formatting issues

Update GitGuardian/ggshield action to v1.51.0 (#348)

* style: auto-fix linting and formatting issues

* Should fix "Pick export directory"

* Fix app won't open

* Update GitGuardian/ggshield action to v1.51.0

* Remove prepare job from release workflow

Removed the prepare job and its associated steps from the release workflow.

* style: auto-fix linting and formatting issues

* Update nightly.yml

* Update F-Droid source

* Commit

* Add APK file size to app.dart

* Add "Installed Apps" list

* style: auto-fix linting and formatting issues

---------

style: auto-fix linting and formatting issues
Co-Authored-By: omeritzics <137101815+omeritzics@users.noreply.github.com>
Co-Authored-By: Omer I.S. <omeritzicschwartz@gmail.com>
Co-Authored-By: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-Authored-By: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-Authored-By: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-Authored-By: CodeRabbit <noreply@coderabbit.ai>
@omeritzics omeritzics closed this May 28, 2026
@omeritzics omeritzics deleted the not-working branch May 28, 2026 04:55
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