Added
- Per-Thread Speed Telemetry & Multi-Threading Progress Section: Added real-time per-thread transfer speed metrics and active thread breakdown to the file transfer progress dialogs across all 4 browser implementations (
FileBrowserActivity,NetworkBrowserActivity,TabbedBrowserActivity, andTwinWindowActivity). Displays live average throughput per thread and an active thread grid dynamically populated based on the user's configured thread count (1, 2, 4, 6, or 8 threads). - Canonical UFMStandard Transfer Threads Dialog: Migrated the Settings multi-threading dialog from stock platform single-choice dialogs to custom Mobile and Android TV glass layouts (
dialog_network_transfer_threads.xmlanddialog_network_transfer_threads_tv.xml) with frosted lightning hero badge, technical performance descriptions per option, checkmark indicators, and D-pad focus handling. - Native Linux Companion App (
UFM-Linux/): Native Linux desktop companion built with Tauri 2, Rust, and React 19 for Wayland and X11 desktops (#45). - Wayland-First Integration: Stable
app_id(za.kilowatch.ufm-companion) for tiling compositors (Sway, Hyprland, Niri), native decorations, and XDG desktop portal integration. - Standalone AppImage & Deb Packaging: Standalone
.AppImageand.debpackaging with an Ubuntu 22.04 glibc 2.35 baseline. - Native Rust Core Engine: Multi-NIC UDP broadcast LAN discovery, TLS TOFU SHA-256 certificate fingerprint pinning, and streaming transfer buffers implemented in the Linux companion Rust backend (
UFM-Linux/src-tauri). - Automated Linux CI/CD Workflow: GitHub Actions build workflow (
.github/workflows/linux-companion.yml) for Linux companion compilation, tests, and release asset generation. - Restored Windows Companion Backend: Restored Windows desktop companion Rust backend (
UFM-Windows/src-tauri/).
Changed
- Multi-Threading Settings Title Extended to SMB: Updated Settings title and backup descriptor from "FTP & SFTP Multi-threading" to "FTP, SFTP & SMB Multi-threading" to reflect parallel segmented transfer and multi-worker engine support across SMB shares. Automatically cleaned stale keys from all 17 non-English translation files.
- Transfer Progress Dialog UFMStandard Compliance: Standardized
dialog_transfer_progress.xmlanddialog_transfer_progress_tv.xmlwith frosted hero badges (bg_btn_icon_frosted) and embedded Cancel buttons, eliminating stock platform dialog buttons. MigratedFileBrowserActivityfrom programmatic dialog views to the canonical layout. - Folder Sync & Advanced Sync Android TV Layouts: Modernized Android TV layouts to adhere to UFMStandard:
- Reduced profile card height by 50% (~84dp) with 44dp frosted icon containers, inline schedule badges, and horizontal source-to-destination route lines.
- Standardized TV header bar (64dp) and safe padding (32dp), eliminating oversized 120dp margins and bloated empty states.
- Rebuilt Sync and Advanced Sync TV edit screens into two-column widescreen forms with horizontal segmented button rows, replacing 1,700px wide stretched single columns.
- Polished TV action dialogs with standard yellow primary action buttons and clean spacing.
Fixed
- Instant Sync Watcher Startup Main Thread Blocked ANR (
UfmApplication,InstantSyncWatcher,AdvancedSyncProfileRepository): Resolved a cold-start ANR ("Main thread blocked >5000ms") on Android TV and mobile devices (reported on a Changhong AI PONT DE, Android 14 / SDK 34, app 2.1.6-GOOGLE). During application cold start,InstantSyncWatcher.rewatchAll()was invoked synchronously on the main thread looper inUfmApplication.onCreate()after the ANR watchdog had armed. InrewatchAll(),AdvancedSyncProfileRepository.getInstance()readadvanced_sync_profiles.jsonfrom flash storage while storage and startup indexing were spinning up under heavy cold-start I/O contention, followed by synchronousFile.canonicalPathresolution and directoryexists()/isDirectory()stat queries across enabled profiles during watcher registration. OffloadedInstantSyncWatcher.rewatchAll(), WorkManager daily Recycle Bin cleanup scheduling, andReviewPrefs.init()fromonCreate()to the background daemon threadufm-startup-io. In addition, guardedInstantSyncWatcher.rewatchAll()to automatically dispatch to a background daemon thread (ufm-instantsync-init) if invoked on the main looper, synchronizedInstantSyncWatchermap state (watchers,watchPaths,debounceHandlers,debounceRunnables,pendingTriggers) andAdvancedSyncProfileRepositoryprofile mutations against concurrent access, and ensured debounced trigger execution runs asynchronously on the I/O dispatcher. - Advanced Sync Android TV Size Unit Button ClassCastException (
AdvancedSyncEditActivity): Fixed an uncaughtjava.lang.ClassCastException: com.google.android.material.button.MaterialButton cannot be cast to com.google.android.material.button.MaterialButtonToggleGroupcrash (java.lang.RuntimeException: Unable to start activity ... AdvancedSyncEditActivity) on Android TV devices (e.g. Xiaomi MIBOX4, SDK 31) when opening the Advanced Sync profile edit screen. In the Android TV widescreen layout (activity_advanced_sync_edit_tv.xml),toggleMinSizeUnitandtoggleMaxSizeUnitare standard compactButtonwidgets styled for D-pad navigation rather than mobileMaterialButtonToggleGroupcontainers. Updated property declarations toView?, added D-pad click listeners to cycle units between MB and GB on press, and harmonized profile loading and saving to evaluate unit state across both mobile and TV layouts. - Linux AppImage Blank Window (
Could not connect to localhost: Connection refused): The published Linux companion AppImage/deb were built as Tauri development binaries with no embedded frontend assets, so the webview tried to load the Vite dev server (http://localhost:1420,build.devUrl) and showed a blank WebKit error page for end users. Linux companion releases are now built withtauri buildin GitHub Actions, and the pipeline runsUFM-Linux/scripts/verify-appimage.sh, which fails the build if the production frontend bundle is not embedded. - Linux Companion Drag & Drop / File Picker: Fixed APK/XAPK sideloading on Linux where Tauri intercepts OS file drops and WebKitGTK does not expose real file paths through the DOM (
File.pathis empty). Drag & drop now uses the Tauri webview drag-drop events (onDragDropEvent, absolutepaths), and the browse action uses the native@tauri-apps/plugin-dialogpicker (XDG portal friendly on Wayland). - Linux Companion AppImage Verifier (CI): The
UFM-Linux/scripts/verify-appimage.shguard added with the embedded-assets fix could never pass: it looked for a hard-coded payload binary name (ufm-companion) thattauri builddoes not produce (the payload is the Cargo binary,ufm-linux), and itsstrings | grep -qcheck aborted itself underset -o pipefail(the upstreamstringsdies with SIGPIPE oncegrepfinds a match). The verifier now discovers the payload binary by inspection and checks the extracted strings safely, so it reliably rejects dev builds and accepts production builds.