Share/pick/sync calls and streams no longer throw MissingPluginException at
startup; upload/download/sync-now show 'X isn't available on this platform
yet'. Offline/sync mirror dir no longer uses the Android-only external dir.
Info.plist: Face ID and photo library usage strings.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Consolidates duplicated GET/PUT/notification-channel logic across
DownloadService/ShareUploadService/SyncEngine into shared Kotlin helpers,
gives upload/download real batch queueing instead of dropping a second
concurrent batch, and dedupes repeated Dart channel-argument boilerplate.
Replaces the 2300+ line ServerProvider god object with ten focused
ChangeNotifiers (SessionController, SettingsController, FilesController,
PhotosController, FavoritesController, TrashController, SharesController,
RecentController, SyncStatusController, PickController) plus ItemOperations,
a plain coordinator for cross-domain item mutations - fixing the coupling
where device-sync status, per-tab data, and global UI prefs all lived in
one object. Updates every view/widget call site accordingly and refreshes
the architecture/server/standards/styling docs to match.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- WebDAV MOVE/COPY-backed copy/move for files and folders, with a
destination picker (independent nav state so it doesn't disturb the
Files tab's browsing position) and a conflict-resolution sheet
(overwrite all / keep both / decide per item).
- Downloads now use the same foreground-service + notification approach
as uploads, surviving app closure.
- Favorites is now its own tab (account-wide, via a WebDAV SEARCH query)
instead of a Files-tab filter toggle, which couldn't represent
favorited items outside the currently browsed folder correctly.
- Share sheet restyled to match the app's design language, plus a
"share file directly" action via the OS share sheet; details sheet
tab icons resized to match the bottom nav.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>