- 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
- 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
- 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
When selecting a result from the search dialog, runSearch() passed the
source's translated display name as overrideSource, but getSource()
matches against sourceIdentifier (the Dart class name). Since many
sources now use tr() for their name, these values don't match (e.g.
"F-Droid" vs "FDroid", "Forgejo (Codeberg)" vs "Codeberg"), causing
getSource() to throw UnsupportedURLError silently, which set pickedSource
to null and disabled the Add button with no error feedback.
This is the same kind of fix as a5aa5212 which addressed the override
dropdown.
- Replace hardcoded English source names with tr() in 8 app_sources
- Add huaweiAppGallery & telegramApp keys across all locale files
- Translate the English placeholder text into Chinese in zh.json
- Optimize Chinese punctuation and typography in zh.json
- Add Dhizuku to Shizuku-related strings in zh.json
- Lower two-pane layout threshold from 900dp to 600dp so portrait
tablets also get the side-by-side apps + detail layout
- Move Add FAB from rail leading (top) to trailing (bottom) with a
stable spacer when hidden so center-aligned destinations don't jump
- Replace Add FAB with Actions FAB in same position during selection
mode, mirroring the mobile FAB-swap behavior
- Suppress AppsPage's own Actions FAB in two-pane mode so it doesn't
duplicate the rail's FAB
- Clear selection state when switching away from the apps page so the
Add FAB reappears and the Actions FAB goes away on return
- Center-align rail destinations on tablets per M3 Expressive guidelines
- apps.dart: cache filtered/sorted/grouped app list results keyed by
pipeline signature, avoiding O(n) recomputation on every rebuild
when only progress ticks or selection changes fire
- add_app.dart: skip parent rebuild when URL text changes without
switching the detected source; track _urlValid separately so the
Add button correctly enables/disables; _prevValid prevents early
return from skipping setState when validity flips
- generated_form_renderer.dart: replace broken validateTextField
which couldn't find TextFormField inside TypeAheadField wrappers
with a _fieldKeys list for direct FormFieldState.isValid checks
- apps_provider_lifecycle.dart: preload app icons from disk cache
after initial loadApps() so scrolling never triggers disk I/O