After OpenFile.open() the state was reset to UpdateStatus.available,
which re-triggered the app.dart listener (downloading → available
satisfies the prev != available condition) and showed the dialog again.
Fix: reset to idle so the system installer can proceed uninterrupted.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pubspec: 26.03.01+1 (Flutter uses + to separate versionName/versionCode)
Update checker combines version + buildNumber → "26.03.01.1" for
comparison against Forgejo release tags in the same format.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The app now checks for new APK releases on a Forgejo instance and can
download and install them without leaving the app.
Settings:
- New "Update repository URL" field (e.g. https://git.example.com/user/fabled_app)
- "App version" tile with a manual "Check" button and live status display
- Download progress bar and "Install" button appear when update is found
Startup:
- Shell runs a silent background check on first load when a repo URL is set
- A dialog appears automatically if a newer release is found
Provider (update_provider.dart):
- UpdateNotifier: idle → checking → available → downloading → available
- Hits Forgejo /api/v1/repos/{owner}/{repo}/releases/latest
- Parses semver tag, finds .apk asset, downloads with progress via Dio
- Opens the APK with open_file to trigger the system package installer
Android:
- REQUEST_INSTALL_PACKAGES permission
- FileProvider configured for open_file (shares APK URI with installer)
- res/xml/file_paths.xml covers external-files and cache directories
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>