- Add optional parameter to ToggleTile (default false)
- Add optional parameter to GeneratedForm (default false)
- GeneratedFormModal now passes to its inner GeneratedForm
- Set on direct AlertDialog + GeneratedForm in import_export.dart
- Reduce non-tile mode row spacing from 24 to 8
- Compact page headers — The "Apps", "Settings", "Add App" and other page titles now use smaller headers, giving more room to content (#3107).
- Per-app checkboxes in the update dialog — Instead of all-or-nothing toggles, the dialog now lists each app individually with a checkbox, so you can choose exactly which apps to update or install (#3107).
- 3-way action banner setting — The banner can now show for all actions, updates only, or be hidden entirely, controlled from Settings → Appearance (#3100).
- Settings reorganization — Settings are now grouped logically under Updates, Appearance, and Categories. Unused "page transition" toggles have been removed.
- Segmented buttons replaced with dropdowns — The install method, action banner, and group-by controls now use dropdown menus for a cleaner look.
- Consistent form input styling — All text fields, dropdowns, and toggles across the entire app now share the same filled, borderless look with rounded corners, including the add-app page, import page, and category editor.
- Download size shown inside the update button — The estimated APK size now appears directly in the Update or Install button text (e.g., "Update · 12 MB"), and is only looked up when an update or install is actually available.
- Remove double top padding on add-app and import-from-URL-list pages:
content area no longer adds MediaQuery.padding.top since the
AppBar/SliverAppBar already accounts for system bar insets.
- Fix source names showing raw translation keys in group headers and
filter dropdown. Eight sources used name = tr(key) in their
constructor, which resolved before translations loaded at startup.
Changed to @override String get name => tr(key) so resolution is
always lazy. Store sourceIdentifier (stable) instead of name in
AppInMemory.sourceType; resolve to display name at presentation
time via a lookup map built from SourceProvider.sources.
- Remove redundant crowdsourced-app-configs button from the settings
page app bar (an ActionChip on the add-app page already provides
the same link).
_generateFormState._computeItemsHash included item.value for
switches and dropdowns (only text fields were excluded). On the
add-app page, _buildSourceSpecificForm mutates item.value from
additionalSettings on every rebuild, so any value change via a
related onValueChanges callback would alter the hash, trigger
_initFormData, dispose all TextEditingControllers, and kill the
keyboard.
Hash now uses only key + runtime type for all item kinds -- form
re-initialization is driven by widget key changes (source
switch), not value fluctuations.
- Add install/update selected apps button to multi-select actions menu that reuses existing obtain dialog logic.
- Remove back buttons from additional options, import URL list, and app logs pages. Keep close button in two-pane layout only.
- Reduce top padding on app detail page
- Update screenshots
- Add install/update selected apps button to multi-select actions menu that reuses existing obtain dialog logic.
- Remove back buttons from additional options, import URL list, and
app logs pages. Keep close button in two-pane layout only.
- Reduce top padding on app detail page
- Update screenshots
- Memoize findStandardFormatsForVersion with bounded 4096-entry cache,
and deduplicate the 436 generated version regex patterns. This
collapses the per-GitHub-app sort from ~500K regex evaluations to
~100, and caches results across all version reconciliation calls.
- Optimize GitHub _sortGitHubReleases: date sort (the default) now
skips regex computation entirely; smartname sorts precompute formats
once per release instead of re-evaluating per sort-comparison pair.
- Inline app list computation into AppsPage.build() instead of using
a three-layer caching system (context.select, pipelineSignature,
_computeListData). With memoization making rebuilds ~2ms, the
complexity of signature hashing and cache field management is
unnecessary.
- Cache getAppsDir() to avoid redundant platform-channel calls per
app during saveApps batches.
- Improved update check UI performance (#3043)
- Improved app list loading UI (#2666)
- Other minor UI tweaks
- Improve install result detection for external installers in foreground
- Prevent background retry tasks from spawning duplicate install tasks; only the initial check runs the install phase
- Return all install-capable activities per app for external installer selection (#3067)